From 2207f553c1dc9ba4bc28717bdc80f7df4da99207 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Wed, 13 Mar 2024 11:41:57 +1100 Subject: [PATCH 01/85] integration: set up `x/btcstkconsumer` module (#206) --- app/app.go | 43 +- go.mod | 14 + go.sum | 43 ++ proto/babylon/btcstkconsumer/genesis.proto | 17 + proto/babylon/btcstkconsumer/params.proto | 15 + proto/babylon/btcstkconsumer/query.proto | 29 + proto/babylon/btcstkconsumer/tx.proto | 40 ++ proto/babylon/zoneconcierge/v1/tx.proto | 32 +- proto/buf.lock | 10 + proto/buf.yaml | 1 + testutil/keeper/btcstaking.go | 34 +- testutil/keeper/btcstkconsumer.go | 52 ++ tools/tools.go | 14 + x/btcstaking/genesis_test.go | 2 +- x/btcstaking/keeper/btc_height_index_test.go | 2 +- x/btcstaking/keeper/grpc_query_test.go | 16 +- x/btcstaking/keeper/keeper.go | 3 + x/btcstaking/keeper/keeper_test.go | 37 +- x/btcstaking/keeper/params_test.go | 6 +- x/btcstaking/keeper/query_params_test.go | 4 +- x/btcstaking/types/expected_keepers.go | 2 + x/btcstaking/types/mocked_keepers.go | 23 + x/btcstkconsumer/abci.go | 23 + x/btcstkconsumer/genesis.go | 23 + x/btcstkconsumer/keeper/keeper.go | 53 ++ x/btcstkconsumer/keeper/msg_server.go | 17 + x/btcstkconsumer/keeper/msg_server_test.go | 24 + x/btcstkconsumer/keeper/msg_update_params.go | 23 + .../keeper/msg_update_params_test.go | 64 ++ x/btcstkconsumer/keeper/params.go | 33 + x/btcstkconsumer/keeper/params_test.go | 18 + x/btcstkconsumer/keeper/query.go | 7 + x/btcstkconsumer/keeper/query_params.go | 20 + x/btcstkconsumer/keeper/query_params_test.go | 20 + x/btcstkconsumer/module.go | 173 +++++ x/btcstkconsumer/types/codec.go | 19 + x/btcstkconsumer/types/errors.go | 13 + x/btcstkconsumer/types/expected_keepers.go | 25 + x/btcstkconsumer/types/genesis.go | 17 + x/btcstkconsumer/types/genesis.pb.go | 326 ++++++++++ x/btcstkconsumer/types/genesis_test.go | 37 ++ x/btcstkconsumer/types/keys.go | 23 + x/btcstkconsumer/types/msg_update_params.go | 21 + x/btcstkconsumer/types/params.go | 32 + x/btcstkconsumer/types/params.pb.go | 291 +++++++++ x/btcstkconsumer/types/query.pb.go | 539 ++++++++++++++++ x/btcstkconsumer/types/query.pb.gw.go | 153 +++++ x/btcstkconsumer/types/tx.pb.go | 598 ++++++++++++++++++ x/btcstkconsumer/types/types.go | 1 + 49 files changed, 2967 insertions(+), 65 deletions(-) create mode 100644 proto/babylon/btcstkconsumer/genesis.proto create mode 100644 proto/babylon/btcstkconsumer/params.proto create mode 100644 proto/babylon/btcstkconsumer/query.proto create mode 100644 proto/babylon/btcstkconsumer/tx.proto create mode 100644 testutil/keeper/btcstkconsumer.go create mode 100644 tools/tools.go create mode 100644 x/btcstkconsumer/abci.go create mode 100644 x/btcstkconsumer/genesis.go create mode 100644 x/btcstkconsumer/keeper/keeper.go create mode 100644 x/btcstkconsumer/keeper/msg_server.go create mode 100644 x/btcstkconsumer/keeper/msg_server_test.go create mode 100644 x/btcstkconsumer/keeper/msg_update_params.go create mode 100644 x/btcstkconsumer/keeper/msg_update_params_test.go create mode 100644 x/btcstkconsumer/keeper/params.go create mode 100644 x/btcstkconsumer/keeper/params_test.go create mode 100644 x/btcstkconsumer/keeper/query.go create mode 100644 x/btcstkconsumer/keeper/query_params.go create mode 100644 x/btcstkconsumer/keeper/query_params_test.go create mode 100644 x/btcstkconsumer/module.go create mode 100644 x/btcstkconsumer/types/codec.go create mode 100644 x/btcstkconsumer/types/errors.go create mode 100644 x/btcstkconsumer/types/expected_keepers.go create mode 100644 x/btcstkconsumer/types/genesis.go create mode 100644 x/btcstkconsumer/types/genesis.pb.go create mode 100644 x/btcstkconsumer/types/genesis_test.go create mode 100644 x/btcstkconsumer/types/keys.go create mode 100644 x/btcstkconsumer/types/msg_update_params.go create mode 100644 x/btcstkconsumer/types/params.go create mode 100644 x/btcstkconsumer/types/params.pb.go create mode 100644 x/btcstkconsumer/types/query.pb.go create mode 100644 x/btcstkconsumer/types/query.pb.gw.go create mode 100644 x/btcstkconsumer/types/tx.pb.go create mode 100644 x/btcstkconsumer/types/types.go diff --git a/app/app.go b/app/app.go index d83795c73..8b1a411fb 100644 --- a/app/app.go +++ b/app/app.go @@ -128,6 +128,9 @@ import ( "github.com/babylonchain/babylon/x/btcstaking" btcstakingkeeper "github.com/babylonchain/babylon/x/btcstaking/keeper" btcstakingtypes "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/babylonchain/babylon/x/btcstkconsumer" + bsckeeper "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" + bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" "github.com/babylonchain/babylon/x/checkpointing" checkpointingkeeper "github.com/babylonchain/babylon/x/checkpointing/keeper" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" @@ -243,10 +246,13 @@ type BabylonApp struct { MonitorKeeper monitorkeeper.Keeper // IBC-related modules - IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly - IBCFeeKeeper ibcfeekeeper.Keeper // for relayer incentivization - https://github.com/cosmos/ibc/tree/main/spec/app/ics-029-fee-payment - TransferKeeper ibctransferkeeper.Keeper // for cross-chain fungible token transfers - ZoneConciergeKeeper zckeeper.Keeper // for cross-chain fungible token transfers + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + IBCFeeKeeper ibcfeekeeper.Keeper // for relayer incentivization - https://github.com/cosmos/ibc/tree/main/spec/app/ics-029-fee-payment + TransferKeeper ibctransferkeeper.Keeper // for cross-chain fungible token transfers + + // Integration-related modules + BTCStkConsumerKeeper bsckeeper.Keeper + ZoneConciergeKeeper zckeeper.Keeper // BTC staking related modules BTCStakingKeeper btcstakingkeeper.Keeper @@ -327,6 +333,8 @@ func NewBabylonApp( ibcexported.StoreKey, ibctransfertypes.StoreKey, ibcfeetypes.StoreKey, + // Integration related modules + bsctypes.StoreKey, zctypes.StoreKey, // BTC staking related modules btcstakingtypes.StoreKey, @@ -625,6 +633,14 @@ func NewBabylonApp( app.IBCKeeper.PortKeeper, app.AccountKeeper, app.BankKeeper, ) + app.BTCStkConsumerKeeper = bsckeeper.NewKeeper( + appCodec, + runtime.NewKVStoreService(keys[bsctypes.StoreKey]), + app.AccountKeeper, + app.BankKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + zcKeeper := zckeeper.NewKeeper( appCodec, runtime.NewKVStoreService(keys[zctypes.StoreKey]), @@ -687,6 +703,7 @@ func NewBabylonApp( &btclightclientKeeper, &btcCheckpointKeeper, &checkpointingKeeper, + &app.BTCStkConsumerKeeper, btcNetParams, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) @@ -694,8 +711,8 @@ func NewBabylonApp( app.FinalityKeeper = finalitykeeper.NewKeeper( appCodec, runtime.NewKVStoreService(keys[finalitytypes.StoreKey]), - app.BTCStakingKeeper, - app.IncentiveKeeper, + &app.BTCStakingKeeper, + &app.IncentiveKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) @@ -809,6 +826,8 @@ func NewBabylonApp( btccheckpoint.NewAppModule(appCodec, app.BtcCheckpointKeeper), checkpointing.NewAppModule(appCodec, app.CheckpointingKeeper), monitor.NewAppModule(appCodec, app.MonitorKeeper), + // Babylon modules - integration + btcstkconsumer.NewAppModule(appCodec, app.BTCStkConsumerKeeper, app.AccountKeeper, app.BankKeeper), zoneconcierge.NewAppModule(appCodec, app.ZoneConciergeKeeper, app.AccountKeeper, app.BankKeeper), // Babylon modules - btc staking btcstaking.NewAppModule(appCodec, app.BTCStakingKeeper), @@ -863,9 +882,11 @@ func NewBabylonApp( // IBC-related modules ibcexported.ModuleName, ibctransfertypes.ModuleName, - zctypes.ModuleName, ibcfeetypes.ModuleName, wasmtypes.ModuleName, + // Integration related modules + bsctypes.ModuleName, + zctypes.ModuleName, // BTC staking related modules btcstakingtypes.ModuleName, finalitytypes.ModuleName, @@ -891,9 +912,11 @@ func NewBabylonApp( // IBC-related modules ibcexported.ModuleName, ibctransfertypes.ModuleName, - zctypes.ModuleName, ibcfeetypes.ModuleName, wasmtypes.ModuleName, + // Integration related modules + bsctypes.ModuleName, + zctypes.ModuleName, // BTC staking related modules btcstakingtypes.ModuleName, finalitytypes.ModuleName, @@ -923,9 +946,11 @@ func NewBabylonApp( // IBC-related modules ibcexported.ModuleName, ibctransfertypes.ModuleName, - zctypes.ModuleName, ibcfeetypes.ModuleName, wasmtypes.ModuleName, + // Integration related modules + bsctypes.ModuleName, + zctypes.ModuleName, // BTC staking related modules btcstakingtypes.ModuleName, finalitytypes.ModuleName, diff --git a/go.mod b/go.mod index 978f302be..5112e46da 100644 --- a/go.mod +++ b/go.mod @@ -151,6 +151,8 @@ require ( github.com/aws/aws-sdk-go v1.44.312 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/bufbuild/connect-go v1.5.2 // indirect + github.com/bufbuild/protocompile v0.6.0 // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect @@ -164,6 +166,7 @@ require ( github.com/containerd/continuity v0.3.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/creachadair/atomicfile v0.3.1 // indirect github.com/creachadair/tomledit v0.0.24 // indirect @@ -171,12 +174,15 @@ require ( github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect github.com/distribution/reference v0.5.0 // indirect github.com/docker/cli v23.0.1+incompatible // indirect + github.com/docker/distribution v2.8.1+incompatible // indirect + github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/dot v1.6.1 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect github.com/ethereum/go-ethereum v1.13.14 // indirect github.com/fatih/color v1.15.0 // indirect + github.com/felixge/fgprof v0.9.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-logr/logr v1.4.1 // indirect @@ -186,7 +192,9 @@ require ( github.com/golang/glog v1.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-containerregistry v0.13.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect @@ -203,8 +211,10 @@ require ( github.com/huandu/skiplist v1.2.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.13 // indirect + github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 // indirect + github.com/klauspost/pgzip v1.2.5 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/linxGnu/grocksdb v1.8.14 // indirect @@ -214,14 +224,18 @@ require ( github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect + github.com/morikuni/aec v1.0.0 // indirect github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect github.com/oklog/run v1.1.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2 // indirect github.com/opencontainers/runc v1.1.5 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect + github.com/pkg/profile v1.7.0 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/rs/zerolog v1.32.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect diff --git a/go.sum b/go.sum index aac30481a..fc46feea5 100644 --- a/go.sum +++ b/go.sum @@ -315,6 +315,10 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/bufbuild/buf v1.15.1 h1:v7sK2uMEsGX4Z2hvu+xiMheH3C3AKBGfxPBgdUZYDQ8= +github.com/bufbuild/buf v1.15.1/go.mod h1:TQeGKam1QMfHy/xsSnnMpxN3JK5HBb6aNvZj4m52gkE= +github.com/bufbuild/connect-go v1.5.2 h1:G4EZd5gF1U1ZhhbVJXplbuUnfKpBZ5j5izqIwu2g2W8= +github.com/bufbuild/connect-go v1.5.2/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk= github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= @@ -389,6 +393,8 @@ github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5U github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/containerd/stargz-snapshotter/estargz v0.12.1 h1:+7nYmHJb0tEkcRaAW+MHqoKaJYZmkikupxCqVtmPuY0= +github.com/containerd/stargz-snapshotter/estargz v0.12.1/go.mod h1:12VUuCq3qPq4y8yUW+l5w3+oXV3cx2Po3KSe/SmPGqw= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -427,6 +433,7 @@ github.com/cosmos/relayer/v2 v2.5.1 h1:gYYD/xywc0Lw3957NmWuyJr9idKQmhgVuVoLIiBNY github.com/cosmos/relayer/v2 v2.5.1/go.mod h1:KygWPbGY9ley9Q42CMg5uzmrf4BIe+EfxU5j44xrLRQ= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= @@ -470,8 +477,12 @@ github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy13Ul2Q5oM= github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v23.0.8+incompatible h1:z4ZCIwfqHgOEwhxmAWugSL1PFtPQmLP60EVhJYJPaX8= github.com/docker/docker v23.0.8+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= +github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -510,6 +521,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= +github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -529,11 +542,14 @@ github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2Gihuqh github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= +github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -586,6 +602,8 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= +github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= @@ -655,6 +673,8 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-containerregistry v0.13.0 h1:y1C7Z3e149OJbOPDBxLYR8ITPz8dTKqQwjErKVHJC8k= +github.com/google/go-containerregistry v0.13.0/go.mod h1:J9FQ+eSS4a1aC2GNZxvNpbWhgp0487v+cgiilB4FqDo= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -682,6 +702,9 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10 h1:CqYfpuYIjnlNxM3msdyPRKabhXZWbKjf3Q8BWROFBso= +github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -732,6 +755,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -796,6 +821,7 @@ github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSAS github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= @@ -804,6 +830,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84 h1:2uT3aivO7NVpUPGcQX7RbHijHMyWix/yCnIrCWc+5co= +github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= @@ -850,6 +878,8 @@ github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ib github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -928,6 +958,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= @@ -1005,12 +1037,16 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= +github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1068,6 +1104,7 @@ github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= @@ -1173,6 +1210,8 @@ github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vulpine-io/io-test v1.0.0 h1:Ot8vMh+ssm1VWDAwJ3U4C5qG9aRnr5YfQFZPNZBAUGI= @@ -1228,6 +1267,8 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= @@ -1481,6 +1522,7 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1490,6 +1532,7 @@ golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/proto/babylon/btcstkconsumer/genesis.proto b/proto/babylon/btcstkconsumer/genesis.proto new file mode 100644 index 000000000..704508243 --- /dev/null +++ b/proto/babylon/btcstkconsumer/genesis.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; +package babylon.btcstkconsumer; + +import "amino/amino.proto"; +import "gogoproto/gogo.proto"; +import "babylon/btcstkconsumer/params.proto"; + +option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; + +// GenesisState defines the btcstkconsumer module's genesis state. +message GenesisState { + // params defines all the parameters of the module. + Params params = 1 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; +} diff --git a/proto/babylon/btcstkconsumer/params.proto b/proto/babylon/btcstkconsumer/params.proto new file mode 100644 index 000000000..a41c635ed --- /dev/null +++ b/proto/babylon/btcstkconsumer/params.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; +package babylon.btcstkconsumer; + +import "amino/amino.proto"; +import "gogoproto/gogo.proto"; + +option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; + +// Params defines the parameters for the module. +message Params { + option (amino.name) = "babylon/x/btcstkconsumer/Params"; + option (gogoproto.equal) = true; + + +} \ No newline at end of file diff --git a/proto/babylon/btcstkconsumer/query.proto b/proto/babylon/btcstkconsumer/query.proto new file mode 100644 index 000000000..5279227b7 --- /dev/null +++ b/proto/babylon/btcstkconsumer/query.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; +package babylon.btcstkconsumer; + +import "amino/amino.proto"; +import "gogoproto/gogo.proto"; +import "google/api/annotations.proto"; +import "babylon/btcstkconsumer/params.proto"; + +option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; + +// Query defines the gRPC querier service. +service Query { + // Parameters queries the parameters of the module. + rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { + option (google.api.http).get = "/babylonchain/babylon/btcstkconsumer/params"; + } +} + +// QueryParamsRequest is request type for the Query/Params RPC method. +message QueryParamsRequest {} + +// QueryParamsResponse is response type for the Query/Params RPC method. +message QueryParamsResponse { + // params holds all the parameters of this module. + Params params = 1 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; +} \ No newline at end of file diff --git a/proto/babylon/btcstkconsumer/tx.proto b/proto/babylon/btcstkconsumer/tx.proto new file mode 100644 index 000000000..fb841fe41 --- /dev/null +++ b/proto/babylon/btcstkconsumer/tx.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; +package babylon.btcstkconsumer; + +import "amino/amino.proto"; +import "cosmos/msg/v1/msg.proto"; +import "cosmos_proto/cosmos.proto"; +import "gogoproto/gogo.proto"; +import "babylon/btcstkconsumer/params.proto"; + +option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; + +// Msg defines the Msg service. +service Msg { + option (cosmos.msg.v1.service) = true; + + // UpdateParams defines a (governance) operation for updating the module + // parameters. The authority defaults to the x/gov module account. + rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); +} + +// MsgUpdateParams is the Msg/UpdateParams request type. +message MsgUpdateParams { + option (cosmos.msg.v1.signer) = "authority"; + option (amino.name) = "babylon/x/btcstkconsumer/MsgUpdateParams"; + + // authority is the address that controls the module (defaults to x/gov unless overwritten). + string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // params defines the module parameters to update. + // + // NOTE: All parameters must be supplied. + Params params = 2 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; +} + +// MsgUpdateParamsResponse defines the response structure for executing a +// MsgUpdateParams message. +message MsgUpdateParamsResponse {} \ No newline at end of file diff --git a/proto/babylon/zoneconcierge/v1/tx.proto b/proto/babylon/zoneconcierge/v1/tx.proto index 105a29107..b44c332b2 100644 --- a/proto/babylon/zoneconcierge/v1/tx.proto +++ b/proto/babylon/zoneconcierge/v1/tx.proto @@ -19,19 +19,19 @@ service Msg { // MsgUpdateParams defines a message for updating zoneconcierge module parameters. message MsgUpdateParams { - option (cosmos.msg.v1.signer) = "authority"; - - // authority is the address of the governance account. - // just FYI: cosmos.AddressString marks that this field should use type alias - // for AddressString instead of string, but the functionality is not yet implemented - // in cosmos-proto - string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - - // params defines the zoneconcierge parameters to update. - // - // NOTE: All parameters must be supplied. - Params params = 2 [(gogoproto.nullable) = false]; - } - - // MsgUpdateParamsResponse is the response to the MsgUpdateParams message. - message MsgUpdateParamsResponse {} + option (cosmos.msg.v1.signer) = "authority"; + + // authority is the address of the governance account. + // just FYI: cosmos.AddressString marks that this field should use type alias + // for AddressString instead of string, but the functionality is not yet implemented + // in cosmos-proto + string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // params defines the zoneconcierge parameters to update. + // + // NOTE: All parameters must be supplied. + Params params = 2 [(gogoproto.nullable) = false]; +} + +// MsgUpdateParamsResponse is the response to the MsgUpdateParams message. +message MsgUpdateParamsResponse {} diff --git a/proto/buf.lock b/proto/buf.lock index bdb2a63ae..3cbca79b9 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -16,6 +16,16 @@ deps: repository: gogo-proto commit: 34d970b699f84aa382f3c29773a60836 digest: shake256:3d3bee5229ba579e7d19ffe6e140986a228b48a8c7fe74348f308537ab95e9135210e81812489d42cd8941d33ff71f11583174ccc5972e86e6112924b6ce9f04 + - remote: buf.build + owner: cosmos + repository: ibc + commit: b32ecf3ebbcb45f3b727ae95d9ea317d + digest: shake256:0010f681e8a1b37d5331dbd93fa07486572caaea564137fa040438e81c99b7f516adcef4991752972331771d95e757b794c4f28ffcd0f6c832f0793f8089f30d + - remote: buf.build + owner: cosmos + repository: ics23 + commit: 55085f7c710a45f58fa09947208eb70b + digest: shake256:9bf0bc495b5a11c88d163d39ef521bc4b00bc1374a05758c91d82821bdc61f09e8c2c51dda8452529bf80137f34d852561eacbe9550a59015d51cecb0dacb628 - remote: buf.build owner: googleapis repository: googleapis diff --git a/proto/buf.yaml b/proto/buf.yaml index 2db8cfc68..de76aba44 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -5,6 +5,7 @@ deps: - buf.build/cosmos/cosmos-proto:1935555c206d4afb9e94615dfd0fad31 - buf.build/cosmos/gogo-proto:a14993478f40695898ed8a86931094b6656e8a5d - buf.build/googleapis/googleapis:8d7204855ec14631a499bd7393ce1970 + - buf.build/cosmos/ibc breaking: use: - FILE diff --git a/testutil/keeper/btcstaking.go b/testutil/keeper/btcstaking.go index 4402aa477..7b0870bed 100644 --- a/testutil/keeper/btcstaking.go +++ b/testutil/keeper/btcstaking.go @@ -8,6 +8,10 @@ import ( "cosmossdk.io/store" storemetrics "cosmossdk.io/store/metrics" storetypes "cosmossdk.io/store/types" + "github.com/babylonchain/babylon/x/btcstaking/keeper" + "github.com/babylonchain/babylon/x/btcstaking/types" + bsckeeper "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" + bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" "github.com/btcsuite/btcd/chaincfg" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" dbm "github.com/cosmos/cosmos-db" @@ -18,9 +22,6 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/stretchr/testify/require" - - "github.com/babylonchain/babylon/x/btcstaking/keeper" - "github.com/babylonchain/babylon/x/btcstaking/types" ) func BTCStakingKeeper( @@ -28,23 +29,38 @@ func BTCStakingKeeper( btclcKeeper types.BTCLightClientKeeper, btccKeeper types.BtcCheckpointKeeper, ckptKeeper types.CheckpointingKeeper, -) (*keeper.Keeper, sdk.Context) { - storeKey := storetypes.NewKVStoreKey(types.StoreKey) - +) (*keeper.Keeper, *bsckeeper.Keeper, sdk.Context) { db := dbm.NewMemDB() stateStore := store.NewCommitMultiStore(db, log.NewTestLogger(t), storemetrics.NewNoOpMetrics()) - stateStore.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, db) - require.NoError(t, stateStore.LoadLatestVersion()) registry := codectypes.NewInterfaceRegistry() cdc := codec.NewProtoCodec(registry) + // mount KV store for BTC staking consumer keeper + bscStoreKey := storetypes.NewKVStoreKey(bsctypes.StoreKey) + stateStore.MountStoreWithDB(bscStoreKey, storetypes.StoreTypeIAVL, db) + require.NoError(t, stateStore.LoadLatestVersion()) + // create BTC staking consumer keeper + bscKeeper := bsckeeper.NewKeeper( + cdc, + runtime.NewKVStoreService(bscStoreKey), + nil, + nil, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + + // mount KV store for BTC staking keeper + storeKey := storetypes.NewKVStoreKey(types.StoreKey) + stateStore.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, db) + require.NoError(t, stateStore.LoadLatestVersion()) + k := keeper.NewKeeper( cdc, runtime.NewKVStoreService(storeKey), btclcKeeper, btccKeeper, ckptKeeper, + bscKeeper, &chaincfg.SimNetParams, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) @@ -57,5 +73,5 @@ func BTCStakingKeeper( panic(err) } - return &k, ctx + return &k, &bscKeeper, ctx } diff --git a/testutil/keeper/btcstkconsumer.go b/testutil/keeper/btcstkconsumer.go new file mode 100644 index 000000000..3da4dd9a9 --- /dev/null +++ b/testutil/keeper/btcstkconsumer.go @@ -0,0 +1,52 @@ +package keeper + +import ( + "testing" + + "cosmossdk.io/log" + "cosmossdk.io/store" + "cosmossdk.io/store/metrics" + storetypes "cosmossdk.io/store/types" + cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" + dbm "github.com/cosmos/cosmos-db" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/runtime" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/stretchr/testify/require" + + "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func BTCStkConsumerKeeper(t testing.TB) (keeper.Keeper, sdk.Context) { + storeKey := storetypes.NewKVStoreKey(types.StoreKey) + + db := dbm.NewMemDB() + stateStore := store.NewCommitMultiStore(db, log.NewNopLogger(), metrics.NewNoOpMetrics()) + stateStore.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, db) + require.NoError(t, stateStore.LoadLatestVersion()) + + registry := codectypes.NewInterfaceRegistry() + cdc := codec.NewProtoCodec(registry) + authority := authtypes.NewModuleAddress(govtypes.ModuleName) + + k := keeper.NewKeeper( + cdc, + runtime.NewKVStoreService(storeKey), + nil, + nil, + authority.String(), + ) + + ctx := sdk.NewContext(stateStore, cmtproto.Header{}, false, log.NewNopLogger()) + + // Initialize params + if err := k.SetParams(ctx, types.DefaultParams()); err != nil { + panic(err) + } + + return k, ctx +} diff --git a/tools/tools.go b/tools/tools.go new file mode 100644 index 000000000..e668aaa92 --- /dev/null +++ b/tools/tools.go @@ -0,0 +1,14 @@ +//go:build tools + +package tools + +import ( + _ "github.com/bufbuild/buf/cmd/buf" + _ "github.com/cosmos/gogoproto/protoc-gen-gocosmos" + _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" + _ "google.golang.org/protobuf/cmd/protoc-gen-go" + _ "github.com/cosmos/cosmos-proto/cmd/protoc-gen-go-pulsar" + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway" + _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2" + _ "golang.org/x/tools/cmd/goimports" +) diff --git a/x/btcstaking/genesis_test.go b/x/btcstaking/genesis_test.go index 357ccfe0d..70e2839f4 100644 --- a/x/btcstaking/genesis_test.go +++ b/x/btcstaking/genesis_test.go @@ -16,7 +16,7 @@ func TestGenesis(t *testing.T) { Params: []*types.Params{&p}, } - k, ctx := keepertest.BTCStakingKeeper(t, nil, nil, nil) + k, _, ctx := keepertest.BTCStakingKeeper(t, nil, nil, nil) btcstaking.InitGenesis(ctx, *k, genesisState) got := btcstaking.ExportGenesis(ctx, *k) require.NotNil(t, got) diff --git a/x/btcstaking/keeper/btc_height_index_test.go b/x/btcstaking/keeper/btc_height_index_test.go index 819e92dd3..e97b8d6cd 100644 --- a/x/btcstaking/keeper/btc_height_index_test.go +++ b/x/btcstaking/keeper/btc_height_index_test.go @@ -22,7 +22,7 @@ func FuzzBTCHeightIndex(f *testing.F) { // mock BTC light client btclcKeeper := types.NewMockBTCLightClientKeeper(ctrl) - keeper, ctx := keepertest.BTCStakingKeeper(t, btclcKeeper, nil, nil) + keeper, _, ctx := keepertest.BTCStakingKeeper(t, btclcKeeper, nil, nil) // randomise Babylon height and BTC height babylonHeight := datagen.RandomInt(r, 100) diff --git a/x/btcstaking/keeper/grpc_query_test.go b/x/btcstaking/keeper/grpc_query_test.go index 661836a97..de17e61a3 100644 --- a/x/btcstaking/keeper/grpc_query_test.go +++ b/x/btcstaking/keeper/grpc_query_test.go @@ -26,7 +26,7 @@ func FuzzActivatedHeight(f *testing.F) { r := rand.New(rand.NewSource(seed)) // Setup keeper and context - keeper, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) ctx = sdk.UnwrapSDKContext(ctx) // not activated yet @@ -51,7 +51,7 @@ func FuzzFinalityProviders(f *testing.F) { r := rand.New(rand.NewSource(seed)) // Setup keeper and context - keeper, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) ctx = sdk.UnwrapSDKContext(ctx) // Generate random finality providers and add them to kv store @@ -116,7 +116,7 @@ func FuzzFinalityProvider(f *testing.F) { f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) // Setup keeper and context - keeper, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) ctx = sdk.UnwrapSDKContext(ctx) // Generate random finality providers and add them to kv store @@ -173,7 +173,7 @@ func FuzzPendingBTCDelegations(f *testing.F) { btccKeeper := types.NewMockBtcCheckpointKeeper(ctrl) btccKeeper.EXPECT().GetParams(gomock.Any()).Return(btcctypes.DefaultParams()).AnyTimes() ckptKeeper := types.NewMockCheckpointingKeeper(ctrl) - keeper, ctx := testkeeper.BTCStakingKeeper(t, btclcKeeper, btccKeeper, ckptKeeper) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, btclcKeeper, btccKeeper, ckptKeeper) // covenant and slashing addr covenantSKs, covenantPKs, covenantQuorum := datagen.GenCovenantCommittee(r) @@ -275,7 +275,7 @@ func FuzzFinalityProviderPowerAtHeight(f *testing.F) { r := rand.New(rand.NewSource(seed)) // Setup keeper and context - keeper, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) // random finality provider fp, err := datagen.GenRandomFinalityProvider(r) @@ -324,7 +324,7 @@ func FuzzFinalityProviderCurrentVotingPower(f *testing.F) { r := rand.New(rand.NewSource(seed)) // Setup keeper and context - keeper, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) // random finality provider fp, err := datagen.GenRandomFinalityProvider(r) @@ -377,7 +377,7 @@ func FuzzActiveFinalityProvidersAtHeight(f *testing.F) { btccKeeper := types.NewMockBtcCheckpointKeeper(ctrl) btccKeeper.EXPECT().GetParams(gomock.Any()).Return(btcctypes.DefaultParams()).AnyTimes() ckptKeeper := types.NewMockCheckpointingKeeper(ctrl) - keeper, ctx := testkeeper.BTCStakingKeeper(t, btclcKeeper, btccKeeper, ckptKeeper) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, btclcKeeper, btccKeeper, ckptKeeper) // covenant and slashing addr covenantSKs, covenantPKs, covenantQuorum := datagen.GenCovenantCommittee(r) @@ -497,7 +497,7 @@ func FuzzFinalityProviderDelegations(f *testing.F) { btccKeeper := types.NewMockBtcCheckpointKeeper(ctrl) btccKeeper.EXPECT().GetParams(gomock.Any()).Return(btcctypes.DefaultParams()).AnyTimes() ckptKeeper := types.NewMockCheckpointingKeeper(ctrl) - keeper, ctx := testkeeper.BTCStakingKeeper(t, btclcKeeper, btccKeeper, ckptKeeper) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, btclcKeeper, btccKeeper, ckptKeeper) // covenant and slashing addr covenantSKs, covenantPKs, covenantQuorum := datagen.GenCovenantCommittee(r) diff --git a/x/btcstaking/keeper/keeper.go b/x/btcstaking/keeper/keeper.go index 6c0b9ca68..2a132cf9a 100644 --- a/x/btcstaking/keeper/keeper.go +++ b/x/btcstaking/keeper/keeper.go @@ -21,6 +21,7 @@ type ( btclcKeeper types.BTCLightClientKeeper btccKeeper types.BtcCheckpointKeeper ckptKeeper types.CheckpointingKeeper + bscKeeper types.BTCStkConsumerKeeper btcNet *chaincfg.Params // the address capable of executing a MsgUpdateParams message. Typically, this @@ -36,6 +37,7 @@ func NewKeeper( btclcKeeper types.BTCLightClientKeeper, btccKeeper types.BtcCheckpointKeeper, ckptKeeper types.CheckpointingKeeper, + bscKeeper types.BTCStkConsumerKeeper, btcNet *chaincfg.Params, authority string, @@ -47,6 +49,7 @@ func NewKeeper( btclcKeeper: btclcKeeper, btccKeeper: btccKeeper, ckptKeeper: ckptKeeper, + bscKeeper: bscKeeper, btcNet: btcNet, authority: authority, diff --git a/x/btcstaking/keeper/keeper_test.go b/x/btcstaking/keeper/keeper_test.go index 73e44aac0..9659b9f5d 100644 --- a/x/btcstaking/keeper/keeper_test.go +++ b/x/btcstaking/keeper/keeper_test.go @@ -13,6 +13,8 @@ import ( btclctypes "github.com/babylonchain/babylon/x/btclightclient/types" "github.com/babylonchain/babylon/x/btcstaking/keeper" "github.com/babylonchain/babylon/x/btcstaking/types" + bsckeeper "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" + bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/wire" @@ -28,29 +30,32 @@ var ( type Helper struct { t testing.TB - Ctx sdk.Context - BTCStakingKeeper *keeper.Keeper - BTCLightClientKeeper *types.MockBTCLightClientKeeper - BTCCheckpointKeeper *types.MockBtcCheckpointKeeper - CheckpointingKeeper *types.MockCheckpointingKeeper - MsgServer types.MsgServer - Net *chaincfg.Params + Ctx sdk.Context + BTCStakingKeeper *keeper.Keeper + BTCLightClientKeeper *types.MockBTCLightClientKeeper + BTCCheckpointKeeper *types.MockBtcCheckpointKeeper + CheckpointingKeeper *types.MockCheckpointingKeeper + MsgServer types.MsgServer + BtcStkConsumerMsgServer bsctypes.MsgServer + Net *chaincfg.Params } func NewHelper(t testing.TB, btclcKeeper *types.MockBTCLightClientKeeper, btccKeeper *types.MockBtcCheckpointKeeper, ckptKeeper *types.MockCheckpointingKeeper) *Helper { - k, ctx := keepertest.BTCStakingKeeper(t, btclcKeeper, btccKeeper, ckptKeeper) + k, bscKeeper, ctx := keepertest.BTCStakingKeeper(t, btclcKeeper, btccKeeper, ckptKeeper) ctx = ctx.WithHeaderInfo(header.Info{Height: 1}) msgSrvr := keeper.NewMsgServerImpl(*k) + btcStkConsumerMsgServer := bsckeeper.NewMsgServerImpl(*bscKeeper) return &Helper{ - t: t, - Ctx: ctx, - BTCStakingKeeper: k, - BTCLightClientKeeper: btclcKeeper, - BTCCheckpointKeeper: btccKeeper, - CheckpointingKeeper: ckptKeeper, - MsgServer: msgSrvr, - Net: &chaincfg.SimNetParams, + t: t, + Ctx: ctx, + BTCStakingKeeper: k, + BTCLightClientKeeper: btclcKeeper, + BTCCheckpointKeeper: btccKeeper, + CheckpointingKeeper: ckptKeeper, + MsgServer: msgSrvr, + BtcStkConsumerMsgServer: btcStkConsumerMsgServer, + Net: &chaincfg.SimNetParams, } } diff --git a/x/btcstaking/keeper/params_test.go b/x/btcstaking/keeper/params_test.go index 18056c153..96b60259b 100644 --- a/x/btcstaking/keeper/params_test.go +++ b/x/btcstaking/keeper/params_test.go @@ -12,7 +12,7 @@ import ( ) func TestGetParams(t *testing.T) { - k, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + k, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) params := types.DefaultParams() err := k.SetParams(ctx, params) @@ -22,7 +22,7 @@ func TestGetParams(t *testing.T) { } func TestGetParamsVersions(t *testing.T) { - k, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + k, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) params := types.DefaultParams() pv := k.GetParamsWithVersion(ctx) @@ -55,7 +55,7 @@ func FuzzParamsVersioning(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) - k, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + k, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) numVersionsToGenerate := r.Intn(100) + 1 params0 := k.GetParams(ctx) var generatedParams []*types.Params diff --git a/x/btcstaking/keeper/query_params_test.go b/x/btcstaking/keeper/query_params_test.go index fefd0ae45..7c1a906e3 100644 --- a/x/btcstaking/keeper/query_params_test.go +++ b/x/btcstaking/keeper/query_params_test.go @@ -9,7 +9,7 @@ import ( ) func TestParamsQuery(t *testing.T) { - keeper, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) params := types.DefaultParams() err := keeper.SetParams(ctx, params) @@ -21,7 +21,7 @@ func TestParamsQuery(t *testing.T) { } func TestParamsByVersionQuery(t *testing.T) { - keeper, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) + keeper, _, ctx := testkeeper.BTCStakingKeeper(t, nil, nil, nil) // starting with `1` as BTCStakingKeeper creates params with version 0 params1 := types.DefaultParams() diff --git a/x/btcstaking/types/expected_keepers.go b/x/btcstaking/types/expected_keepers.go index 2f8b0428d..a01632e19 100644 --- a/x/btcstaking/types/expected_keepers.go +++ b/x/btcstaking/types/expected_keepers.go @@ -25,3 +25,5 @@ type CheckpointingKeeper interface { GetEpoch(ctx context.Context) *etypes.Epoch GetLastFinalizedEpoch(ctx context.Context) uint64 } + +type BTCStkConsumerKeeper interface{} diff --git a/x/btcstaking/types/mocked_keepers.go b/x/btcstaking/types/mocked_keepers.go index 4211211d8..c238f310a 100644 --- a/x/btcstaking/types/mocked_keepers.go +++ b/x/btcstaking/types/mocked_keepers.go @@ -182,3 +182,26 @@ func (mr *MockCheckpointingKeeperMockRecorder) GetLastFinalizedEpoch(ctx interfa mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLastFinalizedEpoch", reflect.TypeOf((*MockCheckpointingKeeper)(nil).GetLastFinalizedEpoch), ctx) } + +// MockBTCStkConsumerKeeper is a mock of BTCStkConsumerKeeper interface. +type MockBTCStkConsumerKeeper struct { + ctrl *gomock.Controller + recorder *MockBTCStkConsumerKeeperMockRecorder +} + +// MockBTCStkConsumerKeeperMockRecorder is the mock recorder for MockBTCStkConsumerKeeper. +type MockBTCStkConsumerKeeperMockRecorder struct { + mock *MockBTCStkConsumerKeeper +} + +// NewMockBTCStkConsumerKeeper creates a new mock instance. +func NewMockBTCStkConsumerKeeper(ctrl *gomock.Controller) *MockBTCStkConsumerKeeper { + mock := &MockBTCStkConsumerKeeper{ctrl: ctrl} + mock.recorder = &MockBTCStkConsumerKeeperMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockBTCStkConsumerKeeper) EXPECT() *MockBTCStkConsumerKeeperMockRecorder { + return m.recorder +} diff --git a/x/btcstkconsumer/abci.go b/x/btcstkconsumer/abci.go new file mode 100644 index 000000000..e86643c03 --- /dev/null +++ b/x/btcstkconsumer/abci.go @@ -0,0 +1,23 @@ +package btcstkconsumer + +import ( + "context" + "time" + + "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/cosmos-sdk/telemetry" +) + +func BeginBlocker(ctx context.Context, k keeper.Keeper) error { + defer telemetry.ModuleMeasureSince(types.ModuleName, time.Now(), telemetry.MetricKeyBeginBlocker) + + return nil +} + +func EndBlocker(ctx context.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, error) { + defer telemetry.ModuleMeasureSince(types.ModuleName, time.Now(), telemetry.MetricKeyEndBlocker) + + return []abci.ValidatorUpdate{}, nil +} diff --git a/x/btcstkconsumer/genesis.go b/x/btcstkconsumer/genesis.go new file mode 100644 index 000000000..76d1b3118 --- /dev/null +++ b/x/btcstkconsumer/genesis.go @@ -0,0 +1,23 @@ +package btcstkconsumer + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +// InitGenesis initializes the module's state from a provided genesis state. +func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { + if err := k.SetParams(ctx, genState.Params); err != nil { + panic(err) + } +} + +// ExportGenesis returns the module's exported genesis. +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + genesis := types.DefaultGenesis() + genesis.Params = k.GetParams(ctx) + + return genesis +} diff --git a/x/btcstkconsumer/keeper/keeper.go b/x/btcstkconsumer/keeper/keeper.go new file mode 100644 index 000000000..03c82f845 --- /dev/null +++ b/x/btcstkconsumer/keeper/keeper.go @@ -0,0 +1,53 @@ +package keeper + +import ( + "fmt" + + "cosmossdk.io/core/store" + "cosmossdk.io/log" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +type Keeper struct { + cdc codec.BinaryCodec + storeService store.KVStoreService + + accountKeeper types.AccountKeeper + bankKeeper types.BankKeeper + + // the address capable of executing a MsgUpdateParams message. Typically, this + // should be the x/gov module account. + authority string +} + +func NewKeeper( + cdc codec.BinaryCodec, + storeService store.KVStoreService, + accountKeeper types.AccountKeeper, + bankKeeper types.BankKeeper, + authority string, +) Keeper { + if _, err := sdk.AccAddressFromBech32(authority); err != nil { + panic(fmt.Sprintf("invalid authority address: %s", authority)) + } + + return Keeper{ + cdc: cdc, + storeService: storeService, + bankKeeper: bankKeeper, + accountKeeper: accountKeeper, + authority: authority, + } +} + +// GetAuthority returns the module's authority. +func (k Keeper) GetAuthority() string { + return k.authority +} + +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) +} diff --git a/x/btcstkconsumer/keeper/msg_server.go b/x/btcstkconsumer/keeper/msg_server.go new file mode 100644 index 000000000..f970cbc0c --- /dev/null +++ b/x/btcstkconsumer/keeper/msg_server.go @@ -0,0 +1,17 @@ +package keeper + +import ( + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +type msgServer struct { + Keeper +} + +// NewMsgServerImpl returns an implementation of the MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(keeper Keeper) types.MsgServer { + return &msgServer{Keeper: keeper} +} + +var _ types.MsgServer = msgServer{} diff --git a/x/btcstkconsumer/keeper/msg_server_test.go b/x/btcstkconsumer/keeper/msg_server_test.go new file mode 100644 index 000000000..da6a5a1f6 --- /dev/null +++ b/x/btcstkconsumer/keeper/msg_server_test.go @@ -0,0 +1,24 @@ +package keeper_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + keepertest "github.com/babylonchain/babylon/testutil/keeper" + "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func setupMsgServer(t testing.TB) (keeper.Keeper, types.MsgServer, context.Context) { + k, ctx := keepertest.BTCStkConsumerKeeper(t) + return k, keeper.NewMsgServerImpl(k), ctx +} + +func TestMsgServer(t *testing.T) { + k, ms, ctx := setupMsgServer(t) + require.NotNil(t, ms) + require.NotNil(t, ctx) + require.NotEmpty(t, k) +} diff --git a/x/btcstkconsumer/keeper/msg_update_params.go b/x/btcstkconsumer/keeper/msg_update_params.go new file mode 100644 index 000000000..a5ff343b3 --- /dev/null +++ b/x/btcstkconsumer/keeper/msg_update_params.go @@ -0,0 +1,23 @@ +package keeper + +import ( + "context" + + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func (k msgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { + if k.GetAuthority() != req.Authority { + return nil, errorsmod.Wrapf(types.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.GetAuthority(), req.Authority) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + if err := k.SetParams(ctx, req.Params); err != nil { + return nil, err + } + + return &types.MsgUpdateParamsResponse{}, nil +} diff --git a/x/btcstkconsumer/keeper/msg_update_params_test.go b/x/btcstkconsumer/keeper/msg_update_params_test.go new file mode 100644 index 000000000..06b01ff24 --- /dev/null +++ b/x/btcstkconsumer/keeper/msg_update_params_test.go @@ -0,0 +1,64 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func TestMsgUpdateParams(t *testing.T) { + k, ms, ctx := setupMsgServer(t) + params := types.DefaultParams() + require.NoError(t, k.SetParams(ctx, params)) + wctx := sdk.UnwrapSDKContext(ctx) + + // default params + testCases := []struct { + name string + input *types.MsgUpdateParams + expErr bool + expErrMsg string + }{ + { + name: "invalid authority", + input: &types.MsgUpdateParams{ + Authority: "invalid", + Params: params, + }, + expErr: true, + expErrMsg: "invalid authority", + }, + { + name: "send enabled param", + input: &types.MsgUpdateParams{ + Authority: k.GetAuthority(), + Params: types.Params{}, + }, + expErr: false, + }, + { + name: "all good", + input: &types.MsgUpdateParams{ + Authority: k.GetAuthority(), + Params: params, + }, + expErr: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + _, err := ms.UpdateParams(wctx, tc.input) + + if tc.expErr { + require.Error(t, err) + require.Contains(t, err.Error(), tc.expErrMsg) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/x/btcstkconsumer/keeper/params.go b/x/btcstkconsumer/keeper/params.go new file mode 100644 index 000000000..f666e73ed --- /dev/null +++ b/x/btcstkconsumer/keeper/params.go @@ -0,0 +1,33 @@ +package keeper + +import ( + "context" + + "github.com/cosmos/cosmos-sdk/runtime" + + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +// GetParams get all parameters as types.Params +func (k Keeper) GetParams(ctx context.Context) (params types.Params) { + store := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + bz := store.Get(types.ParamsKey) + if bz == nil { + return params + } + + k.cdc.MustUnmarshal(bz, ¶ms) + return params +} + +// SetParams set the params +func (k Keeper) SetParams(ctx context.Context, params types.Params) error { + store := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + bz, err := k.cdc.Marshal(¶ms) + if err != nil { + return err + } + store.Set(types.ParamsKey, bz) + + return nil +} diff --git a/x/btcstkconsumer/keeper/params_test.go b/x/btcstkconsumer/keeper/params_test.go new file mode 100644 index 000000000..2b1a65e9c --- /dev/null +++ b/x/btcstkconsumer/keeper/params_test.go @@ -0,0 +1,18 @@ +package keeper_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + keepertest "github.com/babylonchain/babylon/testutil/keeper" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func TestGetParams(t *testing.T) { + k, ctx := keepertest.BTCStkConsumerKeeper(t) + params := types.DefaultParams() + + require.NoError(t, k.SetParams(ctx, params)) + require.EqualValues(t, params, k.GetParams(ctx)) +} diff --git a/x/btcstkconsumer/keeper/query.go b/x/btcstkconsumer/keeper/query.go new file mode 100644 index 000000000..3843e23f2 --- /dev/null +++ b/x/btcstkconsumer/keeper/query.go @@ -0,0 +1,7 @@ +package keeper + +import ( + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +var _ types.QueryServer = Keeper{} diff --git a/x/btcstkconsumer/keeper/query_params.go b/x/btcstkconsumer/keeper/query_params.go new file mode 100644 index 000000000..8e927bc0e --- /dev/null +++ b/x/btcstkconsumer/keeper/query_params.go @@ -0,0 +1,20 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func (k Keeper) Params(goCtx context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + ctx := sdk.UnwrapSDKContext(goCtx) + + return &types.QueryParamsResponse{Params: k.GetParams(ctx)}, nil +} diff --git a/x/btcstkconsumer/keeper/query_params_test.go b/x/btcstkconsumer/keeper/query_params_test.go new file mode 100644 index 000000000..c2242067b --- /dev/null +++ b/x/btcstkconsumer/keeper/query_params_test.go @@ -0,0 +1,20 @@ +package keeper_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + keepertest "github.com/babylonchain/babylon/testutil/keeper" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func TestParamsQuery(t *testing.T) { + keeper, ctx := keepertest.BTCStkConsumerKeeper(t) + params := types.DefaultParams() + require.NoError(t, keeper.SetParams(ctx, params)) + + response, err := keeper.Params(ctx, &types.QueryParamsRequest{}) + require.NoError(t, err) + require.Equal(t, &types.QueryParamsResponse{Params: params}, response) +} diff --git a/x/btcstkconsumer/module.go b/x/btcstkconsumer/module.go new file mode 100644 index 000000000..355022b63 --- /dev/null +++ b/x/btcstkconsumer/module.go @@ -0,0 +1,173 @@ +package btcstkconsumer + +import ( + "context" + "encoding/json" + "fmt" + + "cosmossdk.io/core/appmodule" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" + + "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" + "github.com/babylonchain/babylon/x/monitor/client/cli" +) + +var ( + _ module.AppModuleBasic = AppModuleBasic{} + _ appmodule.HasBeginBlocker = AppModule{} + _ module.HasABCIEndBlock = AppModule{} +) + +// ---------------------------------------------------------------------------- +// AppModuleBasic +// ---------------------------------------------------------------------------- + +// AppModuleBasic implements the AppModuleBasic interface for the capability module. +type AppModuleBasic struct { + cdc codec.Codec +} + +func NewAppModuleBasic(cdc codec.Codec) AppModuleBasic { + return AppModuleBasic{cdc: cdc} +} + +// Name returns the capability module's name. +func (AppModuleBasic) Name() string { + return types.ModuleName +} + +func (AppModuleBasic) RegisterCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) +} + +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + types.RegisterCodec(cdc) +} + +// RegisterInterfaces registers the module's interface types +func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { + types.RegisterInterfaces(reg) +} + +// DefaultGenesis returns the capability module's default genesis state. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesis()) +} + +// ValidateGenesis performs genesis state validation for the capability module. +func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error { + var genState types.GenesisState + if err := cdc.UnmarshalJSON(bz, &genState); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) + } + return genState.Validate() +} + +// RegisterRESTRoutes registers the capability module's REST service handlers. +func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { +} + +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { + types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) //nolint: errcheck // cosmos convention is not to check the error here. +} + +// GetTxCmd returns the capability module's root tx command. +func (a AppModuleBasic) GetTxCmd() *cobra.Command { + return cli.GetTxCmd() +} + +// GetQueryCmd returns the capability module's root query command. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd(types.StoreKey) +} + +// ---------------------------------------------------------------------------- +// AppModule +// ---------------------------------------------------------------------------- +var _ appmodule.AppModule = AppModule{} + +// AppModule implements the AppModule interface for the capability module. +type AppModule struct { + AppModuleBasic + + keeper keeper.Keeper + accountKeeper types.AccountKeeper + bankKeeper types.BankKeeper +} + +func NewAppModule( + cdc codec.Codec, + keeper keeper.Keeper, + accountKeeper types.AccountKeeper, + bankKeeper types.BankKeeper, +) AppModule { + return AppModule{ + AppModuleBasic: NewAppModuleBasic(cdc), + keeper: keeper, + accountKeeper: accountKeeper, + bankKeeper: bankKeeper, + } +} + +// Name returns the capability module's name. +func (am AppModule) Name() string { + return am.AppModuleBasic.Name() +} + +// QuerierRoute returns the capability module's query routing key. +func (AppModule) QuerierRoute() string { return types.QuerierRoute } + +// RegisterServices registers a GRPC query service to respond to the +// module-specific GRPC queries. +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) + types.RegisterQueryServer(cfg.QueryServer(), am.keeper) +} + +// RegisterInvariants registers the capability module's invariants. +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// InitGenesis performs the capability module's genesis initialization It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) { + var genState types.GenesisState + // Initialize global index to index in genesis state + cdc.MustUnmarshalJSON(gs, &genState) + + InitGenesis(ctx, am.keeper, genState) +} + +// ExportGenesis returns the capability module's exported genesis state as raw JSON bytes. +func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { + genState := ExportGenesis(ctx, am.keeper) + return cdc.MustMarshalJSON(genState) +} + +// ConsensusVersion implements ConsensusVersion. +func (AppModule) ConsensusVersion() uint64 { return 1 } + +func (am AppModule) BeginBlock(ctx context.Context) error { + return BeginBlocker(ctx, am.keeper) +} + +func (am AppModule) EndBlock(ctx context.Context) ([]abci.ValidatorUpdate, error) { + return EndBlocker(ctx, am.keeper) +} + +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() { // marker +} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() { // marker +} diff --git a/x/btcstkconsumer/types/codec.go b/x/btcstkconsumer/types/codec.go new file mode 100644 index 000000000..199b17fd8 --- /dev/null +++ b/x/btcstkconsumer/types/codec.go @@ -0,0 +1,19 @@ +package types + +import ( + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" +) + +func RegisterCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgUpdateParams{}, "btcstkconsumer/MsgUpdateParams", nil) +} + +func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgUpdateParams{}, + ) + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) +} diff --git a/x/btcstkconsumer/types/errors.go b/x/btcstkconsumer/types/errors.go new file mode 100644 index 000000000..6ef6ec33e --- /dev/null +++ b/x/btcstkconsumer/types/errors.go @@ -0,0 +1,13 @@ +package types + +// DONTCOVER + +import ( + sdkerrors "cosmossdk.io/errors" +) + +// x/btcstkconsumer module sentinel errors +var ( + ErrInvalidSigner = sdkerrors.Register(ModuleName, 1100, "expected gov account as only signer for proposal message") + ErrSample = sdkerrors.Register(ModuleName, 1101, "sample error") +) diff --git a/x/btcstkconsumer/types/expected_keepers.go b/x/btcstkconsumer/types/expected_keepers.go new file mode 100644 index 000000000..4a50d01a9 --- /dev/null +++ b/x/btcstkconsumer/types/expected_keepers.go @@ -0,0 +1,25 @@ +package types + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// AccountKeeper defines the expected interface for the Account module. +type AccountKeeper interface { + GetAccount(context.Context, sdk.AccAddress) sdk.AccountI // only used for simulation + // Methods imported from account should be defined here +} + +// BankKeeper defines the expected interface for the Bank module. +type BankKeeper interface { + SpendableCoins(context.Context, sdk.AccAddress) sdk.Coins + // Methods imported from bank should be defined here +} + +// ParamSubspace defines the expected Subspace interface for parameters. +type ParamSubspace interface { + Get(context.Context, []byte, interface{}) + Set(context.Context, []byte, interface{}) +} diff --git a/x/btcstkconsumer/types/genesis.go b/x/btcstkconsumer/types/genesis.go new file mode 100644 index 000000000..bdb9f4151 --- /dev/null +++ b/x/btcstkconsumer/types/genesis.go @@ -0,0 +1,17 @@ +package types + +// DefaultIndex is the default global index +const DefaultIndex uint64 = 1 + +// DefaultGenesis returns the default genesis state +func DefaultGenesis() *GenesisState { + return &GenesisState{ + Params: DefaultParams(), + } +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + return gs.Params.Validate() +} diff --git a/x/btcstkconsumer/types/genesis.pb.go b/x/btcstkconsumer/types/genesis.pb.go new file mode 100644 index 000000000..be4f495da --- /dev/null +++ b/x/btcstkconsumer/types/genesis.pb.go @@ -0,0 +1,326 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: babylon/btcstkconsumer/genesis.proto + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the btcstkconsumer module's genesis state. +type GenesisState struct { + // params defines all the parameters of the module. + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_a94754f5b206a0cb, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.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 *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +func init() { + proto.RegisterType((*GenesisState)(nil), "babylon.btcstkconsumer.GenesisState") +} + +func init() { + proto.RegisterFile("babylon/btcstkconsumer/genesis.proto", fileDescriptor_a94754f5b206a0cb) +} + +var fileDescriptor_a94754f5b206a0cb = []byte{ + // 216 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0x4a, 0x4c, 0xaa, + 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, + 0x4d, 0x2d, 0xd2, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, + 0x17, 0x12, 0x83, 0xaa, 0xd2, 0x43, 0x55, 0x25, 0x25, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, + 0x26, 0x21, 0x4a, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x4c, 0x7d, 0x10, 0x0b, 0x2a, 0xaa, + 0x8c, 0xc3, 0x9a, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, 0x2d, 0x4a, 0x81, 0x5c, 0x3c, 0xee, 0x10, + 0x6b, 0x83, 0x4b, 0x12, 0x4b, 0x52, 0x85, 0x1c, 0xb9, 0xd8, 0x20, 0xf2, 0x12, 0x8c, 0x0a, 0x8c, + 0x1a, 0xdc, 0x46, 0x72, 0x7a, 0xd8, 0x9d, 0xa1, 0x17, 0x00, 0x56, 0xe5, 0xc4, 0x79, 0xe2, 0x9e, + 0x3c, 0xc3, 0x8a, 0xe7, 0x1b, 0xb4, 0x18, 0x83, 0xa0, 0x1a, 0x9d, 0x02, 0x4e, 0x3c, 0x92, 0x63, + 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, + 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x2c, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, + 0x3f, 0x57, 0x1f, 0x6a, 0x6c, 0x72, 0x46, 0x62, 0x66, 0x1e, 0x8c, 0xa3, 0x5f, 0x81, 0xee, 0xd6, + 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0x5b, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, + 0x8d, 0xf4, 0x47, 0x05, 0x39, 0x01, 0x00, 0x00, +} + +func (m *GenesisState) 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 *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovGenesis(uint64(l)) + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) 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 ErrIntOverflowGenesis + } + 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: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/btcstkconsumer/types/genesis_test.go b/x/btcstkconsumer/types/genesis_test.go new file mode 100644 index 000000000..239a6802d --- /dev/null +++ b/x/btcstkconsumer/types/genesis_test.go @@ -0,0 +1,37 @@ +package types_test + +import ( + "testing" + + "github.com/babylonchain/babylon/x/btcstkconsumer/types" + "github.com/stretchr/testify/require" +) + +func TestGenesisState_Validate(t *testing.T) { + tests := []struct { + desc string + genState *types.GenesisState + valid bool + }{ + { + desc: "default is valid", + genState: types.DefaultGenesis(), + valid: true, + }, + { + desc: "valid genesis state", + genState: &types.GenesisState{}, + valid: true, + }, + } + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + err := tc.genState.Validate() + if tc.valid { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/x/btcstkconsumer/types/keys.go b/x/btcstkconsumer/types/keys.go new file mode 100644 index 000000000..25f6ef9c3 --- /dev/null +++ b/x/btcstkconsumer/types/keys.go @@ -0,0 +1,23 @@ +package types + +const ( + // ModuleName defines the module name + ModuleName = "btcstkconsumer" + + // StoreKey defines the primary module store key + StoreKey = ModuleName + + // MemStoreKey defines the in-memory store key + MemStoreKey = "mem_btcstkconsumer" + + // QuerierRoute defines the module's query routing key + QuerierRoute = ModuleName +) + +var ( + ParamsKey = []byte("p_btcstkconsumer") +) + +func KeyPrefix(p string) []byte { + return []byte(p) +} diff --git a/x/btcstkconsumer/types/msg_update_params.go b/x/btcstkconsumer/types/msg_update_params.go new file mode 100644 index 000000000..e36d023de --- /dev/null +++ b/x/btcstkconsumer/types/msg_update_params.go @@ -0,0 +1,21 @@ +package types + +import ( + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +var _ sdk.Msg = &MsgUpdateParams{} + +// ValidateBasic does a sanity check on the provided data. +func (m *MsgUpdateParams) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { + return errorsmod.Wrap(err, "invalid authority address") + } + + if err := m.Params.Validate(); err != nil { + return err + } + + return nil +} diff --git a/x/btcstkconsumer/types/params.go b/x/btcstkconsumer/types/params.go new file mode 100644 index 000000000..4f3215e35 --- /dev/null +++ b/x/btcstkconsumer/types/params.go @@ -0,0 +1,32 @@ +package types + +import ( + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" +) + +var _ paramtypes.ParamSet = (*Params)(nil) + +// ParamKeyTable the param key table for launch module +func ParamKeyTable() paramtypes.KeyTable { + return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) +} + +// NewParams creates a new Params instance +func NewParams() Params { + return Params{} +} + +// DefaultParams returns a default set of parameters +func DefaultParams() Params { + return NewParams() +} + +// ParamSetPairs get the params.ParamSet +func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { + return paramtypes.ParamSetPairs{} +} + +// Validate validates the set of params +func (p Params) Validate() error { + return nil +} diff --git a/x/btcstkconsumer/types/params.pb.go b/x/btcstkconsumer/types/params.pb.go new file mode 100644 index 000000000..e30383cba --- /dev/null +++ b/x/btcstkconsumer/types/params.pb.go @@ -0,0 +1,291 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: babylon/btcstkconsumer/params.proto + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Params defines the parameters for the module. +type Params struct { +} + +func (m *Params) Reset() { *m = Params{} } +func (m *Params) String() string { return proto.CompactTextString(m) } +func (*Params) ProtoMessage() {} +func (*Params) Descriptor() ([]byte, []int) { + return fileDescriptor_53dadced3b9d4fb0, []int{0} +} +func (m *Params) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Params.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 *Params) XXX_Merge(src proto.Message) { + xxx_messageInfo_Params.Merge(m, src) +} +func (m *Params) XXX_Size() int { + return m.Size() +} +func (m *Params) XXX_DiscardUnknown() { + xxx_messageInfo_Params.DiscardUnknown(m) +} + +var xxx_messageInfo_Params proto.InternalMessageInfo + +func init() { + proto.RegisterType((*Params)(nil), "babylon.btcstkconsumer.Params") +} + +func init() { + proto.RegisterFile("babylon/btcstkconsumer/params.proto", fileDescriptor_53dadced3b9d4fb0) +} + +var fileDescriptor_53dadced3b9d4fb0 = []byte{ + // 179 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4e, 0x4a, 0x4c, 0xaa, + 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, + 0x4d, 0x2d, 0xd2, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, + 0x12, 0x83, 0x2a, 0xd2, 0x43, 0x55, 0x24, 0x25, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, + 0x21, 0x4a, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x4c, 0x7d, 0x10, 0x0b, 0x22, 0xaa, 0x64, + 0xc4, 0xc5, 0x16, 0x00, 0x36, 0xd0, 0x4a, 0xe3, 0xc5, 0x02, 0x79, 0xc6, 0xae, 0xe7, 0x1b, 0xb4, + 0xe4, 0x61, 0x16, 0x57, 0xa0, 0x5b, 0x0d, 0x51, 0xe9, 0x14, 0x70, 0xe2, 0x91, 0x1c, 0xe3, 0x85, + 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, + 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0x66, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, + 0xfa, 0x50, 0x53, 0x92, 0x33, 0x12, 0x33, 0xf3, 0xf4, 0x71, 0x1a, 0x59, 0x52, 0x59, 0x90, 0x5a, + 0x9c, 0xc4, 0x06, 0x76, 0x8c, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x17, 0x7a, 0x9e, 0xbe, 0xf4, + 0x00, 0x00, 0x00, +} + +func (this *Params) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Params) + if !ok { + that2, ok := that.(Params) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + return true +} +func (m *Params) 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 *Params) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintParams(dAtA []byte, offset int, v uint64) int { + offset -= sovParams(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Params) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovParams(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozParams(x uint64) (n int) { + return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Params) 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 ErrIntOverflowParams + } + 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: Params: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipParams(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthParams + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipParams(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowParams + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowParams + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowParams + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthParams + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupParams + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthParams + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/btcstkconsumer/types/query.pb.go b/x/btcstkconsumer/types/query.pb.go new file mode 100644 index 000000000..43021aecc --- /dev/null +++ b/x/btcstkconsumer/types/query.pb.go @@ -0,0 +1,539 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: babylon/btcstkconsumer/query.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// QueryParamsRequest is request type for the Query/Params RPC method. +type QueryParamsRequest struct { +} + +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_4d35172ed333c293, []int{0} +} +func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryParamsRequest.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 *QueryParamsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryParamsRequest.Merge(m, src) +} +func (m *QueryParamsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryParamsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo + +// QueryParamsResponse is response type for the Query/Params RPC method. +type QueryParamsResponse struct { + // params holds all the parameters of this module. + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` +} + +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_4d35172ed333c293, []int{1} +} +func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryParamsResponse.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 *QueryParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryParamsResponse.Merge(m, src) +} +func (m *QueryParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo + +func (m *QueryParamsResponse) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +func init() { + proto.RegisterType((*QueryParamsRequest)(nil), "babylon.btcstkconsumer.QueryParamsRequest") + proto.RegisterType((*QueryParamsResponse)(nil), "babylon.btcstkconsumer.QueryParamsResponse") +} + +func init() { + proto.RegisterFile("babylon/btcstkconsumer/query.proto", fileDescriptor_4d35172ed333c293) +} + +var fileDescriptor_4d35172ed333c293 = []byte{ + // 296 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0x4a, 0x4c, 0xaa, + 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, + 0x4d, 0x2d, 0xd2, 0x2f, 0x2c, 0x4d, 0x2d, 0xaa, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, + 0x83, 0xaa, 0xd1, 0x43, 0x55, 0x23, 0x25, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, 0x21, + 0x4a, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x4c, 0x7d, 0x10, 0x0b, 0x2a, 0x2a, 0x93, 0x9e, + 0x9f, 0x9f, 0x9e, 0x93, 0xaa, 0x9f, 0x58, 0x90, 0xa9, 0x9f, 0x98, 0x97, 0x97, 0x5f, 0x92, 0x58, + 0x92, 0x99, 0x9f, 0x57, 0x0c, 0x95, 0x55, 0xc6, 0xe1, 0x84, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, + 0x22, 0x25, 0x11, 0x2e, 0xa1, 0x40, 0x90, 0x93, 0x02, 0xc0, 0x82, 0x41, 0xa9, 0x85, 0xa5, 0xa9, + 0xc5, 0x25, 0x4a, 0x11, 0x5c, 0xc2, 0x28, 0xa2, 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x42, 0x8e, + 0x5c, 0x6c, 0x10, 0xcd, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xdc, 0x46, 0x72, 0x7a, 0xd8, 0x7d, 0xa0, + 0x07, 0xd1, 0xe7, 0xc4, 0x79, 0xe2, 0x9e, 0x3c, 0xc3, 0x8a, 0xe7, 0x1b, 0xb4, 0x18, 0x83, 0xa0, + 0x1a, 0x8d, 0x16, 0x30, 0x72, 0xb1, 0x82, 0x8d, 0x16, 0x9a, 0xc6, 0xc8, 0xc5, 0x06, 0x51, 0x27, + 0xa4, 0x85, 0xcb, 0x1c, 0x4c, 0xa7, 0x49, 0x69, 0x13, 0xa5, 0x16, 0xe2, 0x60, 0x25, 0xe3, 0xa6, + 0xcb, 0x4f, 0x26, 0x33, 0xe9, 0x0a, 0x69, 0xeb, 0x43, 0x35, 0x25, 0x67, 0x24, 0x66, 0xe6, 0xe9, + 0xe3, 0x0d, 0x18, 0xa7, 0x80, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, + 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, + 0x4b, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xc5, 0x6e, 0x60, 0x05, 0xba, 0x91, + 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, + 0x4b, 0xe3, 0x57, 0x0c, 0x15, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // Parameters queries the parameters of the module. + Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { + out := new(QueryParamsResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.Query/Params", 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. + Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryParamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Params(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.btcstkconsumer.Query/Params", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "babylon.btcstkconsumer.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Params", + Handler: _Query_Params_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "babylon/btcstkconsumer/query.proto", +} + +func (m *QueryParamsRequest) 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 *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryParamsResponse) 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 *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.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 encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryParamsRequest) 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: QueryParamsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + 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 *QueryParamsResponse) 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: QueryParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", 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 + } + if err := m.Params.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 skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/btcstkconsumer/types/query.pb.gw.go b/x/btcstkconsumer/types/query.pb.gw.go new file mode 100644 index 000000000..3b5d1fb13 --- /dev/null +++ b/x/btcstkconsumer/types/query.pb.gw.go @@ -0,0 +1,153 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: babylon/btcstkconsumer/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(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. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Params_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_Params_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_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_Params_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_Params_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_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylonchain", "babylon", "btcstkconsumer", "params"}, "", runtime.AssumeColonVerbOpt(false))) +) + +var ( + forward_Query_Params_0 = runtime.ForwardResponseMessage +) diff --git a/x/btcstkconsumer/types/tx.pb.go b/x/btcstkconsumer/types/tx.pb.go new file mode 100644 index 000000000..b43aebb8a --- /dev/null +++ b/x/btcstkconsumer/types/tx.pb.go @@ -0,0 +1,598 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: babylon/btcstkconsumer/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + _ "github.com/cosmos/cosmos-sdk/types/msgservice" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// MsgUpdateParams is the Msg/UpdateParams request type. +type MsgUpdateParams struct { + // authority is the address that controls the module (defaults to x/gov unless overwritten). + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + // params defines the module parameters to update. + // + // NOTE: All parameters must be supplied. + Params Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params"` +} + +func (m *MsgUpdateParams) Reset() { *m = MsgUpdateParams{} } +func (m *MsgUpdateParams) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateParams) ProtoMessage() {} +func (*MsgUpdateParams) Descriptor() ([]byte, []int) { + return fileDescriptor_76970a330f60bcb2, []int{0} +} +func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateParams.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 *MsgUpdateParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateParams.Merge(m, src) +} +func (m *MsgUpdateParams) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateParams) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateParams.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateParams proto.InternalMessageInfo + +func (m *MsgUpdateParams) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func (m *MsgUpdateParams) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +// MsgUpdateParamsResponse defines the response structure for executing a +// MsgUpdateParams message. +type MsgUpdateParamsResponse struct { +} + +func (m *MsgUpdateParamsResponse) Reset() { *m = MsgUpdateParamsResponse{} } +func (m *MsgUpdateParamsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateParamsResponse) ProtoMessage() {} +func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_76970a330f60bcb2, []int{1} +} +func (m *MsgUpdateParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateParamsResponse.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 *MsgUpdateParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateParamsResponse.Merge(m, src) +} +func (m *MsgUpdateParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgUpdateParams)(nil), "babylon.btcstkconsumer.MsgUpdateParams") + proto.RegisterType((*MsgUpdateParamsResponse)(nil), "babylon.btcstkconsumer.MsgUpdateParamsResponse") +} + +func init() { proto.RegisterFile("babylon/btcstkconsumer/tx.proto", fileDescriptor_76970a330f60bcb2) } + +var fileDescriptor_76970a330f60bcb2 = []byte{ + // 349 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0x4a, 0x4c, 0xaa, + 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, + 0x4d, 0x2d, 0xd2, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x83, 0x2a, 0xd0, + 0x43, 0x55, 0x20, 0x25, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, 0x21, 0x4a, 0xa5, 0xc4, + 0x93, 0xf3, 0x8b, 0x73, 0xf3, 0x8b, 0xf5, 0x73, 0x8b, 0xd3, 0xf5, 0xcb, 0x0c, 0x41, 0x14, 0x54, + 0x42, 0x12, 0x22, 0x11, 0x0f, 0xe6, 0xe9, 0x43, 0x38, 0x50, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, + 0x88, 0x38, 0x88, 0x05, 0x15, 0x55, 0xc6, 0xe1, 0xaa, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, 0x56, + 0xa5, 0x93, 0x8c, 0x5c, 0xfc, 0xbe, 0xc5, 0xe9, 0xa1, 0x05, 0x29, 0x89, 0x25, 0xa9, 0x01, 0x60, + 0x19, 0x21, 0x33, 0x2e, 0xce, 0xc4, 0xd2, 0x92, 0x8c, 0xfc, 0xa2, 0xcc, 0x92, 0x4a, 0x09, 0x46, + 0x05, 0x46, 0x0d, 0x4e, 0x27, 0x89, 0x4b, 0x5b, 0x74, 0x45, 0xa0, 0x76, 0x3a, 0xa6, 0xa4, 0x14, + 0xa5, 0x16, 0x17, 0x07, 0x97, 0x14, 0x65, 0xe6, 0xa5, 0x07, 0x21, 0x94, 0x0a, 0x39, 0x72, 0xb1, + 0x41, 0xcc, 0x96, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x36, 0x92, 0xd3, 0xc3, 0xee, 0x6d, 0x3d, 0x88, + 0x3d, 0x4e, 0x9c, 0x27, 0xee, 0xc9, 0x33, 0xac, 0x78, 0xbe, 0x41, 0x8b, 0x31, 0x08, 0xaa, 0xd1, + 0xca, 0xba, 0xe9, 0xf9, 0x06, 0x2d, 0x84, 0x91, 0x5d, 0xcf, 0x37, 0x68, 0x69, 0xc0, 0xbc, 0x51, + 0x81, 0xee, 0x11, 0x34, 0x77, 0x2b, 0x49, 0x72, 0x89, 0xa3, 0x09, 0x05, 0xa5, 0x16, 0x17, 0xe4, + 0xe7, 0x15, 0xa7, 0x1a, 0x95, 0x71, 0x31, 0xfb, 0x16, 0xa7, 0x0b, 0x65, 0x70, 0xf1, 0xa0, 0xf8, + 0x54, 0x1d, 0x97, 0x0b, 0xd1, 0xcc, 0x91, 0xd2, 0x27, 0x52, 0x21, 0xcc, 0x42, 0x29, 0xd6, 0x06, + 0x90, 0xbf, 0x9c, 0x02, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, + 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x2c, + 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6a, 0x76, 0x72, 0x46, 0x62, + 0x66, 0x9e, 0x3e, 0x4e, 0xef, 0x96, 0x54, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, 0xe3, 0xcd, 0x18, + 0x10, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xa5, 0x49, 0x21, 0x74, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + // UpdateParams defines a (governance) operation for updating the module + // parameters. The authority defaults to the x/gov module account. + UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) { + out := new(MsgUpdateParamsResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.Msg/UpdateParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + // UpdateParams defines a (governance) operation for updating the module + // parameters. The authority defaults to the x/gov module account. + UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateParams) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.btcstkconsumer.Msg/UpdateParams", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateParams(ctx, req.(*MsgUpdateParams)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "babylon.btcstkconsumer.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "UpdateParams", + Handler: _Msg_UpdateParams_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "babylon/btcstkconsumer/tx.proto", +} + +func (m *MsgUpdateParams) 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 *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(dAtA[i:], m.Authority) + i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateParamsResponse) 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 *MsgUpdateParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgUpdateParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Authority) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Params.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgUpdateParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgUpdateParams) 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 ErrIntOverflowTx + } + 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: MsgUpdateParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateParamsResponse) 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 ErrIntOverflowTx + } + 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: MsgUpdateParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/btcstkconsumer/types/types.go b/x/btcstkconsumer/types/types.go new file mode 100644 index 000000000..ab1254f4c --- /dev/null +++ b/x/btcstkconsumer/types/types.go @@ -0,0 +1 @@ +package types From 88f891ccfe698fc1e8429451f210e804a3126d60 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 13 Mar 2024 10:00:29 +0100 Subject: [PATCH 02/85] F/consumer chain registry (#205) * Add chain register struct * Add chain registry * Add chain registry test * Add chain registry queries * Add chain registry queries tests * Add register chain msg * Add register chain msg routing / impl * Update proto/babylon/zoneconcierge/v1/tx.proto * Flatten chain register proto * Remove authority from register chain msg * Add chain not registered check * Add chain already registered check * Update / fix comment * Add registry related queries to rpc server * Fix indentation * Fix: Add signer field to register chain msg * Fix: Own / unique query param / response for list registry --- proto/babylon/zoneconcierge/v1/query.proto | 30 + proto/babylon/zoneconcierge/v1/tx.proto | 44 +- .../zoneconcierge/v1/zoneconcierge.proto | 10 + .../keeper/consumer_chain_registry.go | 56 + .../keeper/consumer_chain_registry_test.go | 55 + x/zoneconcierge/keeper/grpc_query.go | 75 +- x/zoneconcierge/keeper/grpc_query_test.go | 87 ++ x/zoneconcierge/keeper/keeper.go | 4 +- x/zoneconcierge/keeper/msg_server.go | 22 + x/zoneconcierge/types/chain_register.go | 17 + x/zoneconcierge/types/msg.go | 1 + x/zoneconcierge/types/query.pb.go | 1125 +++++++++++++++-- x/zoneconcierge/types/query.pb.gw.go | 166 +++ x/zoneconcierge/types/tx.pb.go | 537 +++++++- x/zoneconcierge/types/zoneconcierge.pb.go | 411 +++++- 15 files changed, 2397 insertions(+), 243 deletions(-) create mode 100644 x/zoneconcierge/keeper/consumer_chain_registry.go create mode 100644 x/zoneconcierge/keeper/consumer_chain_registry_test.go create mode 100644 x/zoneconcierge/types/chain_register.go diff --git a/proto/babylon/zoneconcierge/v1/query.proto b/proto/babylon/zoneconcierge/v1/query.proto index aa65a805f..89afb52a3 100644 --- a/proto/babylon/zoneconcierge/v1/query.proto +++ b/proto/babylon/zoneconcierge/v1/query.proto @@ -66,6 +66,14 @@ service Query { "/babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}/height/" "{height}"; } + // ChainRegistryList queries the list of chains that are registered to Babylon + rpc ChainRegistryList(QueryChainRegistryListRequest) returns (QueryChainRegistryListResponse) { + option (google.api.http).get = "/babylon/zoneconcierge/v1/chain_registry_list"; + } + // ChainsRegistry queries the latest info for a given list of chains in Babylon's view + rpc ChainsRegistry(QueryChainsRegistryRequest) returns (QueryChainsRegistryResponse) { + option (google.api.http).get = "/babylon/zoneconcierge/v1/chains_registry"; + } } // QueryParamsRequest is the request type for the Query/Params RPC method. @@ -200,3 +208,25 @@ message QueryFinalizedChainInfoUntilHeightResponse { // proof is the proof that the chain info is finalized babylon.zoneconcierge.v1.ProofFinalizedChainInfo proof = 5; } + +// QueryChainRegistryListRequest is request type for the Query/ChainRegistryList RPC method +message QueryChainRegistryListRequest { + // pagination defines whether to have the pagination in the request + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +// QueryChainRegistryListResponse is response type for the Query/ChainRegistryList RPC method +message QueryChainRegistryListResponse { + // chain_ids are IDs of the chains in ascending alphabetical order + repeated string chain_ids = 1; + // pagination defines the pagination in the response + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +// QueryChainsRegistryRequest is request type for the Query/ChainsRegistry RPC method. +message QueryChainsRegistryRequest { repeated string chain_ids = 1; } + +// QueryChainsRegistryResponse is response type for the Query/ChainsRegistry RPC method. +message QueryChainsRegistryResponse { + repeated babylon.zoneconcierge.v1.ChainRegister chains_register = 1; +} diff --git a/proto/babylon/zoneconcierge/v1/tx.proto b/proto/babylon/zoneconcierge/v1/tx.proto index b44c332b2..faea6e100 100644 --- a/proto/babylon/zoneconcierge/v1/tx.proto +++ b/proto/babylon/zoneconcierge/v1/tx.proto @@ -15,23 +15,41 @@ service Msg { // UpdateParams updates the zoneconcierge module parameters. rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); + // RegisterChain registers a CZ chain to the zoneconcierge module. + rpc RegisterChain(MsgRegisterChain) returns (MsgRegisterChainResponse); } // MsgUpdateParams defines a message for updating zoneconcierge module parameters. message MsgUpdateParams { - option (cosmos.msg.v1.signer) = "authority"; - - // authority is the address of the governance account. - // just FYI: cosmos.AddressString marks that this field should use type alias - // for AddressString instead of string, but the functionality is not yet implemented - // in cosmos-proto - string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - - // params defines the zoneconcierge parameters to update. - // - // NOTE: All parameters must be supplied. - Params params = 2 [(gogoproto.nullable) = false]; + option (cosmos.msg.v1.signer) = "authority"; + + // authority is the address of the governance account. + // just FYI: cosmos.AddressString marks that this field should use type alias + // for AddressString instead of string, but the functionality is not yet implemented + // in cosmos-proto + string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // params defines the zoneconcierge parameters to update. + // + // NOTE: All parameters must be supplied. + Params params = 2 [(gogoproto.nullable) = false]; } - + // MsgUpdateParamsResponse is the response to the MsgUpdateParams message. message MsgUpdateParamsResponse {} + +// MsgRegisterChain defines a message for registering CZ chains to the zoneconcierge module. +message MsgRegisterChain { + option (cosmos.msg.v1.signer) = "signer"; + + string signer = 1; + // chain_id is the ID of the chain + string chain_id = 2; + // chain_name is the name of the chain + string chain_name = 3; + // chain_description is a description for the chain (can be empty) + string chain_description = 4; +} + +// MsgRegisterChainResponse is the response to the MsgRegisterChain message. +message MsgRegisterChainResponse {} diff --git a/proto/babylon/zoneconcierge/v1/zoneconcierge.proto b/proto/babylon/zoneconcierge/v1/zoneconcierge.proto index 47e316a0f..3fa3ac53e 100644 --- a/proto/babylon/zoneconcierge/v1/zoneconcierge.proto +++ b/proto/babylon/zoneconcierge/v1/zoneconcierge.proto @@ -82,6 +82,16 @@ message ChainInfoWithProof { tendermint.crypto.ProofOps proof_header_in_epoch = 2; } +// ChainRegister is the registration information of a CZ +message ChainRegister { + // chain_id is the ID of the chain + string chain_id = 1; + // chain_name is the name of the chain + string chain_name = 2; + // chain_description is a description for the chain (can be empty) + string chain_description = 3; +} + // FinalizedChainInfo is the information of a CZ that is BTC-finalised message FinalizedChainInfo { // chain_id is the ID of the chain diff --git a/x/zoneconcierge/keeper/consumer_chain_registry.go b/x/zoneconcierge/keeper/consumer_chain_registry.go new file mode 100644 index 000000000..bc0159dac --- /dev/null +++ b/x/zoneconcierge/keeper/consumer_chain_registry.go @@ -0,0 +1,56 @@ +package keeper + +import ( + "context" + "github.com/cosmos/cosmos-sdk/runtime" + + "cosmossdk.io/store/prefix" + "github.com/babylonchain/babylon/x/zoneconcierge/types" +) + +func (k Keeper) SetChainRegister(ctx context.Context, chainRegister *types.ChainRegister) { + store := k.chainRegistryStore(ctx) + store.Set([]byte(chainRegister.ChainId), k.cdc.MustMarshal(chainRegister)) +} + +// IsChainRegistered returns whether the chain register exists for a given ID +func (k Keeper) IsChainRegistered(ctx context.Context, chainID string) bool { + store := k.chainRegistryStore(ctx) + return store.Has([]byte(chainID)) +} + +// GetChainRegister returns the ChainRegister struct for a chain with a given ID. +func (k Keeper) GetChainRegister(ctx context.Context, chainID string) (*types.ChainRegister, error) { + if !k.IsChainRegistered(ctx, chainID) { + return nil, types.ErrChainNotRegistered + } + + store := k.chainRegistryStore(ctx) + chainRegisterBytes := store.Get([]byte(chainID)) + var chainRegister types.ChainRegister + k.cdc.MustUnmarshal(chainRegisterBytes, &chainRegister) + return &chainRegister, nil +} + +// GetAllRegisteredChainIDs gets all chain IDs that registered to Babylon +func (k Keeper) GetAllRegisteredChainIDs(ctx context.Context) []string { + chainIDs := []string{} + iter := k.chainRegistryStore(ctx).Iterator(nil, nil) + defer iter.Close() + + for ; iter.Valid(); iter.Next() { + chainIDBytes := iter.Key() + chainID := string(chainIDBytes) + chainIDs = append(chainIDs, chainID) + } + return chainIDs +} + +// chainRegistryStore stores the information of registered CZ chains +// prefix: ChainRegisterKey +// key: chainID +// value: ChainRegister +func (k Keeper) chainRegistryStore(ctx context.Context) prefix.Store { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + return prefix.NewStore(storeAdapter, types.ChainRegisterKey) +} diff --git a/x/zoneconcierge/keeper/consumer_chain_registry_test.go b/x/zoneconcierge/keeper/consumer_chain_registry_test.go new file mode 100644 index 000000000..d82054606 --- /dev/null +++ b/x/zoneconcierge/keeper/consumer_chain_registry_test.go @@ -0,0 +1,55 @@ +package keeper_test + +import ( + "github.com/babylonchain/babylon/x/zoneconcierge/types" + "math/rand" + "testing" + + "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/testutil/datagen" + "github.com/stretchr/testify/require" +) + +func FuzzChainRegistry(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + zcKeeper := babylonApp.ZoneConciergeKeeper + ctx := babylonApp.NewContext(false) + // Create a random chain id that starts with "test-" + czChainID := "test-" + datagen.GenRandomHexStr(r, 10) + + // check that the chain is not registered + isRegistered := zcKeeper.IsChainRegistered(ctx, czChainID) + require.False(t, isRegistered) + // Create a random chain name + czChainName := datagen.GenRandomHexStr(r, 5) + // Create a random chain description + czChainDesc := "Chain description: " + datagen.GenRandomHexStr(r, 15) + + // Check that the chain is not registered + chainRegister, err := zcKeeper.GetChainRegister(ctx, czChainID) + require.Error(t, err) + require.Nil(t, chainRegister) + + // Populate ChainRegister object + chainRegister = &types.ChainRegister{ + ChainId: czChainID, + ChainName: czChainName, + ChainDescription: czChainDesc, + } + + // Register the chain + zcKeeper.SetChainRegister(ctx, chainRegister) + + // check that the chain is registered + chainRegister, err = zcKeeper.GetChainRegister(ctx, czChainID) + require.NoError(t, err) + require.Equal(t, czChainID, chainRegister.ChainId) + require.Equal(t, czChainName, chainRegister.ChainName) + require.Equal(t, czChainDesc, chainRegister.ChainDescription) + }) +} diff --git a/x/zoneconcierge/keeper/grpc_query.go b/x/zoneconcierge/keeper/grpc_query.go index 7d9e0226e..cb5a6c14d 100644 --- a/x/zoneconcierge/keeper/grpc_query.go +++ b/x/zoneconcierge/keeper/grpc_query.go @@ -13,7 +13,7 @@ import ( var _ types.QueryServer = Keeper{} -const maxQueryChainsInfoLimit = 100 +const maxQueryChainsLimit = 100 func (k Keeper) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { if req == nil { @@ -61,8 +61,8 @@ func (k Keeper) ChainsInfo(c context.Context, req *types.QueryChainsInfoRequest) } // return if chain IDs exceed the limit - if len(req.ChainIds) > maxQueryChainsInfoLimit { - return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) + if len(req.ChainIds) > maxQueryChainsLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsLimit) } // return if chain IDs contain duplicates or empty strings @@ -122,8 +122,8 @@ func (k Keeper) EpochChainsInfo(c context.Context, req *types.QueryEpochChainsIn } // return if chain IDs exceed the limit - if len(req.ChainIds) > maxQueryChainsInfoLimit { - return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) + if len(req.ChainIds) > maxQueryChainsLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsLimit) } // return if chain IDs contain duplicates or empty strings @@ -225,8 +225,8 @@ func (k Keeper) FinalizedChainsInfo(c context.Context, req *types.QueryFinalized } // return if chain IDs exceed the limit - if len(req.ChainIds) > maxQueryChainsInfoLimit { - return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) + if len(req.ChainIds) > maxQueryChainsLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsLimit) } // return if chain IDs contain duplicates or empty strings @@ -401,3 +401,64 @@ func (k Keeper) FinalizedChainInfoUntilHeight(c context.Context, req *types.Quer return resp, nil } + +func (k Keeper) ChainRegistryList(c context.Context, req *types.QueryChainRegistryListRequest) (*types.QueryChainRegistryListResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(c) + + chainIDs := []string{} + store := k.chainRegistryStore(ctx) + pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { + chainID := string(key) + chainIDs = append(chainIDs, chainID) + return nil + }) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + resp := &types.QueryChainRegistryListResponse{ + ChainIds: chainIDs, + Pagination: pageRes, + } + return resp, nil +} + +// ChainsRegistry returns the registration for a given list of chains +func (k Keeper) ChainsRegistry(c context.Context, req *types.QueryChainsRegistryRequest) (*types.QueryChainsRegistryResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + // return if no chain IDs are provided + if len(req.ChainIds) == 0 { + return nil, status.Error(codes.InvalidArgument, "chain IDs cannot be empty") + } + + // return if chain IDs exceed the limit + if len(req.ChainIds) > maxQueryChainsLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsLimit) + } + + // return if chain IDs contain duplicates or empty strings + if err := bbntypes.CheckForDuplicatesAndEmptyStrings(req.ChainIds); err != nil { + return nil, status.Error(codes.InvalidArgument, types.ErrInvalidChainIDs.Wrap(err.Error()).Error()) + } + + ctx := sdk.UnwrapSDKContext(c) + var chainsRegister []*types.ChainRegister + for _, chainID := range req.ChainIds { + chainRegister, err := k.GetChainRegister(ctx, chainID) + if err != nil { + return nil, err + } + + chainsRegister = append(chainsRegister, chainRegister) + } + + resp := &types.QueryChainsRegistryResponse{ChainsRegister: chainsRegister} + return resp, nil +} diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index 08c5cab8b..6db74814f 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -25,6 +25,10 @@ type chainInfo struct { headerStartHeight uint64 } +type chainRegister struct { + chainID string +} + func FuzzChainList(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) @@ -436,3 +440,86 @@ func FuzzFinalizedChainInfo(f *testing.F) { } }) } + +func FuzzChainRegistryList(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + zcKeeper := babylonApp.ZoneConciergeKeeper + ctx := babylonApp.NewContext(false) + + // invoke the chain registration a random number of times with random chain IDs + numRegistrations := datagen.RandomInt(r, 100) + 1 + var allChainIDs []string + for i := uint64(0); i < numRegistrations; i++ { + var chainID = datagen.GenRandomHexStr(r, 30) + allChainIDs = append(allChainIDs, chainID) + + zcKeeper.SetChainRegister(ctx, &zctypes.ChainRegister{ + ChainId: chainID, + ChainName: datagen.GenRandomHexStr(r, 5), + }) + } + + limit := datagen.RandomInt(r, len(allChainIDs)) + 1 + + // Query to get actual chain IDs + resp, err := zcKeeper.ChainRegistryList(ctx, &zctypes.QueryChainRegistryListRequest{ + Pagination: &query.PageRequest{ + Limit: limit, + }, + }) + require.NoError(t, err) + actualChainIDs := resp.ChainIds + + require.Equal(t, limit, uint64(len(actualChainIDs))) + for i := uint64(0); i < limit; i++ { + require.Contains(t, allChainIDs, actualChainIDs[i]) + } + }) +} + +func FuzzChainsRegistry(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + zcKeeper := babylonApp.ZoneConciergeKeeper + ctx := babylonApp.NewContext(false) + + var ( + chainsRegister []chainRegister + chainIDs []string + ) + // invoke the chain registration a random number of times with random chain IDs + numChains := datagen.RandomInt(r, 100) + 1 + for i := uint64(0); i < numChains; i++ { + chainID := datagen.GenRandomHexStr(r, 30) + + chainIDs = append(chainIDs, chainID) + chainsRegister = append(chainsRegister, chainRegister{ + chainID: chainID, + }) + + zcKeeper.SetChainRegister(ctx, &zctypes.ChainRegister{ + ChainId: chainID, + ChainName: datagen.GenRandomHexStr(r, 5), + }) + + } + + resp, err := zcKeeper.ChainsRegistry(ctx, &zctypes.QueryChainsRegistryRequest{ + ChainIds: chainIDs, + }) + require.NoError(t, err) + + for i, respData := range resp.ChainsRegister { + require.Equal(t, chainsRegister[i].chainID, respData.ChainId) + } + }) +} diff --git a/x/zoneconcierge/keeper/keeper.go b/x/zoneconcierge/keeper/keeper.go index b34290f6e..23223c902 100644 --- a/x/zoneconcierge/keeper/keeper.go +++ b/x/zoneconcierge/keeper/keeper.go @@ -31,8 +31,8 @@ type ( epochingKeeper types.EpochingKeeper storeQuerier storetypes.Queryable scopedKeeper types.ScopedKeeper - // the address capable of executing a MsgUpdateParams message. Typically, this - // should be the x/gov module account. + // The address capable of executing a MsgUpdateParams message. + // Typically, this should be the x/gov module account. authority string } ) diff --git a/x/zoneconcierge/keeper/msg_server.go b/x/zoneconcierge/keeper/msg_server.go index dee48dd04..6b7e66861 100644 --- a/x/zoneconcierge/keeper/msg_server.go +++ b/x/zoneconcierge/keeper/msg_server.go @@ -37,3 +37,25 @@ func (ms msgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdatePara return &types.MsgUpdateParamsResponse{}, nil } + +// RegisterChain registers a CZ chain +func (ms msgServer) RegisterChain(goCtx context.Context, req *types.MsgRegisterChain) (*types.MsgRegisterChainResponse, error) { + // Create ChanRegister from MsgRegisterChain + chainRegister := types.ChainRegister{ + ChainId: req.ChainId, + ChainName: req.ChainName, + ChainDescription: req.ChainDescription, + } + + if err := chainRegister.Validate(); err != nil { + return nil, types.ErrInvalidChainRegister.Wrapf("invalid chain: %v", err) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + if ms.IsChainRegistered(ctx, req.ChainId) { + return nil, types.ErrChainAlreadyRegistered + } + ms.SetChainRegister(ctx, &chainRegister) + + return &types.MsgRegisterChainResponse{}, nil +} diff --git a/x/zoneconcierge/types/chain_register.go b/x/zoneconcierge/types/chain_register.go new file mode 100644 index 000000000..82e856e63 --- /dev/null +++ b/x/zoneconcierge/types/chain_register.go @@ -0,0 +1,17 @@ +package types + +import ( + "fmt" +) + +// Validate validates the set of params +func (cr ChainRegister) Validate() error { + if len(cr.ChainId) == 0 { + return fmt.Errorf("ChainId must be non-empty") + } + if len(cr.ChainName) == 0 { + return fmt.Errorf("ChainName must be non-empty") + } + + return nil +} diff --git a/x/zoneconcierge/types/msg.go b/x/zoneconcierge/types/msg.go index 782e3dcc1..c091bafc2 100644 --- a/x/zoneconcierge/types/msg.go +++ b/x/zoneconcierge/types/msg.go @@ -7,4 +7,5 @@ import ( // ensure that these message types implement the sdk.Msg interface var ( _ sdk.Msg = &MsgUpdateParams{} + _ sdk.Msg = &MsgRegisterChain{} ) diff --git a/x/zoneconcierge/types/query.pb.go b/x/zoneconcierge/types/query.pb.go index 64d219deb..5f95bb127 100644 --- a/x/zoneconcierge/types/query.pb.go +++ b/x/zoneconcierge/types/query.pb.go @@ -986,6 +986,197 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) GetProof() *ProofFinalizedC return nil } +// QueryChainRegistryListRequest is request type for the Query/ChainRegistryList RPC method +type QueryChainRegistryListRequest struct { + // pagination defines whether to have the pagination in the request + Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryChainRegistryListRequest) Reset() { *m = QueryChainRegistryListRequest{} } +func (m *QueryChainRegistryListRequest) String() string { return proto.CompactTextString(m) } +func (*QueryChainRegistryListRequest) ProtoMessage() {} +func (*QueryChainRegistryListRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cd665af90102da38, []int{18} +} +func (m *QueryChainRegistryListRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainRegistryListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainRegistryListRequest.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 *QueryChainRegistryListRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainRegistryListRequest.Merge(m, src) +} +func (m *QueryChainRegistryListRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryChainRegistryListRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainRegistryListRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainRegistryListRequest proto.InternalMessageInfo + +func (m *QueryChainRegistryListRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +// QueryChainRegistryListResponse is response type for the Query/ChainRegistryList RPC method +type QueryChainRegistryListResponse struct { + // chain_ids are IDs of the chains in ascending alphabetical order + ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` + // pagination defines the pagination in the response + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryChainRegistryListResponse) Reset() { *m = QueryChainRegistryListResponse{} } +func (m *QueryChainRegistryListResponse) String() string { return proto.CompactTextString(m) } +func (*QueryChainRegistryListResponse) ProtoMessage() {} +func (*QueryChainRegistryListResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cd665af90102da38, []int{19} +} +func (m *QueryChainRegistryListResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainRegistryListResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainRegistryListResponse.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 *QueryChainRegistryListResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainRegistryListResponse.Merge(m, src) +} +func (m *QueryChainRegistryListResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryChainRegistryListResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainRegistryListResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainRegistryListResponse proto.InternalMessageInfo + +func (m *QueryChainRegistryListResponse) GetChainIds() []string { + if m != nil { + return m.ChainIds + } + return nil +} + +func (m *QueryChainRegistryListResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + +// QueryChainsRegistryRequest is request type for the Query/ChainsRegistry RPC method. +type QueryChainsRegistryRequest struct { + ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` +} + +func (m *QueryChainsRegistryRequest) Reset() { *m = QueryChainsRegistryRequest{} } +func (m *QueryChainsRegistryRequest) String() string { return proto.CompactTextString(m) } +func (*QueryChainsRegistryRequest) ProtoMessage() {} +func (*QueryChainsRegistryRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cd665af90102da38, []int{20} +} +func (m *QueryChainsRegistryRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainsRegistryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainsRegistryRequest.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 *QueryChainsRegistryRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainsRegistryRequest.Merge(m, src) +} +func (m *QueryChainsRegistryRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryChainsRegistryRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainsRegistryRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainsRegistryRequest proto.InternalMessageInfo + +func (m *QueryChainsRegistryRequest) GetChainIds() []string { + if m != nil { + return m.ChainIds + } + return nil +} + +// QueryChainsRegistryResponse is response type for the Query/ChainsRegistry RPC method. +type QueryChainsRegistryResponse struct { + ChainsRegister []*ChainRegister `protobuf:"bytes,1,rep,name=chains_register,json=chainsRegister,proto3" json:"chains_register,omitempty"` +} + +func (m *QueryChainsRegistryResponse) Reset() { *m = QueryChainsRegistryResponse{} } +func (m *QueryChainsRegistryResponse) String() string { return proto.CompactTextString(m) } +func (*QueryChainsRegistryResponse) ProtoMessage() {} +func (*QueryChainsRegistryResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cd665af90102da38, []int{21} +} +func (m *QueryChainsRegistryResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainsRegistryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainsRegistryResponse.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 *QueryChainsRegistryResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainsRegistryResponse.Merge(m, src) +} +func (m *QueryChainsRegistryResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryChainsRegistryResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainsRegistryResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainsRegistryResponse proto.InternalMessageInfo + +func (m *QueryChainsRegistryResponse) GetChainsRegister() []*ChainRegister { + if m != nil { + return m.ChainsRegister + } + return nil +} + func init() { proto.RegisterType((*QueryParamsRequest)(nil), "babylon.zoneconcierge.v1.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "babylon.zoneconcierge.v1.QueryParamsResponse") @@ -1005,6 +1196,10 @@ func init() { proto.RegisterType((*QueryFinalizedChainsInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainsInfoResponse") proto.RegisterType((*QueryFinalizedChainInfoUntilHeightRequest)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightRequest") proto.RegisterType((*QueryFinalizedChainInfoUntilHeightResponse)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightResponse") + proto.RegisterType((*QueryChainRegistryListRequest)(nil), "babylon.zoneconcierge.v1.QueryChainRegistryListRequest") + proto.RegisterType((*QueryChainRegistryListResponse)(nil), "babylon.zoneconcierge.v1.QueryChainRegistryListResponse") + proto.RegisterType((*QueryChainsRegistryRequest)(nil), "babylon.zoneconcierge.v1.QueryChainsRegistryRequest") + proto.RegisterType((*QueryChainsRegistryResponse)(nil), "babylon.zoneconcierge.v1.QueryChainsRegistryResponse") } func init() { @@ -1012,81 +1207,89 @@ func init() { } var fileDescriptor_cd665af90102da38 = []byte{ - // 1176 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6f, 0xdc, 0x44, - 0x14, 0x8e, 0xf3, 0xab, 0xc9, 0x5b, 0x0a, 0xd5, 0x24, 0x2d, 0x8b, 0xdb, 0x6e, 0x22, 0x43, 0x69, - 0x5a, 0x12, 0x9b, 0x4d, 0x49, 0xab, 0x72, 0xa0, 0x6a, 0x52, 0x92, 0x46, 0x45, 0xa5, 0x35, 0x04, - 0x24, 0x2e, 0xc6, 0xf6, 0xce, 0x7a, 0xad, 0x64, 0x3d, 0x5b, 0xdb, 0xbb, 0xed, 0x36, 0x84, 0x03, - 0xea, 0x1d, 0x24, 0x2e, 0x88, 0x13, 0x27, 0x0e, 0x1c, 0x7a, 0xe3, 0x4f, 0x40, 0xea, 0x81, 0x43, - 0x25, 0x2e, 0x9c, 0x10, 0x4a, 0xf8, 0x37, 0x90, 0x90, 0x67, 0xc6, 0xbb, 0xfe, 0xb9, 0xeb, 0x0d, - 0xb9, 0xed, 0x8c, 0xdf, 0xfb, 0xbe, 0xef, 0xbd, 0x79, 0x33, 0xef, 0x2d, 0xbc, 0x65, 0xe8, 0x46, - 0x77, 0x8f, 0x38, 0xca, 0x53, 0xe2, 0x60, 0x93, 0x38, 0xa6, 0x8d, 0x5d, 0x0b, 0x2b, 0x9d, 0xaa, - 0xf2, 0xa8, 0x8d, 0xdd, 0xae, 0xdc, 0x72, 0x89, 0x4f, 0x50, 0x99, 0x5b, 0xc9, 0x31, 0x2b, 0xb9, - 0x53, 0x15, 0xe7, 0x2d, 0x62, 0x11, 0x6a, 0xa4, 0x04, 0xbf, 0x98, 0xbd, 0x78, 0xc1, 0x22, 0xc4, - 0xda, 0xc3, 0x8a, 0xde, 0xb2, 0x15, 0xdd, 0x71, 0x88, 0xaf, 0xfb, 0x36, 0x71, 0x3c, 0xfe, 0xf5, - 0xaa, 0x49, 0xbc, 0x26, 0xf1, 0x14, 0x43, 0xf7, 0x30, 0xa3, 0x51, 0x3a, 0x55, 0x03, 0xfb, 0x7a, - 0x55, 0x69, 0xe9, 0x96, 0xed, 0x50, 0x63, 0x6e, 0xbb, 0x1c, 0xea, 0x33, 0x7c, 0xd3, 0x6c, 0x60, - 0x73, 0xb7, 0x45, 0x6c, 0xc7, 0x0f, 0xf4, 0xc5, 0x36, 0xb8, 0xf5, 0x95, 0xd0, 0xba, 0xff, 0xc5, - 0x76, 0xac, 0xc0, 0x3a, 0x65, 0x2a, 0x85, 0xa6, 0xb8, 0x45, 0xcc, 0x06, 0xb7, 0x0a, 0x7f, 0x27, - 0xc9, 0x53, 0xc9, 0x89, 0xe7, 0x81, 0x59, 0x5f, 0xca, 0xb5, 0x6e, 0xe9, 0xae, 0xde, 0xe4, 0xd1, - 0x4b, 0xf3, 0x80, 0x1e, 0x06, 0x31, 0x3f, 0xa0, 0x9b, 0x2a, 0x7e, 0xd4, 0xc6, 0x9e, 0x2f, 0xed, - 0xc0, 0x5c, 0x6c, 0xd7, 0x6b, 0x11, 0xc7, 0xc3, 0xe8, 0x03, 0x98, 0x66, 0xce, 0x65, 0x61, 0x51, - 0x58, 0x2a, 0xad, 0x2e, 0xca, 0x79, 0x27, 0x21, 0x33, 0xcf, 0xf5, 0xc9, 0x17, 0x7f, 0x2d, 0x8c, - 0xa9, 0xdc, 0x4b, 0xda, 0xe2, 0x64, 0x77, 0xb1, 0x5e, 0xc3, 0x2e, 0x27, 0x43, 0x6f, 0xc0, 0x8c, - 0xd9, 0xd0, 0x6d, 0x47, 0xb3, 0x6b, 0x14, 0x77, 0x56, 0x3d, 0x45, 0xd7, 0xdb, 0x35, 0x74, 0x0e, - 0xa6, 0x1b, 0xd8, 0xb6, 0x1a, 0x7e, 0x79, 0x7c, 0x51, 0x58, 0x9a, 0x54, 0xf9, 0x4a, 0xfa, 0x51, - 0xe0, 0x02, 0x43, 0x24, 0x2e, 0xf0, 0x56, 0x60, 0x1f, 0xec, 0x70, 0x81, 0x97, 0xf3, 0x05, 0x6e, - 0x3b, 0x35, 0xfc, 0x04, 0xd7, 0x38, 0x00, 0x77, 0x43, 0xeb, 0xf0, 0x4a, 0x9d, 0xb8, 0xbb, 0x1a, - 0x5b, 0x7a, 0x94, 0xb6, 0xb4, 0xba, 0x90, 0x0f, 0xb3, 0x49, 0xdc, 0x5d, 0x4f, 0x2d, 0x05, 0x4e, - 0x0c, 0xca, 0x93, 0x34, 0x38, 0x4b, 0xb5, 0x6d, 0x04, 0x41, 0x7c, 0x64, 0x7b, 0x7e, 0x18, 0xe8, - 0x26, 0x40, 0xbf, 0xa2, 0xb8, 0xc2, 0xb7, 0x65, 0x56, 0x7e, 0x72, 0x50, 0x7e, 0x32, 0xab, 0x72, - 0x5e, 0x7e, 0xf2, 0x03, 0xdd, 0xc2, 0xdc, 0x57, 0x8d, 0x78, 0x4a, 0x5f, 0xc3, 0xb9, 0x24, 0x01, - 0x8f, 0xff, 0x3c, 0xcc, 0x86, 0xa9, 0x0c, 0xce, 0x68, 0x62, 0x69, 0x56, 0x9d, 0xe1, 0xb9, 0xf4, - 0xd0, 0x56, 0x8c, 0x7e, 0x9c, 0x27, 0x68, 0x18, 0x3d, 0x43, 0x8e, 0xf1, 0xaf, 0x45, 0xf9, 0xbd, - 0x6d, 0xa7, 0x4e, 0xc2, 0x08, 0x07, 0xf1, 0x4b, 0x1a, 0xbc, 0x9e, 0x72, 0xe3, 0xba, 0xef, 0x40, - 0x89, 0x9a, 0x79, 0x9a, 0xed, 0xd4, 0x09, 0xf5, 0x2c, 0xad, 0xbe, 0x99, 0x9f, 0x75, 0x0a, 0x41, - 0x11, 0xc0, 0xec, 0xa1, 0x49, 0x9f, 0xc3, 0x79, 0x4a, 0xf0, 0x61, 0x70, 0x6f, 0x32, 0xc5, 0xd1, - 0x1b, 0xa5, 0x39, 0xed, 0x26, 0xcd, 0xfe, 0xa4, 0x3a, 0x43, 0x37, 0xee, 0xb7, 0x9b, 0x71, 0xe5, - 0xe3, 0x09, 0xe5, 0x35, 0xb8, 0x90, 0x0d, 0x7c, 0xa2, 0xf2, 0xbf, 0xe2, 0xf9, 0x09, 0x4e, 0x94, - 0xd7, 0x52, 0x81, 0x2b, 0xb2, 0x99, 0x71, 0xaa, 0xc7, 0x29, 0xaa, 0x9f, 0x05, 0x28, 0xa7, 0xe9, - 0x79, 0x80, 0xb7, 0xe1, 0x54, 0x78, 0x23, 0x58, 0x70, 0x85, 0x2f, 0x56, 0xe8, 0x77, 0x72, 0xd5, - 0xf7, 0x19, 0x3f, 0x8c, 0x40, 0x27, 0x3d, 0x90, 0x44, 0xae, 0x06, 0x1e, 0x73, 0x34, 0x91, 0xe3, - 0xb1, 0x44, 0x4a, 0x06, 0x5c, 0xcc, 0xc1, 0x3d, 0xb1, 0x24, 0x48, 0x9f, 0xc2, 0x02, 0xe5, 0xd8, - 0xb4, 0x1d, 0x7d, 0xcf, 0x7e, 0x8a, 0x6b, 0xa3, 0x5d, 0x21, 0x34, 0x0f, 0x53, 0x2d, 0x97, 0x74, - 0x30, 0xd5, 0x3e, 0xa3, 0xb2, 0x85, 0xf4, 0x4c, 0x80, 0xc5, 0x7c, 0x58, 0xae, 0xfe, 0x4b, 0x38, - 0x5b, 0x0f, 0x3f, 0x6b, 0xe9, 0x6a, 0x5d, 0x1e, 0xf0, 0xc4, 0xc5, 0x50, 0x29, 0xe8, 0x5c, 0x3d, - 0xcd, 0x24, 0xf9, 0x70, 0x25, 0x43, 0x45, 0xf0, 0x69, 0xc7, 0xf1, 0xed, 0xbd, 0xbb, 0xf4, 0xe9, - 0x3e, 0xfe, 0xa3, 0xdf, 0x0f, 0x7e, 0x22, 0x1a, 0xfc, 0xf3, 0x09, 0xb8, 0x5a, 0x84, 0x96, 0xa7, - 0x61, 0x07, 0xe6, 0x13, 0x69, 0x08, 0xb3, 0x20, 0x14, 0xbd, 0xb3, 0xa8, 0x9e, 0x62, 0x42, 0x37, - 0x01, 0x58, 0xd1, 0x51, 0x30, 0x56, 0xdd, 0x62, 0x0f, 0xac, 0xd7, 0xc8, 0x3b, 0x55, 0x99, 0x96, - 0x96, 0xca, 0x4a, 0x94, 0xba, 0xde, 0x87, 0x57, 0x5d, 0xfd, 0xb1, 0xd6, 0x1f, 0x09, 0x68, 0x7c, - 0xd1, 0xea, 0x8a, 0x8d, 0x0f, 0x01, 0x86, 0xaa, 0x3f, 0xde, 0xe8, 0xed, 0xa9, 0xa7, 0xdd, 0xe8, - 0x12, 0xed, 0x00, 0x32, 0x7c, 0x53, 0xf3, 0xda, 0x46, 0xd3, 0xf6, 0x3c, 0x9b, 0x38, 0xda, 0x2e, - 0xee, 0x96, 0x27, 0x13, 0x98, 0xf1, 0x79, 0xa5, 0x53, 0x95, 0x3f, 0xe9, 0xd9, 0xdf, 0xc3, 0x5d, - 0xf5, 0x8c, 0xe1, 0x9b, 0xb1, 0x1d, 0xb4, 0x45, 0xb3, 0x4f, 0xea, 0xe5, 0x29, 0x8a, 0x54, 0x1d, - 0xd0, 0xfa, 0x03, 0xb3, 0x8c, 0xa2, 0x61, 0xfe, 0xab, 0xcf, 0x4e, 0xc3, 0x14, 0x3d, 0x30, 0xf4, - 0xad, 0x00, 0xd3, 0x6c, 0x4e, 0x40, 0x03, 0xca, 0x2f, 0x3d, 0x9e, 0x88, 0x2b, 0x05, 0xad, 0xd9, - 0x99, 0x4b, 0x4b, 0xdf, 0xfc, 0xf1, 0xcf, 0xf7, 0xe3, 0x12, 0x5a, 0x54, 0x86, 0xcc, 0x44, 0xe8, - 0xb9, 0x00, 0xd3, 0xec, 0xce, 0x0e, 0x55, 0x14, 0x9b, 0x61, 0x86, 0x2a, 0x8a, 0xcf, 0x29, 0xd2, - 0x16, 0x55, 0x74, 0x1b, 0xdd, 0xca, 0x57, 0xd4, 0xaf, 0x4d, 0x65, 0x3f, 0xbc, 0x29, 0x07, 0x0a, - 0x7b, 0x48, 0x94, 0x7d, 0x76, 0x25, 0x0e, 0xd0, 0x0f, 0x02, 0xcc, 0xf6, 0xc6, 0x00, 0xa4, 0x0c, - 0x51, 0x91, 0x9c, 0x48, 0xc4, 0x77, 0x8b, 0x3b, 0x14, 0xcf, 0x25, 0x7b, 0x5c, 0xd0, 0x4f, 0x02, - 0x40, 0xff, 0x75, 0x40, 0x85, 0xa8, 0xa2, 0x2f, 0xa1, 0x58, 0x1d, 0xc1, 0x83, 0xab, 0x5b, 0xa1, - 0xea, 0x2e, 0xa3, 0x4b, 0xc3, 0xd4, 0xd1, 0xc4, 0xa2, 0x5f, 0x05, 0x78, 0x2d, 0xd1, 0xd3, 0xd1, - 0xda, 0x10, 0xd6, 0xec, 0xe1, 0x42, 0xbc, 0x3e, 0xaa, 0x1b, 0x57, 0x7c, 0x8d, 0x2a, 0x5e, 0x41, - 0xef, 0xe4, 0x2b, 0x66, 0x0f, 0x4b, 0x54, 0xf7, 0x2f, 0x02, 0x94, 0x22, 0x6d, 0x1a, 0x0d, 0xcb, - 0x54, 0x7a, 0xa2, 0x10, 0x57, 0x47, 0x71, 0xe1, 0x5a, 0xdf, 0xa3, 0x5a, 0x65, 0xb4, 0x9c, 0xaf, - 0x95, 0x37, 0xba, 0x48, 0xc9, 0xa2, 0xdf, 0x05, 0x38, 0x93, 0xec, 0xa9, 0xe8, 0x7a, 0x01, 0xfa, - 0x8c, 0xe6, 0x2e, 0xde, 0x18, 0xd9, 0xaf, 0xf8, 0x8d, 0x4b, 0x6b, 0x67, 0xa9, 0xf7, 0x94, 0xfd, - 0xde, 0x40, 0x71, 0x80, 0x7e, 0x13, 0x60, 0x2e, 0xa3, 0xcf, 0xa2, 0x9b, 0x43, 0x94, 0xe5, 0xb7, - 0x7c, 0xf1, 0xfd, 0xe3, 0xb8, 0xf2, 0xb8, 0x6e, 0xd0, 0xb8, 0xaa, 0x48, 0xc9, 0x8f, 0x2b, 0xb3, - 0xed, 0xa3, 0x7f, 0x05, 0xb8, 0x38, 0xb0, 0x65, 0xa2, 0x8d, 0x91, 0x64, 0x65, 0xf7, 0x79, 0xf1, - 0xce, 0xff, 0x03, 0xe1, 0x51, 0x3e, 0xa4, 0x51, 0xde, 0x43, 0xdb, 0x85, 0xa3, 0xcc, 0x78, 0x39, - 0x03, 0xc4, 0xde, 0xcb, 0xb9, 0xfe, 0xf1, 0x8b, 0xc3, 0x8a, 0xf0, 0xf2, 0xb0, 0x22, 0xfc, 0x7d, - 0x58, 0x11, 0xbe, 0x3b, 0xaa, 0x8c, 0xbd, 0x3c, 0xaa, 0x8c, 0xfd, 0x79, 0x54, 0x19, 0xfb, 0x62, - 0xcd, 0xb2, 0xfd, 0x46, 0xdb, 0x90, 0x4d, 0xd2, 0x0c, 0xe9, 0x28, 0x4c, 0x8f, 0xfb, 0x49, 0x82, - 0xdd, 0xef, 0xb6, 0xb0, 0x67, 0x4c, 0xd3, 0x3f, 0xd4, 0xd7, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, - 0x03, 0xf9, 0xf2, 0x6b, 0xc4, 0x10, 0x00, 0x00, + // 1308 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcf, 0x6f, 0xdc, 0xc4, + 0x17, 0x8f, 0xf3, 0xab, 0xc9, 0xdb, 0xef, 0x37, 0x29, 0x93, 0xb4, 0x2c, 0x6e, 0xbb, 0x89, 0x0c, + 0xa5, 0x49, 0x9b, 0xd8, 0x6c, 0xda, 0x34, 0x84, 0x03, 0x55, 0x93, 0x92, 0x34, 0x2a, 0x2a, 0xa9, + 0x21, 0x20, 0x71, 0x59, 0xbc, 0xde, 0x59, 0xaf, 0x95, 0xac, 0x67, 0x6b, 0x7b, 0xb7, 0x4d, 0x43, + 0x38, 0x20, 0xc4, 0x15, 0x24, 0x2e, 0x88, 0x13, 0x27, 0x0e, 0x1c, 0x2a, 0x2e, 0x1c, 0x39, 0x22, + 0xf5, 0xc0, 0xa1, 0x12, 0x17, 0x4e, 0x08, 0x25, 0xfc, 0x0f, 0x9c, 0x90, 0x90, 0x67, 0xc6, 0xbb, + 0xb6, 0xd7, 0x5e, 0x7b, 0x43, 0xc4, 0x6d, 0x3d, 0xf3, 0xde, 0xe7, 0x7d, 0xde, 0x9b, 0x37, 0x6f, + 0x3e, 0x5a, 0x78, 0xa5, 0xac, 0x95, 0xf7, 0xf7, 0x88, 0xa5, 0x3c, 0x21, 0x16, 0xd6, 0x89, 0xa5, + 0x9b, 0xd8, 0x36, 0xb0, 0xd2, 0x2a, 0x2a, 0x0f, 0x9b, 0xd8, 0xde, 0x97, 0x1b, 0x36, 0x71, 0x09, + 0xca, 0x73, 0x2b, 0x39, 0x64, 0x25, 0xb7, 0x8a, 0xe2, 0xb4, 0x41, 0x0c, 0x42, 0x8d, 0x14, 0xef, + 0x17, 0xb3, 0x17, 0x2f, 0x1a, 0x84, 0x18, 0x7b, 0x58, 0xd1, 0x1a, 0xa6, 0xa2, 0x59, 0x16, 0x71, + 0x35, 0xd7, 0x24, 0x96, 0xc3, 0x77, 0xaf, 0xea, 0xc4, 0xa9, 0x13, 0x47, 0x29, 0x6b, 0x0e, 0x66, + 0x61, 0x94, 0x56, 0xb1, 0x8c, 0x5d, 0xad, 0xa8, 0x34, 0x34, 0xc3, 0xb4, 0xa8, 0x31, 0xb7, 0x5d, + 0xf0, 0xf9, 0x95, 0x5d, 0x5d, 0xaf, 0x61, 0x7d, 0xb7, 0x41, 0x4c, 0xcb, 0xf5, 0xf8, 0x85, 0x16, + 0xb8, 0xf5, 0xbc, 0x6f, 0xdd, 0xd9, 0x31, 0x2d, 0xc3, 0xb3, 0xee, 0x32, 0x95, 0x7c, 0x53, 0xdc, + 0x20, 0x7a, 0x8d, 0x5b, 0xf9, 0xbf, 0xa3, 0xc1, 0xbb, 0x8a, 0x13, 0xae, 0x03, 0xb3, 0xbe, 0x9c, + 0x68, 0xdd, 0xd0, 0x6c, 0xad, 0xce, 0xb3, 0x97, 0xa6, 0x01, 0x3d, 0xf0, 0x72, 0xde, 0xa6, 0x8b, + 0x2a, 0x7e, 0xd8, 0xc4, 0x8e, 0x2b, 0xed, 0xc0, 0x54, 0x68, 0xd5, 0x69, 0x10, 0xcb, 0xc1, 0xe8, + 0x4d, 0x18, 0x65, 0xce, 0x79, 0x61, 0x56, 0x98, 0xcb, 0x2d, 0xcd, 0xca, 0x49, 0x27, 0x21, 0x33, + 0xcf, 0xb5, 0xe1, 0x67, 0xbf, 0xcf, 0x0c, 0xa8, 0xdc, 0x4b, 0xda, 0xe4, 0xc1, 0xee, 0x62, 0xad, + 0x82, 0x6d, 0x1e, 0x0c, 0xbd, 0x04, 0x63, 0x7a, 0x4d, 0x33, 0xad, 0x92, 0x59, 0xa1, 0xb8, 0xe3, + 0xea, 0x19, 0xfa, 0xbd, 0x55, 0x41, 0xe7, 0x61, 0xb4, 0x86, 0x4d, 0xa3, 0xe6, 0xe6, 0x07, 0x67, + 0x85, 0xb9, 0x61, 0x95, 0x7f, 0x49, 0xdf, 0x08, 0x9c, 0xa0, 0x8f, 0xc4, 0x09, 0xde, 0xf2, 0xec, + 0xbd, 0x15, 0x4e, 0xf0, 0x4a, 0x32, 0xc1, 0x2d, 0xab, 0x82, 0x1f, 0xe3, 0x0a, 0x07, 0xe0, 0x6e, + 0x68, 0x0d, 0xfe, 0x57, 0x25, 0xf6, 0x6e, 0x89, 0x7d, 0x3a, 0x34, 0x6c, 0x6e, 0x69, 0x26, 0x19, + 0x66, 0x83, 0xd8, 0xbb, 0x8e, 0x9a, 0xf3, 0x9c, 0x18, 0x94, 0x23, 0x95, 0xe0, 0x1c, 0xe5, 0xb6, + 0xee, 0x25, 0xf1, 0xb6, 0xe9, 0xb8, 0x7e, 0xa2, 0x1b, 0x00, 0x9d, 0x8e, 0xe2, 0x0c, 0x5f, 0x95, + 0x59, 0xfb, 0xc9, 0x5e, 0xfb, 0xc9, 0xac, 0xcb, 0x79, 0xfb, 0xc9, 0xdb, 0x9a, 0x81, 0xb9, 0xaf, + 0x1a, 0xf0, 0x94, 0x3e, 0x81, 0xf3, 0xd1, 0x00, 0x3c, 0xff, 0x0b, 0x30, 0xee, 0x97, 0xd2, 0x3b, + 0xa3, 0xa1, 0xb9, 0x71, 0x75, 0x8c, 0xd7, 0xd2, 0x41, 0x9b, 0xa1, 0xf0, 0x83, 0xbc, 0x40, 0x69, + 0xe1, 0x19, 0x72, 0x28, 0xfe, 0x72, 0x30, 0xbe, 0xb3, 0x65, 0x55, 0x89, 0x9f, 0x61, 0xaf, 0xf8, + 0x52, 0x09, 0x5e, 0xec, 0x72, 0xe3, 0xbc, 0xef, 0x40, 0x8e, 0x9a, 0x39, 0x25, 0xd3, 0xaa, 0x12, + 0xea, 0x99, 0x5b, 0x7a, 0x39, 0xb9, 0xea, 0x14, 0x82, 0x22, 0x80, 0xde, 0x46, 0x93, 0x3e, 0x80, + 0x0b, 0x34, 0xc0, 0x5b, 0xde, 0xbd, 0x89, 0x25, 0x47, 0x6f, 0x54, 0xc9, 0x6a, 0xd6, 0x69, 0xf5, + 0x87, 0xd5, 0x31, 0xba, 0x70, 0xbf, 0x59, 0x0f, 0x33, 0x1f, 0x8c, 0x30, 0xaf, 0xc0, 0xc5, 0x78, + 0xe0, 0x53, 0xa5, 0xff, 0x31, 0xaf, 0x8f, 0x77, 0xa2, 0xbc, 0x97, 0x32, 0x5c, 0x91, 0x8d, 0x98, + 0x53, 0x3d, 0x49, 0x53, 0x7d, 0x27, 0x40, 0xbe, 0x3b, 0x3c, 0x4f, 0xf0, 0x36, 0x9c, 0xf1, 0x6f, + 0x04, 0x4b, 0x2e, 0xf3, 0xc5, 0xf2, 0xfd, 0x4e, 0xaf, 0xfb, 0xde, 0xe7, 0x87, 0xe1, 0xf1, 0xa4, + 0x07, 0x12, 0xa9, 0x55, 0xcf, 0x63, 0x0e, 0x16, 0x72, 0x30, 0x54, 0x48, 0xa9, 0x0c, 0x97, 0x12, + 0x70, 0x4f, 0xad, 0x08, 0xd2, 0x7b, 0x30, 0x43, 0x63, 0x6c, 0x98, 0x96, 0xb6, 0x67, 0x3e, 0xc1, + 0x95, 0xfe, 0xae, 0x10, 0x9a, 0x86, 0x91, 0x86, 0x4d, 0x5a, 0x98, 0x72, 0x1f, 0x53, 0xd9, 0x87, + 0xf4, 0x99, 0x00, 0xb3, 0xc9, 0xb0, 0x9c, 0xfd, 0x47, 0x70, 0xae, 0xea, 0x6f, 0x97, 0xba, 0xbb, + 0x75, 0xa1, 0xc7, 0x88, 0x0b, 0xa1, 0x52, 0xd0, 0xa9, 0x6a, 0x77, 0x24, 0xc9, 0x85, 0xf9, 0x18, + 0x16, 0xde, 0xd6, 0x8e, 0xe5, 0x9a, 0x7b, 0x77, 0xe9, 0xe8, 0x3e, 0xf9, 0xd0, 0xef, 0x24, 0x3f, + 0x14, 0x4c, 0xfe, 0xe9, 0x10, 0x5c, 0xcd, 0x12, 0x96, 0x97, 0x61, 0x07, 0xa6, 0x23, 0x65, 0xf0, + 0xab, 0x20, 0x64, 0xbd, 0xb3, 0xa8, 0xda, 0x15, 0x09, 0xad, 0x02, 0xb0, 0xa6, 0xa3, 0x60, 0xac, + 0xbb, 0xc5, 0x36, 0x58, 0xfb, 0x21, 0x6f, 0x15, 0x65, 0xda, 0x5a, 0x2a, 0x6b, 0x51, 0xea, 0x7a, + 0x1f, 0x26, 0x6c, 0xed, 0x51, 0xa9, 0x23, 0x09, 0x68, 0x7e, 0xc1, 0xee, 0x0a, 0xc9, 0x07, 0x0f, + 0x43, 0xd5, 0x1e, 0xad, 0xb7, 0xd7, 0xd4, 0xff, 0xdb, 0xc1, 0x4f, 0xb4, 0x03, 0xa8, 0xec, 0xea, + 0x25, 0xa7, 0x59, 0xae, 0x9b, 0x8e, 0x63, 0x12, 0xab, 0xb4, 0x8b, 0xf7, 0xf3, 0xc3, 0x11, 0xcc, + 0xb0, 0x5e, 0x69, 0x15, 0xe5, 0x77, 0xdb, 0xf6, 0xf7, 0xf0, 0xbe, 0x7a, 0xb6, 0xec, 0xea, 0xa1, + 0x15, 0xb4, 0x49, 0xab, 0x4f, 0xaa, 0xf9, 0x11, 0x8a, 0x54, 0xec, 0xf1, 0xf4, 0x7b, 0x66, 0x31, + 0x4d, 0xc3, 0xfc, 0x25, 0x83, 0xdf, 0x33, 0xba, 0xa1, 0x62, 0xc3, 0x74, 0x5c, 0x76, 0xe9, 0x4e, + 0xfb, 0x99, 0xfc, 0x5c, 0x80, 0x42, 0x52, 0xa4, 0xff, 0xf4, 0xbd, 0x5c, 0x05, 0x31, 0xf0, 0xf0, + 0xf9, 0x44, 0x32, 0xbd, 0x99, 0x84, 0x3f, 0x69, 0x51, 0x57, 0xce, 0x7f, 0x1b, 0x26, 0xf9, 0x55, + 0xb6, 0xe9, 0x16, 0x15, 0x3e, 0x29, 0xa3, 0x29, 0x50, 0x0d, 0x6c, 0xab, 0x13, 0x7a, 0x00, 0x19, + 0xdb, 0x4b, 0x7f, 0x4d, 0xc2, 0x08, 0x8d, 0x88, 0xbe, 0x10, 0x60, 0x94, 0xa9, 0x38, 0xd4, 0x63, + 0x38, 0x74, 0x8b, 0x47, 0x71, 0x31, 0xa3, 0x35, 0xcb, 0x41, 0x9a, 0xfb, 0xf4, 0xd7, 0x3f, 0xbf, + 0x1a, 0x94, 0xd0, 0xac, 0x92, 0xa2, 0x58, 0xd1, 0x53, 0x01, 0x46, 0xd9, 0x44, 0x4d, 0x65, 0x14, + 0x52, 0x98, 0xa9, 0x8c, 0xc2, 0x2a, 0x52, 0xda, 0xa4, 0x8c, 0x6e, 0xa3, 0x5b, 0xc9, 0x8c, 0x3a, + 0x93, 0x43, 0x39, 0xf0, 0x4f, 0xef, 0x50, 0x61, 0x63, 0x5e, 0x39, 0x60, 0x03, 0xeb, 0x10, 0x7d, + 0x2d, 0xc0, 0x78, 0x5b, 0xa4, 0x21, 0x25, 0x85, 0x45, 0x54, 0x2f, 0x8a, 0xaf, 0x65, 0x77, 0xc8, + 0x5e, 0x4b, 0x76, 0xde, 0xe8, 0x5b, 0x01, 0xa0, 0x33, 0xbb, 0x51, 0xa6, 0x50, 0xc1, 0x77, 0x4a, + 0x2c, 0xf6, 0xe1, 0xc1, 0xd9, 0x2d, 0x52, 0x76, 0x57, 0xd0, 0xe5, 0x34, 0x76, 0xb4, 0xb0, 0xe8, + 0x47, 0x01, 0x26, 0x23, 0x8a, 0x0b, 0x2d, 0xa7, 0x44, 0x8d, 0x97, 0x7e, 0xe2, 0xcd, 0x7e, 0xdd, + 0x38, 0xe3, 0xeb, 0x94, 0xf1, 0x22, 0xba, 0x96, 0xcc, 0x98, 0x8d, 0xfd, 0x20, 0xef, 0xef, 0x05, + 0xc8, 0x05, 0x44, 0x14, 0x4a, 0xab, 0x54, 0xb7, 0xde, 0x13, 0x97, 0xfa, 0x71, 0xe1, 0x5c, 0x6f, + 0x50, 0xae, 0x32, 0x5a, 0x48, 0xe6, 0xca, 0x65, 0x48, 0xa0, 0x65, 0xd1, 0x2f, 0x02, 0x9c, 0x8d, + 0x2a, 0x1e, 0x74, 0x33, 0x43, 0xf8, 0x18, 0xe9, 0x25, 0xae, 0xf4, 0xed, 0x97, 0xfd, 0xc6, 0x75, + 0x73, 0x67, 0xa5, 0x77, 0x94, 0x83, 0xb6, 0xdc, 0x3b, 0x44, 0x3f, 0x0b, 0x30, 0x15, 0xa3, 0x82, + 0xd0, 0x6a, 0x0a, 0xb3, 0x64, 0x41, 0x26, 0xbe, 0x71, 0x12, 0x57, 0x9e, 0xd7, 0x0a, 0xcd, 0xab, + 0x88, 0x94, 0xe4, 0xbc, 0x62, 0x45, 0x19, 0xfa, 0x5b, 0x80, 0x4b, 0x3d, 0x05, 0x0d, 0x5a, 0xef, + 0x8b, 0x56, 0xbc, 0x0a, 0x13, 0xef, 0xfc, 0x3b, 0x10, 0x9e, 0xe5, 0x03, 0x9a, 0xe5, 0x3d, 0xb4, + 0x95, 0x39, 0xcb, 0x98, 0xc9, 0xe9, 0x21, 0x76, 0x26, 0xe7, 0x4f, 0x02, 0xbc, 0xd0, 0xf5, 0x6c, + 0xa3, 0x95, 0x2c, 0x33, 0x27, 0x46, 0x52, 0x88, 0xaf, 0xf7, 0xef, 0xc8, 0x73, 0x5b, 0xa6, 0xb9, + 0x29, 0x68, 0x31, 0xed, 0x2d, 0xb0, 0xb9, 0x77, 0x69, 0xcf, 0x63, 0xfa, 0x83, 0x00, 0x13, 0xe1, + 0x37, 0x1b, 0xdd, 0xc8, 0x34, 0x30, 0x23, 0xea, 0x40, 0x5c, 0xee, 0xd3, 0x8b, 0xd3, 0x2e, 0x52, + 0xda, 0xd7, 0xd0, 0x7c, 0xea, 0xa8, 0xf5, 0x79, 0xaf, 0xbd, 0xf3, 0xec, 0xa8, 0x20, 0x3c, 0x3f, + 0x2a, 0x08, 0x7f, 0x1c, 0x15, 0x84, 0x2f, 0x8f, 0x0b, 0x03, 0xcf, 0x8f, 0x0b, 0x03, 0xbf, 0x1d, + 0x17, 0x06, 0x3e, 0x5c, 0x36, 0x4c, 0xb7, 0xd6, 0x2c, 0xcb, 0x3a, 0xa9, 0xfb, 0x70, 0xd4, 0xb9, + 0x8d, 0xfd, 0x38, 0x82, 0xee, 0xee, 0x37, 0xb0, 0x53, 0x1e, 0xa5, 0xff, 0x30, 0x5d, 0xff, 0x27, + 0x00, 0x00, 0xff, 0xff, 0x5a, 0x55, 0x70, 0x78, 0xd5, 0x13, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1123,6 +1326,10 @@ type QueryClient interface { // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than // the provided CZ height, with proofs FinalizedChainInfoUntilHeight(ctx context.Context, in *QueryFinalizedChainInfoUntilHeightRequest, opts ...grpc.CallOption) (*QueryFinalizedChainInfoUntilHeightResponse, error) + // ChainRegistryList queries the list of chains that are registered to Babylon + ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) + // ChainsRegistry queries the latest info for a given list of chains in Babylon's view + ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) } type queryClient struct { @@ -1214,6 +1421,24 @@ func (c *queryClient) FinalizedChainInfoUntilHeight(ctx context.Context, in *Que return out, nil } +func (c *queryClient) ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) { + out := new(QueryChainRegistryListResponse) + err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/ChainRegistryList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) { + out := new(QueryChainsRegistryResponse) + err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/ChainsRegistry", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // Params queries the parameters of the module. @@ -1238,6 +1463,10 @@ type QueryServer interface { // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than // the provided CZ height, with proofs FinalizedChainInfoUntilHeight(context.Context, *QueryFinalizedChainInfoUntilHeightRequest) (*QueryFinalizedChainInfoUntilHeightResponse, error) + // ChainRegistryList queries the list of chains that are registered to Babylon + ChainRegistryList(context.Context, *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) + // ChainsRegistry queries the latest info for a given list of chains in Babylon's view + ChainsRegistry(context.Context, *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -1271,6 +1500,12 @@ func (*UnimplementedQueryServer) FinalizedChainsInfo(ctx context.Context, req *Q func (*UnimplementedQueryServer) FinalizedChainInfoUntilHeight(ctx context.Context, req *QueryFinalizedChainInfoUntilHeightRequest) (*QueryFinalizedChainInfoUntilHeightResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FinalizedChainInfoUntilHeight not implemented") } +func (*UnimplementedQueryServer) ChainRegistryList(ctx context.Context, req *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChainRegistryList not implemented") +} +func (*UnimplementedQueryServer) ChainsRegistry(ctx context.Context, req *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChainsRegistry not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -1438,6 +1673,42 @@ func _Query_FinalizedChainInfoUntilHeight_Handler(srv interface{}, ctx context.C return interceptor(ctx, in, info, handler) } +func _Query_ChainRegistryList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryChainRegistryListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ChainRegistryList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.zoneconcierge.v1.Query/ChainRegistryList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ChainRegistryList(ctx, req.(*QueryChainRegistryListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_ChainsRegistry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryChainsRegistryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ChainsRegistry(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.zoneconcierge.v1.Query/ChainsRegistry", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ChainsRegistry(ctx, req.(*QueryChainsRegistryRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.zoneconcierge.v1.Query", HandlerType: (*QueryServer)(nil), @@ -1478,6 +1749,14 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "FinalizedChainInfoUntilHeight", Handler: _Query_FinalizedChainInfoUntilHeight_Handler, }, + { + MethodName: "ChainRegistryList", + Handler: _Query_ChainRegistryList_Handler, + }, + { + MethodName: "ChainsRegistry", + Handler: _Query_ChainsRegistry_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "babylon/zoneconcierge/v1/query.proto", @@ -2213,80 +2492,228 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) MarshalToSizedBuffer(dAtA [ return len(dAtA) - i, nil } -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 +func (m *QueryChainRegistryListRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - var l int - _ = l - return n + return dAtA[:n], nil } -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n +func (m *QueryChainRegistryListRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryHeaderRequest) Size() (n int) { - if m == nil { - return 0 - } +func (m *QueryChainRegistryListRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - if m.Height != 0 { - n += 1 + sovQuery(uint64(m.Height)) + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *QueryHeaderResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Header != nil { - l = m.Header.Size() - n += 1 + l + sovQuery(uint64(l)) - } - if m.ForkHeaders != nil { - l = m.ForkHeaders.Size() - n += 1 + l + sovQuery(uint64(l)) +func (m *QueryChainRegistryListResponse) 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 n + return dAtA[:n], nil } -func (m *QueryChainListRequest) Size() (n int) { - if m == nil { - return 0 - } +func (m *QueryChainRegistryListResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryChainRegistryListResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ChainIds) > 0 { + for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ChainIds[iNdEx]) + copy(dAtA[i:], m.ChainIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryChainsRegistryRequest) 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 *QueryChainsRegistryRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryChainsRegistryRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainIds) > 0 { + for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ChainIds[iNdEx]) + copy(dAtA[i:], m.ChainIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryChainsRegistryResponse) 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 *QueryChainsRegistryResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryChainsRegistryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainsRegister) > 0 { + for iNdEx := len(m.ChainsRegister) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ChainsRegister[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 encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryHeaderRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovQuery(uint64(m.Height)) + } + return n +} + +func (m *QueryHeaderResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovQuery(uint64(l)) + } + if m.ForkHeaders != nil { + l = m.ForkHeaders.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryChainListRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } return n } @@ -2520,6 +2947,68 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) Size() (n int) { return n } +func (m *QueryChainRegistryListRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryChainRegistryListResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChainIds) > 0 { + for _, s := range m.ChainIds { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryChainsRegistryRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChainIds) > 0 { + for _, s := range m.ChainIds { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryChainsRegistryResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChainsRegister) > 0 { + for _, e := range m.ChainsRegister { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4397,6 +4886,376 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) Unmarshal(dAtA []byte) erro } return nil } +func (m *QueryChainRegistryListRequest) 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: QueryChainRegistryListRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainRegistryListRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", 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 + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.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 *QueryChainRegistryListResponse) 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: QueryChainRegistryListResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainRegistryListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", 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 + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.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 *QueryChainsRegistryRequest) 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: QueryChainsRegistryRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainsRegistryRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + 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 *QueryChainsRegistryResponse) 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: QueryChainsRegistryResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainsRegistryResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainsRegister", 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.ChainsRegister = append(m.ChainsRegister, &ChainRegister{}) + if err := m.ChainsRegister[len(m.ChainsRegister)-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 skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/zoneconcierge/types/query.pb.gw.go b/x/zoneconcierge/types/query.pb.gw.go index fc22099f6..3c8ed6c38 100644 --- a/x/zoneconcierge/types/query.pb.gw.go +++ b/x/zoneconcierge/types/query.pb.gw.go @@ -513,6 +513,78 @@ func local_request_Query_FinalizedChainInfoUntilHeight_0(ctx context.Context, ma } +var ( + filter_Query_ChainRegistryList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_ChainRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainRegistryListRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainRegistryList_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ChainRegistryList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ChainRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainRegistryListRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainRegistryList_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ChainRegistryList(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_ChainsRegistry_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainsRegistryRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsRegistry_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ChainsRegistry(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainsRegistryRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsRegistry_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ChainsRegistry(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. @@ -726,6 +798,52 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_ChainRegistryList_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_ChainRegistryList_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_ChainRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ChainsRegistry_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_ChainsRegistry_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_ChainsRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -947,6 +1065,46 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_ChainRegistryList_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_ChainRegistryList_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_ChainRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ChainsRegistry_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_ChainsRegistry_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_ChainsRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -968,6 +1126,10 @@ var ( pattern_Query_FinalizedChainsInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "finalized_chains_info"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_FinalizedChainInfoUntilHeight_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 5}, []string{"babylon", "zoneconcierge", "v1", "finalized_chain_info", "chain_id", "height"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_ChainRegistryList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "chain_registry_list"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_ChainsRegistry_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "chains_registry"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -988,4 +1150,8 @@ var ( forward_Query_FinalizedChainsInfo_0 = runtime.ForwardResponseMessage forward_Query_FinalizedChainInfoUntilHeight_0 = runtime.ForwardResponseMessage + + forward_Query_ChainRegistryList_0 = runtime.ForwardResponseMessage + + forward_Query_ChainsRegistry_0 = runtime.ForwardResponseMessage ) diff --git a/x/zoneconcierge/types/tx.pb.go b/x/zoneconcierge/types/tx.pb.go index 032e66afa..6dc663e90 100644 --- a/x/zoneconcierge/types/tx.pb.go +++ b/x/zoneconcierge/types/tx.pb.go @@ -127,36 +127,155 @@ func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo +// MsgRegisterChain defines a message for registering CZ chains to the zoneconcierge module. +type MsgRegisterChain struct { + Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` + // chain_id is the ID of the chain + ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // chain_name is the name of the chain + ChainName string `protobuf:"bytes,3,opt,name=chain_name,json=chainName,proto3" json:"chain_name,omitempty"` + // chain_description is a description for the chain (can be empty) + ChainDescription string `protobuf:"bytes,4,opt,name=chain_description,json=chainDescription,proto3" json:"chain_description,omitempty"` +} + +func (m *MsgRegisterChain) Reset() { *m = MsgRegisterChain{} } +func (m *MsgRegisterChain) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterChain) ProtoMessage() {} +func (*MsgRegisterChain) Descriptor() ([]byte, []int) { + return fileDescriptor_35e2112d987e4e18, []int{2} +} +func (m *MsgRegisterChain) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRegisterChain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRegisterChain.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 *MsgRegisterChain) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterChain.Merge(m, src) +} +func (m *MsgRegisterChain) XXX_Size() int { + return m.Size() +} +func (m *MsgRegisterChain) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterChain.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRegisterChain proto.InternalMessageInfo + +func (m *MsgRegisterChain) GetSigner() string { + if m != nil { + return m.Signer + } + return "" +} + +func (m *MsgRegisterChain) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +func (m *MsgRegisterChain) GetChainName() string { + if m != nil { + return m.ChainName + } + return "" +} + +func (m *MsgRegisterChain) GetChainDescription() string { + if m != nil { + return m.ChainDescription + } + return "" +} + +// MsgRegisterChainResponse is the response to the MsgRegisterChain message. +type MsgRegisterChainResponse struct { +} + +func (m *MsgRegisterChainResponse) Reset() { *m = MsgRegisterChainResponse{} } +func (m *MsgRegisterChainResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterChainResponse) ProtoMessage() {} +func (*MsgRegisterChainResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_35e2112d987e4e18, []int{3} +} +func (m *MsgRegisterChainResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRegisterChainResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRegisterChainResponse.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 *MsgRegisterChainResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterChainResponse.Merge(m, src) +} +func (m *MsgRegisterChainResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRegisterChainResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterChainResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRegisterChainResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgUpdateParams)(nil), "babylon.zoneconcierge.v1.MsgUpdateParams") proto.RegisterType((*MsgUpdateParamsResponse)(nil), "babylon.zoneconcierge.v1.MsgUpdateParamsResponse") + proto.RegisterType((*MsgRegisterChain)(nil), "babylon.zoneconcierge.v1.MsgRegisterChain") + proto.RegisterType((*MsgRegisterChainResponse)(nil), "babylon.zoneconcierge.v1.MsgRegisterChainResponse") } func init() { proto.RegisterFile("babylon/zoneconcierge/v1/tx.proto", fileDescriptor_35e2112d987e4e18) } var fileDescriptor_35e2112d987e4e18 = []byte{ - // 331 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0xaf, 0xca, 0xcf, 0x4b, 0x4d, 0xce, 0xcf, 0x4b, 0xce, 0x4c, 0x2d, 0x4a, - 0x4f, 0xd5, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, - 0x2a, 0xd1, 0x43, 0x51, 0xa2, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x56, 0xa4, - 0x0f, 0x62, 0x41, 0xd4, 0x4b, 0x49, 0x26, 0xe7, 0x17, 0xe7, 0xe6, 0x17, 0xc7, 0x43, 0x24, 0x20, - 0x1c, 0xa8, 0x94, 0x38, 0x84, 0xa7, 0x9f, 0x5b, 0x9c, 0x0e, 0xb2, 0x22, 0xb7, 0x38, 0x1d, 0x2a, - 0xa1, 0x8a, 0xd3, 0x19, 0x05, 0x89, 0x45, 0x89, 0xb9, 0x50, 0xfd, 0x4a, 0x33, 0x19, 0xb9, 0xf8, - 0x7d, 0x8b, 0xd3, 0x43, 0x0b, 0x52, 0x12, 0x4b, 0x52, 0x03, 0xc0, 0x32, 0x42, 0x66, 0x5c, 0x9c, - 0x89, 0xa5, 0x25, 0x19, 0xf9, 0x45, 0x99, 0x25, 0x95, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x4e, - 0x12, 0x97, 0xb6, 0xe8, 0x8a, 0x40, 0x2d, 0x76, 0x4c, 0x49, 0x29, 0x4a, 0x2d, 0x2e, 0x0e, 0x2e, - 0x29, 0xca, 0xcc, 0x4b, 0x0f, 0x42, 0x28, 0x15, 0xb2, 0xe3, 0x62, 0x83, 0x98, 0x2d, 0xc1, 0xa4, - 0xc0, 0xa8, 0xc1, 0x6d, 0xa4, 0xa0, 0x87, 0xcb, 0x9f, 0x7a, 0x10, 0x9b, 0x9c, 0x58, 0x4e, 0xdc, - 0x93, 0x67, 0x08, 0x82, 0xea, 0xb2, 0xe2, 0x6b, 0x7a, 0xbe, 0x41, 0x0b, 0x61, 0x9e, 0x92, 0x24, - 0x97, 0x38, 0x9a, 0xd3, 0x82, 0x52, 0x8b, 0x0b, 0xf2, 0xf3, 0x8a, 0x53, 0x8d, 0xaa, 0xb8, 0x98, - 0x7d, 0x8b, 0xd3, 0x85, 0x72, 0xb8, 0x78, 0x50, 0x5c, 0xae, 0x89, 0xdb, 0x46, 0x34, 0x93, 0xa4, - 0x0c, 0x89, 0x56, 0x0a, 0xb3, 0x54, 0x8a, 0xb5, 0xe1, 0xf9, 0x06, 0x2d, 0x46, 0x27, 0xff, 0x13, - 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, - 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, - 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x87, 0x9a, 0x9e, 0x9c, 0x91, 0x98, 0x99, 0x07, 0xe3, 0xe8, 0x57, - 0xa0, 0xc5, 0x46, 0x49, 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0x38, 0x2a, 0x8c, 0x01, 0x01, 0x00, - 0x00, 0xff, 0xff, 0x05, 0xf5, 0x03, 0x87, 0x3a, 0x02, 0x00, 0x00, + // 459 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x4f, 0x6f, 0xd3, 0x30, + 0x18, 0xc6, 0x6b, 0x36, 0x0a, 0xf5, 0xf8, 0x33, 0xac, 0x89, 0xa5, 0x91, 0x08, 0xa5, 0x12, 0xd2, + 0x28, 0x22, 0x51, 0x8b, 0xe0, 0xb0, 0x03, 0x12, 0x85, 0x0b, 0x87, 0x02, 0x0a, 0xe2, 0xc2, 0x65, + 0x72, 0x12, 0xcb, 0xb5, 0xb4, 0xd8, 0x91, 0xed, 0x4d, 0x2b, 0x27, 0xc4, 0x27, 0xe0, 0xca, 0x85, + 0xcf, 0xb0, 0x03, 0x1f, 0x62, 0xc7, 0x89, 0x13, 0x27, 0x84, 0xda, 0xc3, 0x0e, 0x7c, 0x09, 0x14, + 0xdb, 0x51, 0x95, 0x48, 0x9d, 0x7a, 0xcb, 0xeb, 0xe7, 0xe7, 0xf7, 0x79, 0xf2, 0xc8, 0xf0, 0x41, + 0x82, 0x93, 0xd9, 0xa1, 0xe0, 0xd1, 0x67, 0xc1, 0x49, 0x2a, 0x78, 0xca, 0x88, 0xa4, 0x24, 0x3a, + 0x1e, 0x46, 0xfa, 0x24, 0x2c, 0xa4, 0xd0, 0x02, 0x79, 0x0e, 0x09, 0x6b, 0x48, 0x78, 0x3c, 0xf4, + 0x77, 0xa8, 0xa0, 0xc2, 0x40, 0x51, 0xf9, 0x65, 0x79, 0xbf, 0x9b, 0x0a, 0x95, 0x0b, 0x75, 0x60, + 0x05, 0x3b, 0x38, 0x69, 0xd7, 0x4e, 0x51, 0xae, 0x68, 0x69, 0x91, 0x2b, 0xea, 0x84, 0x87, 0x2b, + 0x63, 0x14, 0x58, 0xe2, 0xdc, 0xdd, 0xef, 0x7f, 0x07, 0xf0, 0xf6, 0x44, 0xd1, 0x8f, 0x45, 0x86, + 0x35, 0x79, 0x6f, 0x14, 0xf4, 0x1c, 0x76, 0xf0, 0x91, 0x9e, 0x0a, 0xc9, 0xf4, 0xcc, 0x03, 0x3d, + 0xb0, 0xd7, 0x19, 0x7b, 0xbf, 0x7e, 0x3e, 0xd9, 0x71, 0xc6, 0x2f, 0xb3, 0x4c, 0x12, 0xa5, 0x3e, + 0x68, 0xc9, 0x38, 0x8d, 0x97, 0x28, 0x7a, 0x01, 0xdb, 0x76, 0xb7, 0x77, 0xa5, 0x07, 0xf6, 0xb6, + 0x46, 0xbd, 0x70, 0xd5, 0x7f, 0x86, 0xd6, 0x69, 0xbc, 0x79, 0xf6, 0xe7, 0x7e, 0x2b, 0x76, 0xb7, + 0xf6, 0x6f, 0x7d, 0xbd, 0x38, 0x1d, 0x2c, 0xf7, 0xf5, 0xbb, 0x70, 0xb7, 0x11, 0x2d, 0x26, 0xaa, + 0x10, 0x5c, 0x91, 0xfe, 0x0f, 0x00, 0xb7, 0x27, 0x8a, 0xc6, 0x84, 0x32, 0xa5, 0x89, 0x7c, 0x35, + 0xc5, 0x8c, 0xa3, 0xbb, 0xb0, 0xad, 0x18, 0xe5, 0x44, 0xda, 0xd0, 0xb1, 0x9b, 0x50, 0x17, 0x5e, + 0x4f, 0x4b, 0xe0, 0x80, 0x65, 0x26, 0x59, 0x27, 0xbe, 0x66, 0xe6, 0x37, 0x19, 0xba, 0x07, 0xa1, + 0x95, 0x38, 0xce, 0x89, 0xb7, 0x61, 0xc4, 0x8e, 0x39, 0x79, 0x8b, 0x73, 0x82, 0x1e, 0xc3, 0x3b, + 0x56, 0xce, 0x88, 0x4a, 0x25, 0x2b, 0x34, 0x13, 0xdc, 0xdb, 0x34, 0xd4, 0xb6, 0x11, 0x5e, 0x2f, + 0xcf, 0xf7, 0xb7, 0xca, 0xf8, 0xce, 0xb3, 0xef, 0x43, 0xaf, 0x99, 0xaf, 0x0a, 0x3f, 0xfa, 0x07, + 0xe0, 0xc6, 0x44, 0x51, 0x74, 0x08, 0x6f, 0xd4, 0x7a, 0x7f, 0xb4, 0xba, 0xaf, 0x46, 0x0f, 0xfe, + 0x70, 0x6d, 0xb4, 0x72, 0x45, 0x02, 0xde, 0xac, 0xd7, 0x35, 0xb8, 0x74, 0x47, 0x8d, 0xf5, 0x47, + 0xeb, 0xb3, 0x95, 0xa1, 0x7f, 0xf5, 0xcb, 0xc5, 0xe9, 0x00, 0x8c, 0xdf, 0x9d, 0xcd, 0x03, 0x70, + 0x3e, 0x0f, 0xc0, 0xdf, 0x79, 0x00, 0xbe, 0x2d, 0x82, 0xd6, 0xf9, 0x22, 0x68, 0xfd, 0x5e, 0x04, + 0xad, 0x4f, 0xcf, 0x28, 0xd3, 0xd3, 0xa3, 0x24, 0x4c, 0x45, 0x1e, 0xb9, 0xf5, 0xa6, 0xd4, 0x6a, + 0x88, 0x4e, 0x1a, 0x8f, 0x57, 0xcf, 0x0a, 0xa2, 0x92, 0xb6, 0x79, 0xb9, 0x4f, 0xff, 0x07, 0x00, + 0x00, 0xff, 0xff, 0xc1, 0x62, 0x32, 0x24, 0x69, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -173,6 +292,8 @@ const _ = grpc.SupportPackageIsVersion4 type MsgClient interface { // UpdateParams updates the zoneconcierge module parameters. UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) + // RegisterChain registers a CZ chain to the zoneconcierge module. + RegisterChain(ctx context.Context, in *MsgRegisterChain, opts ...grpc.CallOption) (*MsgRegisterChainResponse, error) } type msgClient struct { @@ -192,10 +313,21 @@ func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts return out, nil } +func (c *msgClient) RegisterChain(ctx context.Context, in *MsgRegisterChain, opts ...grpc.CallOption) (*MsgRegisterChainResponse, error) { + out := new(MsgRegisterChainResponse) + err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Msg/RegisterChain", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // UpdateParams updates the zoneconcierge module parameters. UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) + // RegisterChain registers a CZ chain to the zoneconcierge module. + RegisterChain(context.Context, *MsgRegisterChain) (*MsgRegisterChainResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -205,6 +337,9 @@ type UnimplementedMsgServer struct { func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") } +func (*UnimplementedMsgServer) RegisterChain(ctx context.Context, req *MsgRegisterChain) (*MsgRegisterChainResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterChain not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -228,6 +363,24 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Msg_RegisterChain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRegisterChain) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RegisterChain(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.zoneconcierge.v1.Msg/RegisterChain", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RegisterChain(ctx, req.(*MsgRegisterChain)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.zoneconcierge.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -236,6 +389,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "UpdateParams", Handler: _Msg_UpdateParams_Handler, }, + { + MethodName: "RegisterChain", + Handler: _Msg_RegisterChain_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "babylon/zoneconcierge/v1/tx.proto", @@ -304,6 +461,80 @@ func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *MsgRegisterChain) 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 *MsgRegisterChain) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRegisterChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainDescription) > 0 { + i -= len(m.ChainDescription) + copy(dAtA[i:], m.ChainDescription) + i = encodeVarintTx(dAtA, i, uint64(len(m.ChainDescription))) + i-- + dAtA[i] = 0x22 + } + if len(m.ChainName) > 0 { + i -= len(m.ChainName) + copy(dAtA[i:], m.ChainName) + i = encodeVarintTx(dAtA, i, uint64(len(m.ChainName))) + i-- + dAtA[i] = 0x1a + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0x12 + } + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRegisterChainResponse) 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 *MsgRegisterChainResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRegisterChainResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -339,6 +570,40 @@ func (m *MsgUpdateParamsResponse) Size() (n int) { return n } +func (m *MsgRegisterChain) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ChainName) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ChainDescription) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgRegisterChainResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -510,6 +775,234 @@ func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgRegisterChain) 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 ErrIntOverflowTx + } + 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: MsgRegisterChain: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRegisterChain: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainDescription", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainDescription = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRegisterChainResponse) 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 ErrIntOverflowTx + } + 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: MsgRegisterChainResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRegisterChainResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/zoneconcierge/types/zoneconcierge.pb.go b/x/zoneconcierge/types/zoneconcierge.pb.go index 8f4031b56..5a48b9511 100644 --- a/x/zoneconcierge/types/zoneconcierge.pb.go +++ b/x/zoneconcierge/types/zoneconcierge.pb.go @@ -341,6 +341,70 @@ func (m *ChainInfoWithProof) GetProofHeaderInEpoch() *crypto.ProofOps { return nil } +// ChainRegister is the registration information of a CZ +type ChainRegister struct { + // chain_id is the ID of the chain + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // chain_name is the name of the chain + ChainName string `protobuf:"bytes,2,opt,name=chain_name,json=chainName,proto3" json:"chain_name,omitempty"` + // chain_description is a description for the chain (can be empty) + ChainDescription string `protobuf:"bytes,3,opt,name=chain_description,json=chainDescription,proto3" json:"chain_description,omitempty"` +} + +func (m *ChainRegister) Reset() { *m = ChainRegister{} } +func (m *ChainRegister) String() string { return proto.CompactTextString(m) } +func (*ChainRegister) ProtoMessage() {} +func (*ChainRegister) Descriptor() ([]byte, []int) { + return fileDescriptor_ab886e1868e5c5cd, []int{4} +} +func (m *ChainRegister) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChainRegister) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChainRegister.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 *ChainRegister) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChainRegister.Merge(m, src) +} +func (m *ChainRegister) XXX_Size() int { + return m.Size() +} +func (m *ChainRegister) XXX_DiscardUnknown() { + xxx_messageInfo_ChainRegister.DiscardUnknown(m) +} + +var xxx_messageInfo_ChainRegister proto.InternalMessageInfo + +func (m *ChainRegister) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +func (m *ChainRegister) GetChainName() string { + if m != nil { + return m.ChainName + } + return "" +} + +func (m *ChainRegister) GetChainDescription() string { + if m != nil { + return m.ChainDescription + } + return "" +} + // FinalizedChainInfo is the information of a CZ that is BTC-finalised type FinalizedChainInfo struct { // chain_id is the ID of the chain @@ -362,7 +426,7 @@ func (m *FinalizedChainInfo) Reset() { *m = FinalizedChainInfo{} } func (m *FinalizedChainInfo) String() string { return proto.CompactTextString(m) } func (*FinalizedChainInfo) ProtoMessage() {} func (*FinalizedChainInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{4} + return fileDescriptor_ab886e1868e5c5cd, []int{5} } func (m *FinalizedChainInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -460,7 +524,7 @@ func (m *ProofEpochSealed) Reset() { *m = ProofEpochSealed{} } func (m *ProofEpochSealed) String() string { return proto.CompactTextString(m) } func (*ProofEpochSealed) ProtoMessage() {} func (*ProofEpochSealed) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{5} + return fileDescriptor_ab886e1868e5c5cd, []int{6} } func (m *ProofEpochSealed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -528,7 +592,7 @@ func (m *ProofFinalizedChainInfo) Reset() { *m = ProofFinalizedChainInfo func (m *ProofFinalizedChainInfo) String() string { return proto.CompactTextString(m) } func (*ProofFinalizedChainInfo) ProtoMessage() {} func (*ProofFinalizedChainInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{6} + return fileDescriptor_ab886e1868e5c5cd, []int{7} } func (m *ProofFinalizedChainInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -587,7 +651,7 @@ func (m *BTCChainSegment) Reset() { *m = BTCChainSegment{} } func (m *BTCChainSegment) String() string { return proto.CompactTextString(m) } func (*BTCChainSegment) ProtoMessage() {} func (*BTCChainSegment) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{7} + return fileDescriptor_ab886e1868e5c5cd, []int{8} } func (m *BTCChainSegment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -628,6 +692,7 @@ func init() { proto.RegisterType((*Forks)(nil), "babylon.zoneconcierge.v1.Forks") proto.RegisterType((*ChainInfo)(nil), "babylon.zoneconcierge.v1.ChainInfo") proto.RegisterType((*ChainInfoWithProof)(nil), "babylon.zoneconcierge.v1.ChainInfoWithProof") + proto.RegisterType((*ChainRegister)(nil), "babylon.zoneconcierge.v1.ChainRegister") proto.RegisterType((*FinalizedChainInfo)(nil), "babylon.zoneconcierge.v1.FinalizedChainInfo") proto.RegisterType((*ProofEpochSealed)(nil), "babylon.zoneconcierge.v1.ProofEpochSealed") proto.RegisterType((*ProofFinalizedChainInfo)(nil), "babylon.zoneconcierge.v1.ProofFinalizedChainInfo") @@ -639,68 +704,71 @@ func init() { } var fileDescriptor_ab886e1868e5c5cd = []byte{ - // 964 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xcf, 0xc6, 0x4e, 0xd2, 0x3c, 0xc7, 0x6d, 0x98, 0xa4, 0xd4, 0x0d, 0xc2, 0xb1, 0x5c, 0xa9, - 0xb8, 0x08, 0xd6, 0xb2, 0x81, 0x03, 0xdc, 0xb0, 0xd5, 0xd2, 0x14, 0x44, 0xd1, 0xda, 0x2d, 0x08, - 0x81, 0x56, 0xfb, 0x67, 0xbc, 0xbb, 0xca, 0x7a, 0xc7, 0xda, 0x9d, 0xb8, 0x71, 0x3e, 0x45, 0xbf, - 0x05, 0x5c, 0xf9, 0x00, 0xdc, 0x39, 0xf6, 0xc8, 0x0d, 0x94, 0x7c, 0x05, 0x2e, 0xdc, 0xd0, 0xbc, - 0x99, 0x59, 0xef, 0x26, 0x32, 0x49, 0x2f, 0xd1, 0xce, 0xcc, 0xef, 0xbd, 0xf7, 0x7b, 0xbf, 0xf7, - 0xc7, 0x81, 0x8f, 0x5c, 0xc7, 0x5d, 0xc4, 0x2c, 0xe9, 0x9e, 0xb1, 0x84, 0x7a, 0x2c, 0xf1, 0x22, - 0x9a, 0x06, 0xb4, 0x3b, 0xef, 0x95, 0x2f, 0xcc, 0x59, 0xca, 0x38, 0x23, 0x0d, 0x85, 0x36, 0xcb, - 0x8f, 0xf3, 0xde, 0xc1, 0x7e, 0xc0, 0x02, 0x86, 0xa0, 0xae, 0xf8, 0x92, 0xf8, 0x83, 0xc3, 0x80, - 0xb1, 0x20, 0xa6, 0x5d, 0x3c, 0xb9, 0x27, 0x93, 0x2e, 0x8f, 0xa6, 0x34, 0xe3, 0xce, 0x74, 0xa6, - 0x00, 0xef, 0x73, 0x9a, 0xf8, 0x34, 0x9d, 0x46, 0x09, 0xef, 0x7a, 0xe9, 0x62, 0xc6, 0x99, 0xc0, - 0xb2, 0x89, 0x7a, 0xce, 0xd9, 0xb9, 0xdc, 0xf3, 0x42, 0xea, 0x1d, 0xcf, 0x98, 0x40, 0xce, 0x7b, - 0xe5, 0x0b, 0x85, 0x7e, 0xa8, 0xd1, 0xcb, 0x97, 0x28, 0x09, 0x10, 0x1d, 0x67, 0xf6, 0x31, 0x5d, - 0x28, 0xdc, 0xa3, 0x95, 0xb8, 0x2b, 0x2e, 0xdb, 0x1a, 0x4a, 0x67, 0xcc, 0x0b, 0x15, 0x4a, 0x7f, - 0x2b, 0x8c, 0x59, 0x20, 0x19, 0x47, 0x41, 0x28, 0xfe, 0xd2, 0x9c, 0x65, 0xe1, 0x46, 0xe2, 0xdb, - 0xbf, 0xaf, 0x43, 0xfd, 0x28, 0xf1, 0xe9, 0x29, 0xf5, 0x9f, 0x52, 0xc7, 0xa7, 0x29, 0xb9, 0x0f, - 0xb7, 0xbc, 0xd0, 0x89, 0x12, 0x3b, 0xf2, 0x1b, 0x46, 0xcb, 0xe8, 0x6c, 0x5b, 0x5b, 0x78, 0x3e, - 0xf2, 0x09, 0x81, 0x6a, 0xe8, 0x64, 0x61, 0x63, 0xbd, 0x65, 0x74, 0x76, 0x2c, 0xfc, 0x26, 0xef, - 0xc2, 0x66, 0x48, 0x85, 0xdb, 0x46, 0xa5, 0x65, 0x74, 0xaa, 0x96, 0x3a, 0x91, 0x4f, 0xa1, 0x2a, - 0xf4, 0x6d, 0x54, 0x5b, 0x46, 0xa7, 0xd6, 0x3f, 0x30, 0xa5, 0xf8, 0xa6, 0x16, 0xdf, 0x1c, 0x6b, - 0xf1, 0x07, 0xd5, 0xd7, 0x7f, 0x1d, 0x1a, 0x16, 0xa2, 0x89, 0x09, 0x7b, 0x2a, 0x01, 0x3b, 0x44, - 0x3a, 0x36, 0x06, 0xdc, 0xc0, 0x80, 0xef, 0xa8, 0x27, 0x49, 0xf4, 0xa9, 0x88, 0xde, 0x87, 0xbb, - 0x97, 0xf1, 0x92, 0xcc, 0x26, 0x92, 0xd9, 0x2b, 0x5b, 0x48, 0x66, 0x0f, 0xa0, 0xae, 0x6d, 0x50, - 0xbc, 0xc6, 0x16, 0x62, 0x77, 0xd4, 0xe5, 0x63, 0x71, 0x47, 0x1e, 0xc2, 0x1d, 0x0d, 0xe2, 0xa7, - 0x92, 0xc4, 0x2d, 0x24, 0xa1, 0x6d, 0xc7, 0xa7, 0x82, 0x40, 0xfb, 0x19, 0x6c, 0x3c, 0x61, 0xe9, - 0x71, 0x46, 0xbe, 0x84, 0x2d, 0xc9, 0x20, 0x6b, 0x54, 0x5a, 0x95, 0x4e, 0xad, 0xff, 0x81, 0xb9, - 0xaa, 0x3f, 0xcd, 0x92, 0xe0, 0x96, 0xb6, 0x6b, 0xff, 0x63, 0xc0, 0xf6, 0x10, 0xa5, 0x4e, 0x26, - 0xec, 0xff, 0xea, 0xf0, 0x0d, 0xd4, 0x63, 0x87, 0xd3, 0x8c, 0xab, 0xa4, 0xb1, 0x20, 0x6f, 0x11, - 0x71, 0x47, 0x5a, 0xab, 0x82, 0x0f, 0x40, 0x9d, 0xed, 0x89, 0xc8, 0x04, 0xeb, 0x58, 0xeb, 0x1f, - 0xae, 0x76, 0x86, 0x09, 0x5b, 0x35, 0x69, 0x24, 0xb3, 0xff, 0x02, 0xee, 0xe7, 0xd3, 0x44, 0x7d, - 0x45, 0x2b, 0xb3, 0x3d, 0x76, 0x92, 0x70, 0x6c, 0x81, 0xaa, 0x75, 0xaf, 0x00, 0x90, 0x91, 0xb3, - 0xa1, 0x78, 0x6e, 0xff, 0x6a, 0x00, 0xc9, 0xd3, 0xfe, 0x3e, 0xe2, 0xe1, 0x77, 0x62, 0xe8, 0xc8, - 0x00, 0x40, 0xe5, 0x9f, 0x4c, 0x18, 0x2a, 0x50, 0xeb, 0x3f, 0x58, 0x4d, 0x2a, 0xf7, 0x60, 0x6d, - 0x7b, 0xb9, 0x86, 0xdf, 0xc2, 0x5d, 0x9c, 0x60, 0xdd, 0x1c, 0x91, 0x2e, 0xb9, 0x14, 0xec, 0x3d, - 0x73, 0x39, 0xf1, 0xa6, 0x9c, 0x78, 0x13, 0x83, 0x3f, 0x9f, 0x65, 0x16, 0x41, 0x4b, 0xc9, 0xf4, - 0x48, 0x76, 0x45, 0xfb, 0xb7, 0x0a, 0x90, 0x27, 0x51, 0xe2, 0xc4, 0xd1, 0x19, 0xf5, 0x6f, 0x54, - 0xaa, 0x17, 0xb0, 0x3f, 0xd1, 0x06, 0x76, 0x21, 0x9f, 0xf5, 0x9b, 0xe7, 0x43, 0x26, 0x57, 0x23, - 0x7e, 0x0e, 0x80, 0x89, 0x48, 0x67, 0x15, 0x35, 0x63, 0xda, 0x59, 0xbe, 0x13, 0xe6, 0x3d, 0x13, - 0x89, 0x5b, 0xdb, 0x78, 0xa5, 0x34, 0xb9, 0x9d, 0x3a, 0xaf, 0xec, 0xe5, 0x76, 0x51, 0x23, 0xba, - 0xec, 0x9e, 0xd2, 0x26, 0x12, 0x3e, 0x2c, 0xe7, 0xd5, 0x30, 0xbf, 0xb3, 0xea, 0x69, 0xf1, 0x48, - 0x5e, 0x00, 0x71, 0xb9, 0x67, 0x67, 0x27, 0xee, 0x34, 0xca, 0xb2, 0x88, 0x25, 0x62, 0xb9, 0xe1, - 0xc4, 0x16, 0x7d, 0x96, 0x57, 0xe4, 0xbc, 0x67, 0x8e, 0x72, 0xfc, 0xd7, 0x74, 0x61, 0xed, 0xba, - 0xdc, 0x2b, 0xdd, 0x90, 0xaf, 0x60, 0x03, 0x0b, 0x80, 0x93, 0x5c, 0xeb, 0xf7, 0x56, 0x2b, 0x85, - 0x15, 0xbb, 0x5a, 0x15, 0x4b, 0xda, 0xb7, 0xff, 0x35, 0x60, 0x17, 0x21, 0xa8, 0xc4, 0x88, 0x3a, - 0x31, 0xf5, 0x89, 0x05, 0xf5, 0xb9, 0x13, 0x47, 0xbe, 0xc3, 0x59, 0x6a, 0x67, 0x94, 0x37, 0x0c, - 0x9c, 0xd9, 0x8f, 0x57, 0x6b, 0xf0, 0x52, 0xc3, 0x45, 0x87, 0x0e, 0xe2, 0x4c, 0xb0, 0xde, 0xc9, - 0x7d, 0x8c, 0x28, 0x27, 0x8f, 0x61, 0x57, 0x36, 0x5b, 0xa1, 0x32, 0x37, 0xe8, 0xb3, 0xdb, 0xb3, - 0x9c, 0x1c, 0xd6, 0xe7, 0x19, 0xec, 0x15, 0xdd, 0xcc, 0x9d, 0x18, 0x09, 0x56, 0xae, 0xf7, 0xb4, - 0xbb, 0xf4, 0xf4, 0xd2, 0x89, 0x47, 0x94, 0xb7, 0x7f, 0x59, 0x87, 0x7b, 0x2b, 0xe4, 0x21, 0x23, - 0x68, 0xc8, 0x38, 0xde, 0xd9, 0x95, 0xf1, 0x30, 0xae, 0x0f, 0xb6, 0x8f, 0xc6, 0xc3, 0xb3, 0xd2, - 0x80, 0x90, 0x1f, 0x80, 0x14, 0xc9, 0x67, 0xa8, 0xb6, 0x52, 0xe1, 0xc3, 0x6b, 0x4a, 0x58, 0xa8, - 0x4f, 0x31, 0x15, 0x55, 0xb1, 0x9f, 0xf5, 0x28, 0x2b, 0xcf, 0xa2, 0x59, 0x38, 0xa7, 0xbe, 0xda, - 0xb6, 0x8f, 0x56, 0x77, 0xda, 0x38, 0x75, 0x92, 0xcc, 0xf1, 0x78, 0xc4, 0x64, 0x5f, 0xec, 0x15, - 0x7c, 0x6b, 0x2f, 0xed, 0x9f, 0xe0, 0xce, 0x60, 0x3c, 0x44, 0x75, 0x46, 0x34, 0x98, 0xd2, 0x84, - 0x93, 0x23, 0xa8, 0x89, 0xc6, 0xd6, 0x5b, 0x5d, 0x76, 0x48, 0xa7, 0x18, 0xa7, 0xf8, 0x73, 0x3a, - 0xef, 0x99, 0x83, 0xf1, 0x50, 0xab, 0x31, 0x61, 0x16, 0xb8, 0xdc, 0x53, 0x7b, 0x6e, 0xf0, 0xfc, - 0x8f, 0xf3, 0xa6, 0xf1, 0xe6, 0xbc, 0x69, 0xfc, 0x7d, 0xde, 0x34, 0x5e, 0x5f, 0x34, 0xd7, 0xde, - 0x5c, 0x34, 0xd7, 0xfe, 0xbc, 0x68, 0xae, 0xfd, 0xf8, 0x59, 0x10, 0xf1, 0xf0, 0xc4, 0x35, 0x3d, - 0x36, 0xed, 0x2a, 0xcf, 0xb8, 0x25, 0xf4, 0xa1, 0x7b, 0x7a, 0xe9, 0x9f, 0x21, 0xbe, 0x98, 0xd1, - 0xcc, 0xdd, 0xc4, 0xdf, 0xd1, 0x4f, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xdf, 0x50, 0x58, - 0x32, 0x09, 0x00, 0x00, + // 1014 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xcd, 0x6e, 0xdb, 0x46, + 0x10, 0x36, 0x2d, 0xd9, 0x8e, 0x46, 0x56, 0xe2, 0xac, 0x9d, 0x46, 0x71, 0x11, 0xd9, 0x60, 0x80, + 0x54, 0xe9, 0x0f, 0x05, 0xa9, 0xed, 0xa1, 0xbd, 0x55, 0x6a, 0xd2, 0x38, 0x2d, 0x92, 0x82, 0x72, + 0xd2, 0xa2, 0x68, 0x41, 0xf0, 0x67, 0x45, 0x12, 0xa6, 0xb8, 0x02, 0xb9, 0x56, 0x2c, 0x3f, 0x45, + 0xde, 0xa2, 0xbd, 0xf6, 0x01, 0x7a, 0xef, 0x31, 0xc7, 0xde, 0x5a, 0xd8, 0xaf, 0xd0, 0x4b, 0x6f, + 0xc5, 0xce, 0xee, 0x52, 0x54, 0x0c, 0xc5, 0xce, 0xc5, 0xd0, 0xce, 0x7e, 0x33, 0xf3, 0xed, 0x37, + 0x3f, 0x34, 0x7c, 0xec, 0xb9, 0xde, 0x2c, 0x61, 0x69, 0xe7, 0x94, 0xa5, 0xd4, 0x67, 0xa9, 0x1f, + 0xd3, 0x2c, 0xa4, 0x9d, 0x69, 0x77, 0xd1, 0x60, 0x4d, 0x32, 0xc6, 0x19, 0x69, 0x2a, 0xb4, 0xb5, + 0x78, 0x39, 0xed, 0xee, 0xee, 0x84, 0x2c, 0x64, 0x08, 0xea, 0x88, 0x5f, 0x12, 0xbf, 0xbb, 0x17, + 0x32, 0x16, 0x26, 0xb4, 0x83, 0x27, 0xef, 0x78, 0xd4, 0xe1, 0xf1, 0x98, 0xe6, 0xdc, 0x1d, 0x4f, + 0x14, 0xe0, 0x2e, 0xa7, 0x69, 0x40, 0xb3, 0x71, 0x9c, 0xf2, 0x8e, 0x9f, 0xcd, 0x26, 0x9c, 0x09, + 0x2c, 0x1b, 0xa9, 0xeb, 0x82, 0x9d, 0xc7, 0x7d, 0x3f, 0xa2, 0xfe, 0xd1, 0x84, 0x09, 0xe4, 0xb4, + 0xbb, 0x68, 0x50, 0xe8, 0xfb, 0x1a, 0x3d, 0xbf, 0x89, 0xd3, 0x10, 0xd1, 0x49, 0xee, 0x1c, 0xd1, + 0x99, 0xc2, 0x3d, 0x58, 0x8a, 0xbb, 0x10, 0xd2, 0xd4, 0x50, 0x3a, 0x61, 0x7e, 0xa4, 0x50, 0xfa, + 0xb7, 0xc2, 0x58, 0x25, 0x92, 0x49, 0x1c, 0x46, 0xe2, 0x2f, 0x2d, 0x58, 0x96, 0x2c, 0x12, 0x6f, + 0xfe, 0xb1, 0x0a, 0x8d, 0x83, 0x34, 0xa0, 0x27, 0x34, 0x78, 0x4c, 0xdd, 0x80, 0x66, 0xe4, 0x0e, + 0x5c, 0xf3, 0x23, 0x37, 0x4e, 0x9d, 0x38, 0x68, 0x1a, 0xfb, 0x46, 0xbb, 0x66, 0x6f, 0xe0, 0xf9, + 0x20, 0x20, 0x04, 0xaa, 0x91, 0x9b, 0x47, 0xcd, 0xd5, 0x7d, 0xa3, 0xbd, 0x69, 0xe3, 0x6f, 0xf2, + 0x1e, 0xac, 0x47, 0x54, 0x84, 0x6d, 0x56, 0xf6, 0x8d, 0x76, 0xd5, 0x56, 0x27, 0xf2, 0x19, 0x54, + 0x85, 0xbe, 0xcd, 0xea, 0xbe, 0xd1, 0xae, 0xf7, 0x76, 0x2d, 0x29, 0xbe, 0xa5, 0xc5, 0xb7, 0x0e, + 0xb5, 0xf8, 0xfd, 0xea, 0xab, 0xbf, 0xf7, 0x0c, 0x1b, 0xd1, 0xc4, 0x82, 0x6d, 0xf5, 0x00, 0x27, + 0x42, 0x3a, 0x0e, 0x26, 0x5c, 0xc3, 0x84, 0x37, 0xd5, 0x95, 0x24, 0xfa, 0x58, 0x64, 0xef, 0xc1, + 0xad, 0x37, 0xf1, 0x92, 0xcc, 0x3a, 0x92, 0xd9, 0x5e, 0xf4, 0x90, 0xcc, 0xee, 0x41, 0x43, 0xfb, + 0xa0, 0x78, 0xcd, 0x0d, 0xc4, 0x6e, 0x2a, 0xe3, 0x43, 0x61, 0x23, 0xf7, 0xe1, 0x86, 0x06, 0xf1, + 0x13, 0x49, 0xe2, 0x1a, 0x92, 0xd0, 0xbe, 0x87, 0x27, 0x82, 0x80, 0xf9, 0x04, 0xd6, 0x1e, 0xb1, + 0xec, 0x28, 0x27, 0x5f, 0xc1, 0x86, 0x64, 0x90, 0x37, 0x2b, 0xfb, 0x95, 0x76, 0xbd, 0xf7, 0x81, + 0xb5, 0xac, 0x3f, 0xad, 0x05, 0xc1, 0x6d, 0xed, 0x67, 0xfe, 0x6b, 0x40, 0x6d, 0x80, 0x52, 0xa7, + 0x23, 0xf6, 0xb6, 0x3a, 0x7c, 0x07, 0x8d, 0xc4, 0xe5, 0x34, 0xe7, 0xea, 0xd1, 0x58, 0x90, 0x77, + 0xc8, 0xb8, 0x29, 0xbd, 0x55, 0xc1, 0xfb, 0xa0, 0xce, 0xce, 0x48, 0xbc, 0x04, 0xeb, 0x58, 0xef, + 0xed, 0x2d, 0x0f, 0x86, 0x0f, 0xb6, 0xeb, 0xd2, 0x49, 0xbe, 0xfe, 0x4b, 0xb8, 0x53, 0x4c, 0x13, + 0x0d, 0x14, 0xad, 0xdc, 0xf1, 0xd9, 0x71, 0xca, 0xb1, 0x05, 0xaa, 0xf6, 0xed, 0x12, 0x40, 0x66, + 0xce, 0x07, 0xe2, 0xda, 0xfc, 0xcd, 0x00, 0x52, 0x3c, 0xfb, 0x87, 0x98, 0x47, 0xdf, 0x8b, 0xa1, + 0x23, 0x7d, 0x00, 0xf5, 0xfe, 0x74, 0xc4, 0x50, 0x81, 0x7a, 0xef, 0xde, 0x72, 0x52, 0x45, 0x04, + 0xbb, 0xe6, 0x17, 0x1a, 0x3e, 0x85, 0x5b, 0x38, 0xc1, 0xba, 0x39, 0x62, 0x5d, 0x72, 0x29, 0xd8, + 0xfb, 0xd6, 0x7c, 0xe2, 0x2d, 0x39, 0xf1, 0x16, 0x26, 0x7f, 0x36, 0xc9, 0x6d, 0x82, 0x9e, 0x92, + 0xe9, 0x81, 0xec, 0x0a, 0x73, 0x0a, 0x0d, 0xcc, 0x63, 0xd3, 0x30, 0xce, 0xf9, 0xdb, 0x87, 0xe5, + 0xae, 0xe6, 0x9f, 0xba, 0x63, 0x8a, 0x09, 0x6b, 0x8a, 0xda, 0x53, 0x77, 0x4c, 0xc9, 0x47, 0x70, + 0x53, 0x5e, 0x07, 0x34, 0xf7, 0xb3, 0x78, 0xc2, 0x63, 0x96, 0xa2, 0xf4, 0x35, 0x7b, 0x0b, 0x2f, + 0xbe, 0x9e, 0xdb, 0xcd, 0xdf, 0x2b, 0x40, 0x1e, 0xc5, 0xa9, 0x9b, 0xc4, 0xa7, 0x34, 0xb8, 0x52, + 0x8b, 0x3c, 0x87, 0x9d, 0x91, 0x76, 0x70, 0x4a, 0x3a, 0xae, 0x5e, 0x5d, 0x47, 0x32, 0xba, 0x98, + 0xf1, 0x0b, 0x00, 0x14, 0x50, 0x06, 0xab, 0xa8, 0xd9, 0xd6, 0xc1, 0x8a, 0x5d, 0x34, 0xed, 0x5a, + 0x28, 0x98, 0x5d, 0x43, 0x93, 0xaa, 0xc5, 0xf5, 0xcc, 0x7d, 0xe9, 0xcc, 0xb7, 0x9a, 0x5a, 0x0d, + 0xf3, 0xae, 0x5d, 0xd8, 0x80, 0x22, 0x86, 0xed, 0xbe, 0x1c, 0x14, 0x36, 0xbb, 0x91, 0x95, 0x8f, + 0xe4, 0x39, 0x10, 0x8f, 0xfb, 0x4e, 0x7e, 0xec, 0x8d, 0xe3, 0x3c, 0x8f, 0x59, 0x2a, 0x96, 0x2a, + 0x6e, 0x8a, 0x72, 0xcc, 0xc5, 0xd5, 0x3c, 0xed, 0x5a, 0xc3, 0x02, 0xff, 0x2d, 0x9d, 0xd9, 0x5b, + 0x1e, 0xf7, 0x17, 0x2c, 0xe4, 0x1b, 0x58, 0xc3, 0xc2, 0xe3, 0x06, 0xa9, 0xf7, 0xba, 0xcb, 0x95, + 0xc2, 0x4e, 0xb9, 0x58, 0x15, 0x5b, 0xfa, 0x9b, 0xff, 0x19, 0xb0, 0x85, 0x10, 0x54, 0x62, 0x48, + 0xdd, 0x84, 0x06, 0xc4, 0x86, 0xc6, 0xd4, 0x4d, 0xe2, 0xc0, 0xe5, 0x2c, 0x73, 0x72, 0xca, 0x9b, + 0x06, 0xee, 0x8a, 0x4f, 0x96, 0x6b, 0xf0, 0x42, 0xc3, 0xc5, 0x64, 0xf4, 0x93, 0x5c, 0xb0, 0xde, + 0x2c, 0x62, 0x0c, 0x29, 0x27, 0x0f, 0x61, 0x4b, 0x36, 0x79, 0xa9, 0x32, 0x57, 0xe8, 0xef, 0xeb, + 0x93, 0x82, 0x1c, 0xd6, 0xe7, 0x09, 0x6c, 0x97, 0xc3, 0x4c, 0xdd, 0x04, 0x09, 0x56, 0x2e, 0x8f, + 0xb4, 0x35, 0x8f, 0xf4, 0xc2, 0x4d, 0x86, 0x94, 0x9b, 0xbf, 0xae, 0xc2, 0xed, 0x25, 0xf2, 0x90, + 0x21, 0x34, 0x65, 0x1e, 0xff, 0xf4, 0xc2, 0x58, 0x1a, 0x97, 0x27, 0xdb, 0x41, 0xe7, 0xc1, 0xe9, + 0xc2, 0x60, 0x92, 0x1f, 0x81, 0x94, 0xc9, 0xe7, 0xa8, 0xb6, 0x52, 0xe1, 0xc3, 0x4b, 0x4a, 0x58, + 0xaa, 0x4f, 0xf9, 0x29, 0xaa, 0x62, 0xbf, 0xe8, 0x15, 0xa2, 0x22, 0x8b, 0x66, 0xe1, 0x9c, 0x06, + 0x6a, 0xcb, 0x3f, 0x58, 0xde, 0x69, 0x87, 0x99, 0x9b, 0xe6, 0xae, 0x2f, 0x06, 0x18, 0xfb, 0x62, + 0xbb, 0x14, 0x5b, 0x47, 0x31, 0x7f, 0x86, 0x1b, 0xfd, 0xc3, 0x01, 0xaa, 0x33, 0xa4, 0xe1, 0x98, + 0xa6, 0x9c, 0x1c, 0x40, 0x5d, 0x34, 0xb6, 0xfe, 0x9a, 0xc8, 0x0e, 0x69, 0x97, 0xf3, 0x94, 0x3f, + 0xe3, 0xd3, 0xae, 0xd5, 0x3f, 0x1c, 0x68, 0x35, 0x46, 0xcc, 0x06, 0x8f, 0xfb, 0x6a, 0xbf, 0xf6, + 0x9f, 0xfd, 0x79, 0xd6, 0x32, 0x5e, 0x9f, 0xb5, 0x8c, 0x7f, 0xce, 0x5a, 0xc6, 0xab, 0xf3, 0xd6, + 0xca, 0xeb, 0xf3, 0xd6, 0xca, 0x5f, 0xe7, 0xad, 0x95, 0x9f, 0x3e, 0x0f, 0x63, 0x1e, 0x1d, 0x7b, + 0x96, 0xcf, 0xc6, 0x1d, 0x15, 0x19, 0xb7, 0x84, 0x3e, 0x74, 0x4e, 0xde, 0xf8, 0x27, 0x8c, 0xcf, + 0x26, 0x34, 0xf7, 0xd6, 0xf1, 0xfb, 0xfd, 0xe9, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4e, 0xd5, + 0x62, 0xb4, 0xaa, 0x09, 0x00, 0x00, } func (m *IndexedHeader) Marshal() (dAtA []byte, err error) { @@ -922,6 +990,50 @@ func (m *ChainInfoWithProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ChainRegister) 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 *ChainRegister) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChainRegister) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainDescription) > 0 { + i -= len(m.ChainDescription) + copy(dAtA[i:], m.ChainDescription) + i = encodeVarintZoneconcierge(dAtA, i, uint64(len(m.ChainDescription))) + i-- + dAtA[i] = 0x1a + } + if len(m.ChainName) > 0 { + i -= len(m.ChainName) + copy(dAtA[i:], m.ChainName) + i = encodeVarintZoneconcierge(dAtA, i, uint64(len(m.ChainName))) + i-- + dAtA[i] = 0x12 + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintZoneconcierge(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *FinalizedChainInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1276,6 +1388,27 @@ func (m *ChainInfoWithProof) Size() (n int) { return n } +func (m *ChainRegister) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovZoneconcierge(uint64(l)) + } + l = len(m.ChainName) + if l > 0 { + n += 1 + l + sovZoneconcierge(uint64(l)) + } + l = len(m.ChainDescription) + if l > 0 { + n += 1 + l + sovZoneconcierge(uint64(l)) + } + return n +} + func (m *FinalizedChainInfo) Size() (n int) { if m == nil { return 0 @@ -2032,6 +2165,152 @@ func (m *ChainInfoWithProof) Unmarshal(dAtA []byte) error { } return nil } +func (m *ChainRegister) 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 ErrIntOverflowZoneconcierge + } + 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: ChainRegister: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChainRegister: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowZoneconcierge + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthZoneconcierge + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthZoneconcierge + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowZoneconcierge + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthZoneconcierge + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthZoneconcierge + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainDescription", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowZoneconcierge + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthZoneconcierge + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthZoneconcierge + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainDescription = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipZoneconcierge(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthZoneconcierge + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *FinalizedChainInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 From f4b88abbc9dd1dcb844a6a346248e0d1e8d5013b Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 13 Mar 2024 16:27:05 +0100 Subject: [PATCH 03/85] F/consumer chain registry 2 (#209) * Move btcstkconsumer proto files under v1/ for consistency * Move register chain protos from zoneconcierge to btcstkconsumer * Refactor chain registry into btcstkconsumer * Fix: proto / code lints * Pass chain register pointer Co-authored-by: Runchao Han --- proto/babylon/btcstkconsumer/query.proto | 29 - .../btcstkconsumer/v1/btcstkconsumer.proto | 14 + .../btcstkconsumer/{ => v1}/genesis.proto | 4 +- .../btcstkconsumer/{ => v1}/params.proto | 6 +- proto/babylon/btcstkconsumer/v1/query.proto | 61 + .../babylon/btcstkconsumer/{ => v1}/tx.proto | 26 +- proto/babylon/zoneconcierge/v1/query.proto | 30 - proto/babylon/zoneconcierge/v1/tx.proto | 44 +- .../zoneconcierge/v1/zoneconcierge.proto | 10 - .../keeper/consumer_chain_registry.go | 2 +- .../keeper/consumer_chain_registry_test.go | 4 +- x/btcstkconsumer/keeper/grpc_query.go | 77 ++ x/btcstkconsumer/keeper/grpc_query_test.go | 100 ++ x/btcstkconsumer/keeper/msg_server.go | 25 + x/btcstkconsumer/types/btcstkconsumer.pb.go | 426 +++++++ .../types/chain_register.go | 5 +- x/btcstkconsumer/types/errors.go | 7 +- x/btcstkconsumer/types/genesis.pb.go | 38 +- x/btcstkconsumer/types/keys.go | 3 +- x/btcstkconsumer/types/params.pb.go | 34 +- x/btcstkconsumer/types/query.pb.go | 940 +++++++++++++- x/btcstkconsumer/types/query.pb.gw.go | 170 ++- x/btcstkconsumer/types/tx.pb.go | 570 ++++++++- x/zoneconcierge/keeper/grpc_query.go | 75 +- x/zoneconcierge/keeper/grpc_query_test.go | 87 -- x/zoneconcierge/keeper/msg_server.go | 22 - x/zoneconcierge/types/msg.go | 1 - x/zoneconcierge/types/query.pb.go | 1119 ++--------------- x/zoneconcierge/types/query.pb.gw.go | 166 --- x/zoneconcierge/types/tx.pb.go | 537 +------- x/zoneconcierge/types/zoneconcierge.pb.go | 411 +----- 31 files changed, 2622 insertions(+), 2421 deletions(-) delete mode 100644 proto/babylon/btcstkconsumer/query.proto create mode 100644 proto/babylon/btcstkconsumer/v1/btcstkconsumer.proto rename proto/babylon/btcstkconsumer/{ => v1}/genesis.proto (82%) rename proto/babylon/btcstkconsumer/{ => v1}/params.proto (72%) create mode 100644 proto/babylon/btcstkconsumer/v1/query.proto rename proto/babylon/btcstkconsumer/{ => v1}/tx.proto (56%) rename x/{zoneconcierge => btcstkconsumer}/keeper/consumer_chain_registry.go (96%) rename x/{zoneconcierge => btcstkconsumer}/keeper/consumer_chain_registry_test.go (93%) create mode 100644 x/btcstkconsumer/keeper/grpc_query.go create mode 100644 x/btcstkconsumer/keeper/grpc_query_test.go create mode 100644 x/btcstkconsumer/types/btcstkconsumer.pb.go rename x/{zoneconcierge => btcstkconsumer}/types/chain_register.go (67%) diff --git a/proto/babylon/btcstkconsumer/query.proto b/proto/babylon/btcstkconsumer/query.proto deleted file mode 100644 index 5279227b7..000000000 --- a/proto/babylon/btcstkconsumer/query.proto +++ /dev/null @@ -1,29 +0,0 @@ -syntax = "proto3"; -package babylon.btcstkconsumer; - -import "amino/amino.proto"; -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "babylon/btcstkconsumer/params.proto"; - -option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; - -// Query defines the gRPC querier service. -service Query { - // Parameters queries the parameters of the module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/babylonchain/babylon/btcstkconsumer/params"; - } -} - -// QueryParamsRequest is request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is response type for the Query/Params RPC method. -message QueryParamsResponse { - // params holds all the parameters of this module. - Params params = 1 [ - (gogoproto.nullable) = false, - (amino.dont_omitempty) = true - ]; -} \ No newline at end of file diff --git a/proto/babylon/btcstkconsumer/v1/btcstkconsumer.proto b/proto/babylon/btcstkconsumer/v1/btcstkconsumer.proto new file mode 100644 index 000000000..993f3a3b8 --- /dev/null +++ b/proto/babylon/btcstkconsumer/v1/btcstkconsumer.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package babylon.btcstkconsumer.v1; + +option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; + +// ChainRegister is the registration information of a CZ +message ChainRegister { + // chain_id is the ID of the chain + string chain_id = 1; + // chain_name is the name of the chain + string chain_name = 2; + // chain_description is a description for the chain (can be empty) + string chain_description = 3; +} \ No newline at end of file diff --git a/proto/babylon/btcstkconsumer/genesis.proto b/proto/babylon/btcstkconsumer/v1/genesis.proto similarity index 82% rename from proto/babylon/btcstkconsumer/genesis.proto rename to proto/babylon/btcstkconsumer/v1/genesis.proto index 704508243..5da464486 100644 --- a/proto/babylon/btcstkconsumer/genesis.proto +++ b/proto/babylon/btcstkconsumer/v1/genesis.proto @@ -1,9 +1,9 @@ syntax = "proto3"; -package babylon.btcstkconsumer; +package babylon.btcstkconsumer.v1; import "amino/amino.proto"; import "gogoproto/gogo.proto"; -import "babylon/btcstkconsumer/params.proto"; +import "babylon/btcstkconsumer/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; diff --git a/proto/babylon/btcstkconsumer/params.proto b/proto/babylon/btcstkconsumer/v1/params.proto similarity index 72% rename from proto/babylon/btcstkconsumer/params.proto rename to proto/babylon/btcstkconsumer/v1/params.proto index a41c635ed..da07f79ee 100644 --- a/proto/babylon/btcstkconsumer/params.proto +++ b/proto/babylon/btcstkconsumer/v1/params.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -package babylon.btcstkconsumer; +package babylon.btcstkconsumer.v1; import "amino/amino.proto"; import "gogoproto/gogo.proto"; @@ -8,8 +8,6 @@ option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; // Params defines the parameters for the module. message Params { - option (amino.name) = "babylon/x/btcstkconsumer/Params"; + option (amino.name) = "babylon/x/btcstkconsumer/v1/Params"; option (gogoproto.equal) = true; - - } \ No newline at end of file diff --git a/proto/babylon/btcstkconsumer/v1/query.proto b/proto/babylon/btcstkconsumer/v1/query.proto new file mode 100644 index 000000000..75f9e48af --- /dev/null +++ b/proto/babylon/btcstkconsumer/v1/query.proto @@ -0,0 +1,61 @@ +syntax = "proto3"; +package babylon.btcstkconsumer.v1; + +import "amino/amino.proto"; +import "gogoproto/gogo.proto"; +import "google/api/annotations.proto"; +import "cosmos/base/query/v1beta1/pagination.proto"; +import "babylon/btcstkconsumer/v1/btcstkconsumer.proto"; +import "babylon/btcstkconsumer/v1/params.proto"; + +option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; + +// Query defines the gRPC querier service. +service Query { + // Parameters queries the parameters of the module. + rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { + option (google.api.http).get = "/babylonchain/babylon/btcstkconsumer/v1/params"; + } + // ChainRegistryList queries the list of chains that are registered to Babylon + rpc ChainRegistryList(QueryChainRegistryListRequest) returns (QueryChainRegistryListResponse) { + option (google.api.http).get = "/babylon/btcstkconsumer/v1/chain_registry_list"; + } + // ChainsRegistry queries the latest info for a given list of chains in Babylon's view + rpc ChainsRegistry(QueryChainsRegistryRequest) returns (QueryChainsRegistryResponse) { + option (google.api.http).get = "/babylon/btcstkconsumer/v1/chains_registry"; + } +} + +// QueryParamsRequest is request type for the Query/Params RPC method. +message QueryParamsRequest {} + +// QueryParamsResponse is response type for the Query/Params RPC method. +message QueryParamsResponse { + // params holds all the parameters of this module. + Params params = 1 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; +} + +// QueryChainRegistryListRequest is request type for the Query/ChainRegistryList RPC method +message QueryChainRegistryListRequest { + // pagination defines whether to have the pagination in the request + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +// QueryChainRegistryListResponse is response type for the Query/ChainRegistryList RPC method +message QueryChainRegistryListResponse { + // chain_ids are IDs of the chains in ascending alphabetical order + repeated string chain_ids = 1; + // pagination defines the pagination in the response + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +// QueryChainsRegistryRequest is request type for the Query/ChainsRegistry RPC method. +message QueryChainsRegistryRequest { repeated string chain_ids = 1; } + +// QueryChainsRegistryResponse is response type for the Query/ChainsRegistry RPC method. +message QueryChainsRegistryResponse { + repeated babylon.btcstkconsumer.v1.ChainRegister chains_register = 1; +} diff --git a/proto/babylon/btcstkconsumer/tx.proto b/proto/babylon/btcstkconsumer/v1/tx.proto similarity index 56% rename from proto/babylon/btcstkconsumer/tx.proto rename to proto/babylon/btcstkconsumer/v1/tx.proto index fb841fe41..d351d25e4 100644 --- a/proto/babylon/btcstkconsumer/tx.proto +++ b/proto/babylon/btcstkconsumer/v1/tx.proto @@ -1,11 +1,11 @@ syntax = "proto3"; -package babylon.btcstkconsumer; +package babylon.btcstkconsumer.v1; import "amino/amino.proto"; import "cosmos/msg/v1/msg.proto"; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; -import "babylon/btcstkconsumer/params.proto"; +import "babylon/btcstkconsumer/v1/params.proto"; option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; @@ -16,12 +16,14 @@ service Msg { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); + // RegisterChain registers a CZ chain to the btcstkconsumer module. + rpc RegisterChain(MsgRegisterChain) returns (MsgRegisterChainResponse); } // MsgUpdateParams is the Msg/UpdateParams request type. message MsgUpdateParams { option (cosmos.msg.v1.signer) = "authority"; - option (amino.name) = "babylon/x/btcstkconsumer/MsgUpdateParams"; + option (amino.name) = "babylon/x/btcstkconsumer/v1/MsgUpdateParams"; // authority is the address that controls the module (defaults to x/gov unless overwritten). string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; @@ -37,4 +39,20 @@ message MsgUpdateParams { // MsgUpdateParamsResponse defines the response structure for executing a // MsgUpdateParams message. -message MsgUpdateParamsResponse {} \ No newline at end of file +message MsgUpdateParamsResponse {} + +// MsgRegisterChain defines a message for registering CZ chains to the btcstkconsumer module. +message MsgRegisterChain { + option (cosmos.msg.v1.signer) = "signer"; + + string signer = 1; + // chain_id is the ID of the chain + string chain_id = 2; + // chain_name is the name of the chain + string chain_name = 3; + // chain_description is a description for the chain (can be empty) + string chain_description = 4; +} + +// MsgRegisterChainResponse is the response to the MsgRegisterChain message. +message MsgRegisterChainResponse {} diff --git a/proto/babylon/zoneconcierge/v1/query.proto b/proto/babylon/zoneconcierge/v1/query.proto index 89afb52a3..aa65a805f 100644 --- a/proto/babylon/zoneconcierge/v1/query.proto +++ b/proto/babylon/zoneconcierge/v1/query.proto @@ -66,14 +66,6 @@ service Query { "/babylon/zoneconcierge/v1/finalized_chain_info/{chain_id}/height/" "{height}"; } - // ChainRegistryList queries the list of chains that are registered to Babylon - rpc ChainRegistryList(QueryChainRegistryListRequest) returns (QueryChainRegistryListResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/chain_registry_list"; - } - // ChainsRegistry queries the latest info for a given list of chains in Babylon's view - rpc ChainsRegistry(QueryChainsRegistryRequest) returns (QueryChainsRegistryResponse) { - option (google.api.http).get = "/babylon/zoneconcierge/v1/chains_registry"; - } } // QueryParamsRequest is the request type for the Query/Params RPC method. @@ -208,25 +200,3 @@ message QueryFinalizedChainInfoUntilHeightResponse { // proof is the proof that the chain info is finalized babylon.zoneconcierge.v1.ProofFinalizedChainInfo proof = 5; } - -// QueryChainRegistryListRequest is request type for the Query/ChainRegistryList RPC method -message QueryChainRegistryListRequest { - // pagination defines whether to have the pagination in the request - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -// QueryChainRegistryListResponse is response type for the Query/ChainRegistryList RPC method -message QueryChainRegistryListResponse { - // chain_ids are IDs of the chains in ascending alphabetical order - repeated string chain_ids = 1; - // pagination defines the pagination in the response - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// QueryChainsRegistryRequest is request type for the Query/ChainsRegistry RPC method. -message QueryChainsRegistryRequest { repeated string chain_ids = 1; } - -// QueryChainsRegistryResponse is response type for the Query/ChainsRegistry RPC method. -message QueryChainsRegistryResponse { - repeated babylon.zoneconcierge.v1.ChainRegister chains_register = 1; -} diff --git a/proto/babylon/zoneconcierge/v1/tx.proto b/proto/babylon/zoneconcierge/v1/tx.proto index faea6e100..b44c332b2 100644 --- a/proto/babylon/zoneconcierge/v1/tx.proto +++ b/proto/babylon/zoneconcierge/v1/tx.proto @@ -15,41 +15,23 @@ service Msg { // UpdateParams updates the zoneconcierge module parameters. rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); - // RegisterChain registers a CZ chain to the zoneconcierge module. - rpc RegisterChain(MsgRegisterChain) returns (MsgRegisterChainResponse); } // MsgUpdateParams defines a message for updating zoneconcierge module parameters. message MsgUpdateParams { - option (cosmos.msg.v1.signer) = "authority"; - - // authority is the address of the governance account. - // just FYI: cosmos.AddressString marks that this field should use type alias - // for AddressString instead of string, but the functionality is not yet implemented - // in cosmos-proto - string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - - // params defines the zoneconcierge parameters to update. - // - // NOTE: All parameters must be supplied. - Params params = 2 [(gogoproto.nullable) = false]; + option (cosmos.msg.v1.signer) = "authority"; + + // authority is the address of the governance account. + // just FYI: cosmos.AddressString marks that this field should use type alias + // for AddressString instead of string, but the functionality is not yet implemented + // in cosmos-proto + string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // params defines the zoneconcierge parameters to update. + // + // NOTE: All parameters must be supplied. + Params params = 2 [(gogoproto.nullable) = false]; } - + // MsgUpdateParamsResponse is the response to the MsgUpdateParams message. message MsgUpdateParamsResponse {} - -// MsgRegisterChain defines a message for registering CZ chains to the zoneconcierge module. -message MsgRegisterChain { - option (cosmos.msg.v1.signer) = "signer"; - - string signer = 1; - // chain_id is the ID of the chain - string chain_id = 2; - // chain_name is the name of the chain - string chain_name = 3; - // chain_description is a description for the chain (can be empty) - string chain_description = 4; -} - -// MsgRegisterChainResponse is the response to the MsgRegisterChain message. -message MsgRegisterChainResponse {} diff --git a/proto/babylon/zoneconcierge/v1/zoneconcierge.proto b/proto/babylon/zoneconcierge/v1/zoneconcierge.proto index 3fa3ac53e..47e316a0f 100644 --- a/proto/babylon/zoneconcierge/v1/zoneconcierge.proto +++ b/proto/babylon/zoneconcierge/v1/zoneconcierge.proto @@ -82,16 +82,6 @@ message ChainInfoWithProof { tendermint.crypto.ProofOps proof_header_in_epoch = 2; } -// ChainRegister is the registration information of a CZ -message ChainRegister { - // chain_id is the ID of the chain - string chain_id = 1; - // chain_name is the name of the chain - string chain_name = 2; - // chain_description is a description for the chain (can be empty) - string chain_description = 3; -} - // FinalizedChainInfo is the information of a CZ that is BTC-finalised message FinalizedChainInfo { // chain_id is the ID of the chain diff --git a/x/zoneconcierge/keeper/consumer_chain_registry.go b/x/btcstkconsumer/keeper/consumer_chain_registry.go similarity index 96% rename from x/zoneconcierge/keeper/consumer_chain_registry.go rename to x/btcstkconsumer/keeper/consumer_chain_registry.go index bc0159dac..634ae515b 100644 --- a/x/zoneconcierge/keeper/consumer_chain_registry.go +++ b/x/btcstkconsumer/keeper/consumer_chain_registry.go @@ -5,7 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/runtime" "cosmossdk.io/store/prefix" - "github.com/babylonchain/babylon/x/zoneconcierge/types" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" ) func (k Keeper) SetChainRegister(ctx context.Context, chainRegister *types.ChainRegister) { diff --git a/x/zoneconcierge/keeper/consumer_chain_registry_test.go b/x/btcstkconsumer/keeper/consumer_chain_registry_test.go similarity index 93% rename from x/zoneconcierge/keeper/consumer_chain_registry_test.go rename to x/btcstkconsumer/keeper/consumer_chain_registry_test.go index d82054606..c0f753667 100644 --- a/x/zoneconcierge/keeper/consumer_chain_registry_test.go +++ b/x/btcstkconsumer/keeper/consumer_chain_registry_test.go @@ -1,7 +1,7 @@ package keeper_test import ( - "github.com/babylonchain/babylon/x/zoneconcierge/types" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" "math/rand" "testing" @@ -17,7 +17,7 @@ func FuzzChainRegistry(f *testing.F) { r := rand.New(rand.NewSource(seed)) babylonApp := app.Setup(t, false) - zcKeeper := babylonApp.ZoneConciergeKeeper + zcKeeper := babylonApp.BTCStkConsumerKeeper ctx := babylonApp.NewContext(false) // Create a random chain id that starts with "test-" czChainID := "test-" + datagen.GenRandomHexStr(r, 10) diff --git a/x/btcstkconsumer/keeper/grpc_query.go b/x/btcstkconsumer/keeper/grpc_query.go new file mode 100644 index 000000000..9cf740596 --- /dev/null +++ b/x/btcstkconsumer/keeper/grpc_query.go @@ -0,0 +1,77 @@ +package keeper + +import ( + "context" + + bbntypes "github.com/babylonchain/babylon/types" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +var _ types.QueryServer = Keeper{} + +const maxQueryChainsRegistryLimit = 100 + +func (k Keeper) ChainRegistryList(c context.Context, req *types.QueryChainRegistryListRequest) (*types.QueryChainRegistryListResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(c) + + chainIDs := []string{} + store := k.chainRegistryStore(ctx) + pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { + chainID := string(key) + chainIDs = append(chainIDs, chainID) + return nil + }) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + resp := &types.QueryChainRegistryListResponse{ + ChainIds: chainIDs, + Pagination: pageRes, + } + return resp, nil +} + +// ChainsRegistry returns the registration for a given list of chains +func (k Keeper) ChainsRegistry(c context.Context, req *types.QueryChainsRegistryRequest) (*types.QueryChainsRegistryResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + // return if no chain IDs are provided + if len(req.ChainIds) == 0 { + return nil, status.Error(codes.InvalidArgument, "chain IDs cannot be empty") + } + + // return if chain IDs exceed the limit + if len(req.ChainIds) > maxQueryChainsRegistryLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsRegistryLimit) + } + + // return if chain IDs contain duplicates or empty strings + if err := bbntypes.CheckForDuplicatesAndEmptyStrings(req.ChainIds); err != nil { + return nil, status.Error(codes.InvalidArgument, types.ErrInvalidChainIDs.Wrap(err.Error()).Error()) + } + + ctx := sdk.UnwrapSDKContext(c) + var chainsRegister []*types.ChainRegister + for _, chainID := range req.ChainIds { + chainRegister, err := k.GetChainRegister(ctx, chainID) + if err != nil { + return nil, err + } + + chainsRegister = append(chainsRegister, chainRegister) + } + + resp := &types.QueryChainsRegistryResponse{ChainsRegister: chainsRegister} + return resp, nil +} diff --git a/x/btcstkconsumer/keeper/grpc_query_test.go b/x/btcstkconsumer/keeper/grpc_query_test.go new file mode 100644 index 000000000..74327199f --- /dev/null +++ b/x/btcstkconsumer/keeper/grpc_query_test.go @@ -0,0 +1,100 @@ +package keeper_test + +import ( + "math/rand" + "testing" + + "github.com/babylonchain/babylon/app" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/stretchr/testify/require" + + "github.com/babylonchain/babylon/testutil/datagen" + zctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +type chainRegister struct { + chainID string +} + +func FuzzChainRegistryList(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + zcKeeper := babylonApp.BTCStkConsumerKeeper + ctx := babylonApp.NewContext(false) + + // invoke the chain registration a random number of times with random chain IDs + numRegistrations := datagen.RandomInt(r, 100) + 1 + var allChainIDs []string + for i := uint64(0); i < numRegistrations; i++ { + var chainID = datagen.GenRandomHexStr(r, 30) + allChainIDs = append(allChainIDs, chainID) + + zcKeeper.SetChainRegister(ctx, &zctypes.ChainRegister{ + ChainId: chainID, + ChainName: datagen.GenRandomHexStr(r, 5), + }) + } + + limit := datagen.RandomInt(r, len(allChainIDs)) + 1 + + // Query to get actual chain IDs + resp, err := zcKeeper.ChainRegistryList(ctx, &zctypes.QueryChainRegistryListRequest{ + Pagination: &query.PageRequest{ + Limit: limit, + }, + }) + require.NoError(t, err) + actualChainIDs := resp.ChainIds + + require.Equal(t, limit, uint64(len(actualChainIDs))) + for i := uint64(0); i < limit; i++ { + require.Contains(t, allChainIDs, actualChainIDs[i]) + } + }) +} + +func FuzzChainsRegistry(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + zcKeeper := babylonApp.BTCStkConsumerKeeper + ctx := babylonApp.NewContext(false) + + var ( + chainsRegister []chainRegister + chainIDs []string + ) + // invoke the chain registration a random number of times with random chain IDs + numChains := datagen.RandomInt(r, 100) + 1 + for i := uint64(0); i < numChains; i++ { + chainID := datagen.GenRandomHexStr(r, 30) + + chainIDs = append(chainIDs, chainID) + chainsRegister = append(chainsRegister, chainRegister{ + chainID: chainID, + }) + + zcKeeper.SetChainRegister(ctx, &zctypes.ChainRegister{ + ChainId: chainID, + ChainName: datagen.GenRandomHexStr(r, 5), + }) + + } + + resp, err := zcKeeper.ChainsRegistry(ctx, &zctypes.QueryChainsRegistryRequest{ + ChainIds: chainIDs, + }) + require.NoError(t, err) + + for i, respData := range resp.ChainsRegister { + require.Equal(t, chainsRegister[i].chainID, respData.ChainId) + } + }) +} diff --git a/x/btcstkconsumer/keeper/msg_server.go b/x/btcstkconsumer/keeper/msg_server.go index f970cbc0c..79c40a6d3 100644 --- a/x/btcstkconsumer/keeper/msg_server.go +++ b/x/btcstkconsumer/keeper/msg_server.go @@ -1,7 +1,10 @@ package keeper import ( + "context" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" + sdk "github.com/cosmos/cosmos-sdk/types" ) type msgServer struct { @@ -15,3 +18,25 @@ func NewMsgServerImpl(keeper Keeper) types.MsgServer { } var _ types.MsgServer = msgServer{} + +// RegisterChain registers a CZ chain +func (ms msgServer) RegisterChain(goCtx context.Context, req *types.MsgRegisterChain) (*types.MsgRegisterChainResponse, error) { + // Create ChanRegister from MsgRegisterChain + chainRegister := types.ChainRegister{ + ChainId: req.ChainId, + ChainName: req.ChainName, + ChainDescription: req.ChainDescription, + } + + if err := chainRegister.Validate(); err != nil { + return nil, types.ErrInvalidChainRegister.Wrapf("invalid chain: %v", err) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + if ms.IsChainRegistered(ctx, req.ChainId) { + return nil, types.ErrChainAlreadyRegistered + } + ms.SetChainRegister(ctx, &chainRegister) + + return &types.MsgRegisterChainResponse{}, nil +} diff --git a/x/btcstkconsumer/types/btcstkconsumer.pb.go b/x/btcstkconsumer/types/btcstkconsumer.pb.go new file mode 100644 index 000000000..cb0c073fd --- /dev/null +++ b/x/btcstkconsumer/types/btcstkconsumer.pb.go @@ -0,0 +1,426 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: babylon/btcstkconsumer/v1/btcstkconsumer.proto + +package types + +import ( + fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// ChainRegister is the registration information of a CZ +type ChainRegister struct { + // chain_id is the ID of the chain + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // chain_name is the name of the chain + ChainName string `protobuf:"bytes,2,opt,name=chain_name,json=chainName,proto3" json:"chain_name,omitempty"` + // chain_description is a description for the chain (can be empty) + ChainDescription string `protobuf:"bytes,3,opt,name=chain_description,json=chainDescription,proto3" json:"chain_description,omitempty"` +} + +func (m *ChainRegister) Reset() { *m = ChainRegister{} } +func (m *ChainRegister) String() string { return proto.CompactTextString(m) } +func (*ChainRegister) ProtoMessage() {} +func (*ChainRegister) Descriptor() ([]byte, []int) { + return fileDescriptor_de3ccd621fe1efd4, []int{0} +} +func (m *ChainRegister) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChainRegister) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChainRegister.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 *ChainRegister) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChainRegister.Merge(m, src) +} +func (m *ChainRegister) XXX_Size() int { + return m.Size() +} +func (m *ChainRegister) XXX_DiscardUnknown() { + xxx_messageInfo_ChainRegister.DiscardUnknown(m) +} + +var xxx_messageInfo_ChainRegister proto.InternalMessageInfo + +func (m *ChainRegister) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +func (m *ChainRegister) GetChainName() string { + if m != nil { + return m.ChainName + } + return "" +} + +func (m *ChainRegister) GetChainDescription() string { + if m != nil { + return m.ChainDescription + } + return "" +} + +func init() { + proto.RegisterType((*ChainRegister)(nil), "babylon.btcstkconsumer.v1.ChainRegister") +} + +func init() { + proto.RegisterFile("babylon/btcstkconsumer/v1/btcstkconsumer.proto", fileDescriptor_de3ccd621fe1efd4) +} + +var fileDescriptor_de3ccd621fe1efd4 = []byte{ + // 215 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x4b, 0x4a, 0x4c, 0xaa, + 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, + 0x4d, 0x2d, 0xd2, 0x2f, 0x33, 0x44, 0x13, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x84, + 0xaa, 0xd7, 0x43, 0x93, 0x2d, 0x33, 0x54, 0x2a, 0xe3, 0xe2, 0x75, 0xce, 0x48, 0xcc, 0xcc, 0x0b, + 0x4a, 0x4d, 0xcf, 0x2c, 0x2e, 0x49, 0x2d, 0x12, 0x92, 0xe4, 0xe2, 0x48, 0x06, 0x09, 0xc4, 0x67, + 0xa6, 0x48, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0xb1, 0x83, 0xf9, 0x9e, 0x29, 0x42, 0xb2, 0x5c, + 0x5c, 0x10, 0xa9, 0xbc, 0xc4, 0xdc, 0x54, 0x09, 0x26, 0xb0, 0x24, 0x27, 0x58, 0xc4, 0x2f, 0x31, + 0x37, 0x55, 0x48, 0x9b, 0x4b, 0x10, 0x22, 0x9d, 0x92, 0x5a, 0x9c, 0x5c, 0x94, 0x59, 0x50, 0x92, + 0x99, 0x9f, 0x27, 0xc1, 0x0c, 0x56, 0x25, 0x00, 0x96, 0x70, 0x41, 0x88, 0x3b, 0x05, 0x9c, 0x78, + 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, + 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x59, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, + 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xd4, 0xdd, 0x60, 0xdd, 0x30, 0x8e, 0x7e, 0x05, 0xba, 0xb7, 0x4b, + 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x7e, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x3c, + 0xde, 0xbc, 0x51, 0x1d, 0x01, 0x00, 0x00, +} + +func (m *ChainRegister) 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 *ChainRegister) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChainRegister) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainDescription) > 0 { + i -= len(m.ChainDescription) + copy(dAtA[i:], m.ChainDescription) + i = encodeVarintBtcstkconsumer(dAtA, i, uint64(len(m.ChainDescription))) + i-- + dAtA[i] = 0x1a + } + if len(m.ChainName) > 0 { + i -= len(m.ChainName) + copy(dAtA[i:], m.ChainName) + i = encodeVarintBtcstkconsumer(dAtA, i, uint64(len(m.ChainName))) + i-- + dAtA[i] = 0x12 + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintBtcstkconsumer(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintBtcstkconsumer(dAtA []byte, offset int, v uint64) int { + offset -= sovBtcstkconsumer(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ChainRegister) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovBtcstkconsumer(uint64(l)) + } + l = len(m.ChainName) + if l > 0 { + n += 1 + l + sovBtcstkconsumer(uint64(l)) + } + l = len(m.ChainDescription) + if l > 0 { + n += 1 + l + sovBtcstkconsumer(uint64(l)) + } + return n +} + +func sovBtcstkconsumer(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozBtcstkconsumer(x uint64) (n int) { + return sovBtcstkconsumer(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *ChainRegister) 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 ErrIntOverflowBtcstkconsumer + } + 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: ChainRegister: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChainRegister: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBtcstkconsumer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBtcstkconsumer + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBtcstkconsumer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBtcstkconsumer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBtcstkconsumer + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBtcstkconsumer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainDescription", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBtcstkconsumer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBtcstkconsumer + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBtcstkconsumer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainDescription = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipBtcstkconsumer(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthBtcstkconsumer + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipBtcstkconsumer(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBtcstkconsumer + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBtcstkconsumer + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBtcstkconsumer + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthBtcstkconsumer + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupBtcstkconsumer + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthBtcstkconsumer + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthBtcstkconsumer = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowBtcstkconsumer = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupBtcstkconsumer = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/zoneconcierge/types/chain_register.go b/x/btcstkconsumer/types/chain_register.go similarity index 67% rename from x/zoneconcierge/types/chain_register.go rename to x/btcstkconsumer/types/chain_register.go index 82e856e63..894883691 100644 --- a/x/zoneconcierge/types/chain_register.go +++ b/x/btcstkconsumer/types/chain_register.go @@ -2,10 +2,13 @@ package types import ( "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" ) +var _ sdk.Msg = &MsgRegisterChain{} + // Validate validates the set of params -func (cr ChainRegister) Validate() error { +func (cr *ChainRegister) Validate() error { if len(cr.ChainId) == 0 { return fmt.Errorf("ChainId must be non-empty") } diff --git a/x/btcstkconsumer/types/errors.go b/x/btcstkconsumer/types/errors.go index 6ef6ec33e..388a0fb5c 100644 --- a/x/btcstkconsumer/types/errors.go +++ b/x/btcstkconsumer/types/errors.go @@ -8,6 +8,9 @@ import ( // x/btcstkconsumer module sentinel errors var ( - ErrInvalidSigner = sdkerrors.Register(ModuleName, 1100, "expected gov account as only signer for proposal message") - ErrSample = sdkerrors.Register(ModuleName, 1101, "sample error") + ErrInvalidSigner = sdkerrors.Register(ModuleName, 1100, "expected gov account as only signer for proposal message") + ErrChainNotRegistered = sdkerrors.Register(ModuleName, 1101, "chain not registered") + ErrInvalidChainRegister = sdkerrors.Register(ModuleName, 1102, "invalid chain register") + ErrChainAlreadyRegistered = sdkerrors.Register(ModuleName, 1103, "chain already registered") + ErrInvalidChainIDs = sdkerrors.Register(ModuleName, 1104, "chain ids contain duplicates or empty strings") ) diff --git a/x/btcstkconsumer/types/genesis.pb.go b/x/btcstkconsumer/types/genesis.pb.go index be4f495da..41c55bf85 100644 --- a/x/btcstkconsumer/types/genesis.pb.go +++ b/x/btcstkconsumer/types/genesis.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btcstkconsumer/genesis.proto +// source: babylon/btcstkconsumer/v1/genesis.proto package types @@ -34,7 +34,7 @@ func (m *GenesisState) Reset() { *m = GenesisState{} } func (m *GenesisState) String() string { return proto.CompactTextString(m) } func (*GenesisState) ProtoMessage() {} func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_a94754f5b206a0cb, []int{0} + return fileDescriptor_9603f1c9bd7f81d6, []int{0} } func (m *GenesisState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71,29 +71,29 @@ func (m *GenesisState) GetParams() Params { } func init() { - proto.RegisterType((*GenesisState)(nil), "babylon.btcstkconsumer.GenesisState") + proto.RegisterType((*GenesisState)(nil), "babylon.btcstkconsumer.v1.GenesisState") } func init() { - proto.RegisterFile("babylon/btcstkconsumer/genesis.proto", fileDescriptor_a94754f5b206a0cb) + proto.RegisterFile("babylon/btcstkconsumer/v1/genesis.proto", fileDescriptor_9603f1c9bd7f81d6) } -var fileDescriptor_a94754f5b206a0cb = []byte{ - // 216 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0x4a, 0x4c, 0xaa, +var fileDescriptor_9603f1c9bd7f81d6 = []byte{ + // 222 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4f, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, - 0x4d, 0x2d, 0xd2, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, - 0x17, 0x12, 0x83, 0xaa, 0xd2, 0x43, 0x55, 0x25, 0x25, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, - 0x26, 0x21, 0x4a, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x4c, 0x7d, 0x10, 0x0b, 0x2a, 0xaa, - 0x8c, 0xc3, 0x9a, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, 0x2d, 0x4a, 0x81, 0x5c, 0x3c, 0xee, 0x10, - 0x6b, 0x83, 0x4b, 0x12, 0x4b, 0x52, 0x85, 0x1c, 0xb9, 0xd8, 0x20, 0xf2, 0x12, 0x8c, 0x0a, 0x8c, - 0x1a, 0xdc, 0x46, 0x72, 0x7a, 0xd8, 0x9d, 0xa1, 0x17, 0x00, 0x56, 0xe5, 0xc4, 0x79, 0xe2, 0x9e, - 0x3c, 0xc3, 0x8a, 0xe7, 0x1b, 0xb4, 0x18, 0x83, 0xa0, 0x1a, 0x9d, 0x02, 0x4e, 0x3c, 0x92, 0x63, - 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, - 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x2c, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, - 0x3f, 0x57, 0x1f, 0x6a, 0x6c, 0x72, 0x46, 0x62, 0x66, 0x1e, 0x8c, 0xa3, 0x5f, 0x81, 0xee, 0xd6, - 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0x5b, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x8d, 0xf4, 0x47, 0x05, 0x39, 0x01, 0x00, 0x00, + 0x4d, 0x2d, 0xd2, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, + 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x84, 0x2a, 0xd4, 0x43, 0x55, 0xa8, 0x57, 0x66, 0x28, 0x25, 0x98, + 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, 0x21, 0xaa, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, + 0x4c, 0x7d, 0x10, 0x0b, 0x2a, 0xaa, 0x86, 0xdb, 0xb2, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, 0x5d, + 0x4a, 0x21, 0x5c, 0x3c, 0xee, 0x10, 0xcb, 0x83, 0x4b, 0x12, 0x4b, 0x52, 0x85, 0x5c, 0xb8, 0xd8, + 0x20, 0xf2, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xdc, 0x46, 0x8a, 0x7a, 0x38, 0x1d, 0xa3, 0x17, 0x00, + 0x56, 0xe8, 0xc4, 0x79, 0xe2, 0x9e, 0x3c, 0xc3, 0x8a, 0xe7, 0x1b, 0xb4, 0x18, 0x83, 0xa0, 0x7a, + 0x9d, 0x02, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, + 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x2c, 0x3d, 0xb3, + 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6a, 0x72, 0x72, 0x46, 0x62, 0x66, 0x1e, + 0x8c, 0xa3, 0x5f, 0x81, 0xee, 0xe2, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0x73, 0x8d, + 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x60, 0x5c, 0x83, 0x45, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/btcstkconsumer/types/keys.go b/x/btcstkconsumer/types/keys.go index 25f6ef9c3..044fe59e0 100644 --- a/x/btcstkconsumer/types/keys.go +++ b/x/btcstkconsumer/types/keys.go @@ -15,7 +15,8 @@ const ( ) var ( - ParamsKey = []byte("p_btcstkconsumer") + ParamsKey = []byte("p_btcstkconsumer") + ChainRegisterKey = []byte{0x01} // ChainRegisterKey defines the key to store the chain register for each CZ in store ) func KeyPrefix(p string) []byte { diff --git a/x/btcstkconsumer/types/params.pb.go b/x/btcstkconsumer/types/params.pb.go index e30383cba..c626819b3 100644 --- a/x/btcstkconsumer/types/params.pb.go +++ b/x/btcstkconsumer/types/params.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btcstkconsumer/params.proto +// source: babylon/btcstkconsumer/v1/params.proto package types @@ -32,7 +32,7 @@ func (m *Params) Reset() { *m = Params{} } func (m *Params) String() string { return proto.CompactTextString(m) } func (*Params) ProtoMessage() {} func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_53dadced3b9d4fb0, []int{0} + return fileDescriptor_793a25adddb62a3d, []int{0} } func (m *Params) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -62,27 +62,27 @@ func (m *Params) XXX_DiscardUnknown() { var xxx_messageInfo_Params proto.InternalMessageInfo func init() { - proto.RegisterType((*Params)(nil), "babylon.btcstkconsumer.Params") + proto.RegisterType((*Params)(nil), "babylon.btcstkconsumer.v1.Params") } func init() { - proto.RegisterFile("babylon/btcstkconsumer/params.proto", fileDescriptor_53dadced3b9d4fb0) + proto.RegisterFile("babylon/btcstkconsumer/v1/params.proto", fileDescriptor_793a25adddb62a3d) } -var fileDescriptor_53dadced3b9d4fb0 = []byte{ - // 179 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4e, 0x4a, 0x4c, 0xaa, +var fileDescriptor_793a25adddb62a3d = []byte{ + // 186 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4b, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, - 0x4d, 0x2d, 0xd2, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, - 0x12, 0x83, 0x2a, 0xd2, 0x43, 0x55, 0x24, 0x25, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, - 0x21, 0x4a, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x4c, 0x7d, 0x10, 0x0b, 0x22, 0xaa, 0x64, - 0xc4, 0xc5, 0x16, 0x00, 0x36, 0xd0, 0x4a, 0xe3, 0xc5, 0x02, 0x79, 0xc6, 0xae, 0xe7, 0x1b, 0xb4, - 0xe4, 0x61, 0x16, 0x57, 0xa0, 0x5b, 0x0d, 0x51, 0xe9, 0x14, 0x70, 0xe2, 0x91, 0x1c, 0xe3, 0x85, - 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, - 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0x66, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, - 0xfa, 0x50, 0x53, 0x92, 0x33, 0x12, 0x33, 0xf3, 0xf4, 0x71, 0x1a, 0x59, 0x52, 0x59, 0x90, 0x5a, - 0x9c, 0xc4, 0x06, 0x76, 0x8c, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x17, 0x7a, 0x9e, 0xbe, 0xf4, - 0x00, 0x00, 0x00, + 0x4d, 0x2d, 0xd2, 0x2f, 0x33, 0xd4, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, + 0x2f, 0xc9, 0x17, 0x92, 0x84, 0xaa, 0xd3, 0x43, 0x55, 0xa7, 0x57, 0x66, 0x28, 0x25, 0x98, 0x98, + 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, 0x21, 0xaa, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x4c, + 0x7d, 0x10, 0x0b, 0x22, 0xaa, 0x64, 0xca, 0xc5, 0x16, 0x00, 0x36, 0xd3, 0x4a, 0xfb, 0xc5, 0x02, + 0x79, 0xc6, 0xae, 0xe7, 0x1b, 0xb4, 0x94, 0x60, 0xd6, 0x57, 0x60, 0x71, 0x00, 0x44, 0xb1, 0x53, + 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, + 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x99, 0xa5, 0x67, 0x96, 0x64, + 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0x43, 0x0d, 0x4a, 0xce, 0x48, 0xcc, 0xcc, 0xd3, 0xc7, + 0x69, 0x6a, 0x49, 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x3d, 0xc6, 0x80, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xf8, 0x5f, 0x6b, 0xaa, 0xfd, 0x00, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { diff --git a/x/btcstkconsumer/types/query.pb.go b/x/btcstkconsumer/types/query.pb.go index 43021aecc..0fb0e5423 100644 --- a/x/btcstkconsumer/types/query.pb.go +++ b/x/btcstkconsumer/types/query.pb.go @@ -1,11 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btcstkconsumer/query.proto +// source: babylon/btcstkconsumer/v1/query.proto package types import ( context "context" fmt "fmt" + query "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" @@ -38,7 +39,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_4d35172ed333c293, []int{0} + return fileDescriptor_4e6c48e60b6a8bd8, []int{0} } func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -77,7 +78,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_4d35172ed333c293, []int{1} + return fileDescriptor_4e6c48e60b6a8bd8, []int{1} } func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -113,36 +114,247 @@ func (m *QueryParamsResponse) GetParams() Params { return Params{} } +// QueryChainRegistryListRequest is request type for the Query/ChainRegistryList RPC method +type QueryChainRegistryListRequest struct { + // pagination defines whether to have the pagination in the request + Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryChainRegistryListRequest) Reset() { *m = QueryChainRegistryListRequest{} } +func (m *QueryChainRegistryListRequest) String() string { return proto.CompactTextString(m) } +func (*QueryChainRegistryListRequest) ProtoMessage() {} +func (*QueryChainRegistryListRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{2} +} +func (m *QueryChainRegistryListRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainRegistryListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainRegistryListRequest.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 *QueryChainRegistryListRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainRegistryListRequest.Merge(m, src) +} +func (m *QueryChainRegistryListRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryChainRegistryListRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainRegistryListRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainRegistryListRequest proto.InternalMessageInfo + +func (m *QueryChainRegistryListRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +// QueryChainRegistryListResponse is response type for the Query/ChainRegistryList RPC method +type QueryChainRegistryListResponse struct { + // chain_ids are IDs of the chains in ascending alphabetical order + ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` + // pagination defines the pagination in the response + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryChainRegistryListResponse) Reset() { *m = QueryChainRegistryListResponse{} } +func (m *QueryChainRegistryListResponse) String() string { return proto.CompactTextString(m) } +func (*QueryChainRegistryListResponse) ProtoMessage() {} +func (*QueryChainRegistryListResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{3} +} +func (m *QueryChainRegistryListResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainRegistryListResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainRegistryListResponse.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 *QueryChainRegistryListResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainRegistryListResponse.Merge(m, src) +} +func (m *QueryChainRegistryListResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryChainRegistryListResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainRegistryListResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainRegistryListResponse proto.InternalMessageInfo + +func (m *QueryChainRegistryListResponse) GetChainIds() []string { + if m != nil { + return m.ChainIds + } + return nil +} + +func (m *QueryChainRegistryListResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + +// QueryChainsRegistryRequest is request type for the Query/ChainsRegistry RPC method. +type QueryChainsRegistryRequest struct { + ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` +} + +func (m *QueryChainsRegistryRequest) Reset() { *m = QueryChainsRegistryRequest{} } +func (m *QueryChainsRegistryRequest) String() string { return proto.CompactTextString(m) } +func (*QueryChainsRegistryRequest) ProtoMessage() {} +func (*QueryChainsRegistryRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{4} +} +func (m *QueryChainsRegistryRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainsRegistryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainsRegistryRequest.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 *QueryChainsRegistryRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainsRegistryRequest.Merge(m, src) +} +func (m *QueryChainsRegistryRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryChainsRegistryRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainsRegistryRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainsRegistryRequest proto.InternalMessageInfo + +func (m *QueryChainsRegistryRequest) GetChainIds() []string { + if m != nil { + return m.ChainIds + } + return nil +} + +// QueryChainsRegistryResponse is response type for the Query/ChainsRegistry RPC method. +type QueryChainsRegistryResponse struct { + ChainsRegister []*ChainRegister `protobuf:"bytes,1,rep,name=chains_register,json=chainsRegister,proto3" json:"chains_register,omitempty"` +} + +func (m *QueryChainsRegistryResponse) Reset() { *m = QueryChainsRegistryResponse{} } +func (m *QueryChainsRegistryResponse) String() string { return proto.CompactTextString(m) } +func (*QueryChainsRegistryResponse) ProtoMessage() {} +func (*QueryChainsRegistryResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{5} +} +func (m *QueryChainsRegistryResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryChainsRegistryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryChainsRegistryResponse.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 *QueryChainsRegistryResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryChainsRegistryResponse.Merge(m, src) +} +func (m *QueryChainsRegistryResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryChainsRegistryResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryChainsRegistryResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryChainsRegistryResponse proto.InternalMessageInfo + +func (m *QueryChainsRegistryResponse) GetChainsRegister() []*ChainRegister { + if m != nil { + return m.ChainsRegister + } + return nil +} + func init() { - proto.RegisterType((*QueryParamsRequest)(nil), "babylon.btcstkconsumer.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "babylon.btcstkconsumer.QueryParamsResponse") + proto.RegisterType((*QueryParamsRequest)(nil), "babylon.btcstkconsumer.v1.QueryParamsRequest") + proto.RegisterType((*QueryParamsResponse)(nil), "babylon.btcstkconsumer.v1.QueryParamsResponse") + proto.RegisterType((*QueryChainRegistryListRequest)(nil), "babylon.btcstkconsumer.v1.QueryChainRegistryListRequest") + proto.RegisterType((*QueryChainRegistryListResponse)(nil), "babylon.btcstkconsumer.v1.QueryChainRegistryListResponse") + proto.RegisterType((*QueryChainsRegistryRequest)(nil), "babylon.btcstkconsumer.v1.QueryChainsRegistryRequest") + proto.RegisterType((*QueryChainsRegistryResponse)(nil), "babylon.btcstkconsumer.v1.QueryChainsRegistryResponse") } func init() { - proto.RegisterFile("babylon/btcstkconsumer/query.proto", fileDescriptor_4d35172ed333c293) -} - -var fileDescriptor_4d35172ed333c293 = []byte{ - // 296 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, - 0x4d, 0x2d, 0xd2, 0x2f, 0x2c, 0x4d, 0x2d, 0xaa, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, - 0x83, 0xaa, 0xd1, 0x43, 0x55, 0x23, 0x25, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, 0x21, - 0x4a, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x4c, 0x7d, 0x10, 0x0b, 0x2a, 0x2a, 0x93, 0x9e, - 0x9f, 0x9f, 0x9e, 0x93, 0xaa, 0x9f, 0x58, 0x90, 0xa9, 0x9f, 0x98, 0x97, 0x97, 0x5f, 0x92, 0x58, - 0x92, 0x99, 0x9f, 0x57, 0x0c, 0x95, 0x55, 0xc6, 0xe1, 0x84, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, - 0x22, 0x25, 0x11, 0x2e, 0xa1, 0x40, 0x90, 0x93, 0x02, 0xc0, 0x82, 0x41, 0xa9, 0x85, 0xa5, 0xa9, - 0xc5, 0x25, 0x4a, 0x11, 0x5c, 0xc2, 0x28, 0xa2, 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x42, 0x8e, - 0x5c, 0x6c, 0x10, 0xcd, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xdc, 0x46, 0x72, 0x7a, 0xd8, 0x7d, 0xa0, - 0x07, 0xd1, 0xe7, 0xc4, 0x79, 0xe2, 0x9e, 0x3c, 0xc3, 0x8a, 0xe7, 0x1b, 0xb4, 0x18, 0x83, 0xa0, - 0x1a, 0x8d, 0x16, 0x30, 0x72, 0xb1, 0x82, 0x8d, 0x16, 0x9a, 0xc6, 0xc8, 0xc5, 0x06, 0x51, 0x27, - 0xa4, 0x85, 0xcb, 0x1c, 0x4c, 0xa7, 0x49, 0x69, 0x13, 0xa5, 0x16, 0xe2, 0x60, 0x25, 0xe3, 0xa6, - 0xcb, 0x4f, 0x26, 0x33, 0xe9, 0x0a, 0x69, 0xeb, 0x43, 0x35, 0x25, 0x67, 0x24, 0x66, 0xe6, 0xe9, - 0xe3, 0x0d, 0x18, 0xa7, 0x80, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, - 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, - 0x4b, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xc5, 0x6e, 0x60, 0x05, 0xba, 0x91, - 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, - 0x4b, 0xe3, 0x57, 0x0c, 0x15, 0x02, 0x00, 0x00, + proto.RegisterFile("babylon/btcstkconsumer/v1/query.proto", fileDescriptor_4e6c48e60b6a8bd8) +} + +var fileDescriptor_4e6c48e60b6a8bd8 = []byte{ + // 545 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x4f, 0x6b, 0x13, 0x41, + 0x18, 0xc6, 0x33, 0x55, 0x83, 0x99, 0x42, 0xa5, 0x63, 0x0f, 0xba, 0xd5, 0x55, 0x17, 0xac, 0x21, + 0xe8, 0x8c, 0x89, 0x18, 0xec, 0xb5, 0x8a, 0x22, 0x78, 0x48, 0xf7, 0xa8, 0x87, 0x30, 0xbb, 0x1d, + 0xb6, 0x8b, 0xd9, 0x9d, 0xed, 0xcc, 0x24, 0x98, 0xab, 0x07, 0xcf, 0x82, 0x1f, 0x40, 0xf0, 0xe4, + 0x51, 0xf0, 0x0b, 0x78, 0xec, 0xb1, 0xe0, 0xc5, 0x93, 0x48, 0x22, 0xf8, 0x35, 0x64, 0x67, 0xa6, + 0x36, 0x9b, 0x66, 0x93, 0xd8, 0x4b, 0x58, 0xde, 0x79, 0x9e, 0xf7, 0xfd, 0xbd, 0x7f, 0x08, 0xbc, + 0x1d, 0xd0, 0x60, 0xd8, 0xe3, 0x29, 0x09, 0x54, 0x28, 0xd5, 0xeb, 0x90, 0xa7, 0xb2, 0x9f, 0x30, + 0x41, 0x06, 0x4d, 0x72, 0xd0, 0x67, 0x62, 0x88, 0x33, 0xc1, 0x15, 0x47, 0x57, 0xad, 0x0c, 0x17, + 0x65, 0x78, 0xd0, 0x74, 0xd6, 0x69, 0x12, 0xa7, 0x9c, 0xe8, 0x5f, 0xa3, 0x76, 0x36, 0x22, 0x1e, + 0x71, 0xfd, 0x49, 0xf2, 0x2f, 0x1b, 0xbd, 0x16, 0x71, 0x1e, 0xf5, 0x18, 0xa1, 0x59, 0x4c, 0x68, + 0x9a, 0x72, 0x45, 0x55, 0xcc, 0x53, 0x69, 0x5f, 0x1b, 0x21, 0x97, 0x09, 0x97, 0x24, 0xa0, 0x92, + 0x99, 0xd2, 0x64, 0xd0, 0x0c, 0x98, 0xa2, 0x4d, 0x92, 0xd1, 0x28, 0x4e, 0xb5, 0xd8, 0x6a, 0x71, + 0x39, 0xf4, 0x14, 0x9f, 0xd1, 0x6f, 0x95, 0xeb, 0x33, 0x2a, 0x68, 0x62, 0x19, 0xbc, 0x0d, 0x88, + 0x76, 0xf3, 0xca, 0x1d, 0x1d, 0xf4, 0xd9, 0x41, 0x9f, 0x49, 0xe5, 0xbd, 0x82, 0x97, 0x0b, 0x51, + 0x99, 0xf1, 0x54, 0x32, 0xf4, 0x04, 0x56, 0x8d, 0xf9, 0x0a, 0xb8, 0x09, 0xea, 0xab, 0xad, 0x5b, + 0xb8, 0x74, 0x46, 0xd8, 0x58, 0x77, 0x6a, 0x87, 0x3f, 0x6f, 0x54, 0x3e, 0xff, 0xf9, 0xd2, 0x00, + 0xbe, 0xf5, 0x7a, 0x11, 0xbc, 0xae, 0x93, 0x3f, 0xde, 0xa7, 0x71, 0xea, 0xb3, 0x28, 0x96, 0x4a, + 0x0c, 0x5f, 0xc4, 0x52, 0xd9, 0xea, 0xe8, 0x29, 0x84, 0x27, 0xfd, 0xdb, 0x52, 0x5b, 0xd8, 0x0c, + 0x0b, 0xe7, 0xc3, 0xc2, 0x66, 0x4f, 0x76, 0x58, 0xb8, 0x43, 0x23, 0x66, 0xbd, 0xfe, 0x84, 0xd3, + 0x7b, 0x07, 0xa0, 0x5b, 0x56, 0xc9, 0x76, 0xb4, 0x09, 0x6b, 0x61, 0xfe, 0xd8, 0x8d, 0xf7, 0xf2, + 0xa6, 0xce, 0xd5, 0x6b, 0xfe, 0x45, 0x1d, 0x78, 0xbe, 0x27, 0xd1, 0xb3, 0x02, 0xc7, 0x8a, 0xe6, + 0xb8, 0xb3, 0x90, 0xc3, 0x64, 0x2e, 0x80, 0x6c, 0x43, 0xe7, 0x84, 0x43, 0x1e, 0x83, 0x1c, 0xb7, + 0x3b, 0x8f, 0xc1, 0xcb, 0xe0, 0xe6, 0x4c, 0xab, 0xe5, 0xdf, 0x85, 0x97, 0xb4, 0x54, 0x76, 0x85, + 0x7e, 0x62, 0x42, 0x67, 0x58, 0x6d, 0xd5, 0xe7, 0xac, 0x66, 0x62, 0x1c, 0x4c, 0xf8, 0x6b, 0xe1, + 0x44, 0x6a, 0x26, 0x5a, 0x9f, 0xce, 0xc3, 0x0b, 0xba, 0x24, 0xfa, 0x08, 0x60, 0xd5, 0xac, 0x11, + 0xdd, 0x9b, 0x93, 0xee, 0xf4, 0xfd, 0x38, 0x78, 0x59, 0xb9, 0x69, 0xc3, 0x6b, 0xbf, 0xfd, 0xfe, + 0xfb, 0xc3, 0xca, 0x7d, 0x84, 0x89, 0xf5, 0x69, 0x26, 0xb2, 0xe8, 0x86, 0xd1, 0x37, 0x00, 0xd7, + 0x4f, 0x2d, 0x17, 0x3d, 0x5a, 0x54, 0xbd, 0xec, 0xf2, 0x9c, 0xed, 0x33, 0x38, 0xcb, 0x5a, 0x98, + 0x41, 0x6d, 0xd6, 0x2c, 0xac, 0xbd, 0xdb, 0xcb, 0x61, 0xbf, 0x02, 0xb8, 0x56, 0x5c, 0x2e, 0x7a, + 0xb8, 0x14, 0xc5, 0xf4, 0x1d, 0x39, 0xed, 0xff, 0xb5, 0x59, 0xf2, 0x96, 0x26, 0xbf, 0x8b, 0x1a, + 0x8b, 0xc8, 0xe5, 0x3f, 0xf4, 0x9d, 0xce, 0xe1, 0xc8, 0x05, 0x47, 0x23, 0x17, 0xfc, 0x1a, 0xb9, + 0xe0, 0xfd, 0xd8, 0xad, 0x1c, 0x8d, 0xdd, 0xca, 0x8f, 0xb1, 0x5b, 0x79, 0xd9, 0x8e, 0x62, 0xb5, + 0xdf, 0x0f, 0x70, 0xc8, 0x93, 0xd9, 0xcb, 0x7c, 0x33, 0x9d, 0x5e, 0x0d, 0x33, 0x26, 0x83, 0xaa, + 0xfe, 0x3f, 0x7a, 0xf0, 0x37, 0x00, 0x00, 0xff, 0xff, 0x83, 0x96, 0xd6, 0xf2, 0x9e, 0x05, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -159,6 +371,10 @@ const _ = grpc.SupportPackageIsVersion4 type QueryClient interface { // Parameters queries the parameters of the module. Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) + // ChainRegistryList queries the list of chains that are registered to Babylon + ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) + // ChainsRegistry queries the latest info for a given list of chains in Babylon's view + ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) } type queryClient struct { @@ -171,7 +387,25 @@ func NewQueryClient(cc grpc1.ClientConn) QueryClient { func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.Query/Params", in, out, opts...) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/Params", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) { + out := new(QueryChainRegistryListResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/ChainRegistryList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) { + out := new(QueryChainsRegistryResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/ChainsRegistry", in, out, opts...) if err != nil { return nil, err } @@ -182,6 +416,10 @@ func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts . type QueryServer interface { // Parameters queries the parameters of the module. Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) + // ChainRegistryList queries the list of chains that are registered to Babylon + ChainRegistryList(context.Context, *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) + // ChainsRegistry queries the latest info for a given list of chains in Babylon's view + ChainsRegistry(context.Context, *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -191,6 +429,12 @@ type UnimplementedQueryServer struct { func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") } +func (*UnimplementedQueryServer) ChainRegistryList(ctx context.Context, req *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChainRegistryList not implemented") +} +func (*UnimplementedQueryServer) ChainsRegistry(ctx context.Context, req *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChainsRegistry not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -206,7 +450,7 @@ func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/babylon.btcstkconsumer.Query/Params", + FullMethod: "/babylon.btcstkconsumer.v1.Query/Params", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) @@ -214,17 +458,61 @@ func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } +func _Query_ChainRegistryList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryChainRegistryListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ChainRegistryList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.btcstkconsumer.v1.Query/ChainRegistryList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ChainRegistryList(ctx, req.(*QueryChainRegistryListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_ChainsRegistry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryChainsRegistryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ChainsRegistry(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.btcstkconsumer.v1.Query/ChainsRegistry", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ChainsRegistry(ctx, req.(*QueryChainsRegistryRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ - ServiceName: "babylon.btcstkconsumer.Query", + ServiceName: "babylon.btcstkconsumer.v1.Query", HandlerType: (*QueryServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "Params", Handler: _Query_Params_Handler, }, + { + MethodName: "ChainRegistryList", + Handler: _Query_ChainRegistryList_Handler, + }, + { + MethodName: "ChainsRegistry", + Handler: _Query_ChainsRegistry_Handler, + }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/btcstkconsumer/query.proto", + Metadata: "babylon/btcstkconsumer/v1/query.proto", } func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { @@ -283,6 +571,154 @@ func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *QueryChainRegistryListRequest) 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 *QueryChainRegistryListRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryChainRegistryListRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.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 *QueryChainRegistryListResponse) 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 *QueryChainRegistryListResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryChainRegistryListResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ChainIds) > 0 { + for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ChainIds[iNdEx]) + copy(dAtA[i:], m.ChainIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryChainsRegistryRequest) 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 *QueryChainsRegistryRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryChainsRegistryRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainIds) > 0 { + for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ChainIds[iNdEx]) + copy(dAtA[i:], m.ChainIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryChainsRegistryResponse) 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 *QueryChainsRegistryResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryChainsRegistryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainsRegister) > 0 { + for iNdEx := len(m.ChainsRegister) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ChainsRegister[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 encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -314,9 +750,71 @@ func (m *QueryParamsResponse) Size() (n int) { return n } -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} +func (m *QueryChainRegistryListRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryChainRegistryListResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChainIds) > 0 { + for _, s := range m.ChainIds { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryChainsRegistryRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChainIds) > 0 { + for _, s := range m.ChainIds { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryChainsRegistryResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChainsRegister) > 0 { + for _, e := range m.ChainsRegister { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } @@ -453,6 +951,376 @@ func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryChainRegistryListRequest) 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: QueryChainRegistryListRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainRegistryListRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", 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 + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.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 *QueryChainRegistryListResponse) 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: QueryChainRegistryListResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainRegistryListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", 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 + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.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 *QueryChainsRegistryRequest) 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: QueryChainsRegistryRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainsRegistryRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + 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 *QueryChainsRegistryResponse) 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: QueryChainsRegistryResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainsRegistryResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainsRegister", 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.ChainsRegister = append(m.ChainsRegister, &ChainRegister{}) + if err := m.ChainsRegister[len(m.ChainsRegister)-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 skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/btcstkconsumer/types/query.pb.gw.go b/x/btcstkconsumer/types/query.pb.gw.go index 3b5d1fb13..6513c1d92 100644 --- a/x/btcstkconsumer/types/query.pb.gw.go +++ b/x/btcstkconsumer/types/query.pb.gw.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: babylon/btcstkconsumer/query.proto +// source: babylon/btcstkconsumer/v1/query.proto /* Package types is a reverse proxy. @@ -51,6 +51,78 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal } +var ( + filter_Query_ChainRegistryList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_ChainRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainRegistryListRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainRegistryList_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ChainRegistryList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ChainRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainRegistryListRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainRegistryList_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ChainRegistryList(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_ChainsRegistry_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainsRegistryRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsRegistry_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ChainsRegistry(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChainsRegistryRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsRegistry_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ChainsRegistry(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. @@ -80,6 +152,52 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_ChainRegistryList_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_ChainRegistryList_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_ChainRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ChainsRegistry_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_ChainsRegistry_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_ChainsRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -141,13 +259,61 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_ChainRegistryList_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_ChainRegistryList_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_ChainRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ChainsRegistry_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_ChainsRegistry_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_ChainsRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } var ( - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylonchain", "babylon", "btcstkconsumer", "params"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"babylonchain", "babylon", "btcstkconsumer", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_ChainRegistryList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "chain_registry_list"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_ChainsRegistry_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "chains_registry"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( forward_Query_Params_0 = runtime.ForwardResponseMessage + + forward_Query_ChainRegistryList_0 = runtime.ForwardResponseMessage + + forward_Query_ChainsRegistry_0 = runtime.ForwardResponseMessage ) diff --git a/x/btcstkconsumer/types/tx.pb.go b/x/btcstkconsumer/types/tx.pb.go index b43aebb8a..e1d69565c 100644 --- a/x/btcstkconsumer/types/tx.pb.go +++ b/x/btcstkconsumer/types/tx.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: babylon/btcstkconsumer/tx.proto +// source: babylon/btcstkconsumer/v1/tx.proto package types @@ -45,7 +45,7 @@ func (m *MsgUpdateParams) Reset() { *m = MsgUpdateParams{} } func (m *MsgUpdateParams) String() string { return proto.CompactTextString(m) } func (*MsgUpdateParams) ProtoMessage() {} func (*MsgUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_76970a330f60bcb2, []int{0} + return fileDescriptor_12cd7e02078b20ee, []int{0} } func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -97,7 +97,7 @@ func (m *MsgUpdateParamsResponse) Reset() { *m = MsgUpdateParamsResponse func (m *MsgUpdateParamsResponse) String() string { return proto.CompactTextString(m) } func (*MsgUpdateParamsResponse) ProtoMessage() {} func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_76970a330f60bcb2, []int{1} + return fileDescriptor_12cd7e02078b20ee, []int{1} } func (m *MsgUpdateParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -126,37 +126,159 @@ func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo +// MsgRegisterChain defines a message for registering CZ chains to the btcstkconsumer module. +type MsgRegisterChain struct { + Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` + // chain_id is the ID of the chain + ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // chain_name is the name of the chain + ChainName string `protobuf:"bytes,3,opt,name=chain_name,json=chainName,proto3" json:"chain_name,omitempty"` + // chain_description is a description for the chain (can be empty) + ChainDescription string `protobuf:"bytes,4,opt,name=chain_description,json=chainDescription,proto3" json:"chain_description,omitempty"` +} + +func (m *MsgRegisterChain) Reset() { *m = MsgRegisterChain{} } +func (m *MsgRegisterChain) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterChain) ProtoMessage() {} +func (*MsgRegisterChain) Descriptor() ([]byte, []int) { + return fileDescriptor_12cd7e02078b20ee, []int{2} +} +func (m *MsgRegisterChain) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRegisterChain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRegisterChain.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 *MsgRegisterChain) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterChain.Merge(m, src) +} +func (m *MsgRegisterChain) XXX_Size() int { + return m.Size() +} +func (m *MsgRegisterChain) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterChain.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRegisterChain proto.InternalMessageInfo + +func (m *MsgRegisterChain) GetSigner() string { + if m != nil { + return m.Signer + } + return "" +} + +func (m *MsgRegisterChain) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +func (m *MsgRegisterChain) GetChainName() string { + if m != nil { + return m.ChainName + } + return "" +} + +func (m *MsgRegisterChain) GetChainDescription() string { + if m != nil { + return m.ChainDescription + } + return "" +} + +// MsgRegisterChainResponse is the response to the MsgRegisterChain message. +type MsgRegisterChainResponse struct { +} + +func (m *MsgRegisterChainResponse) Reset() { *m = MsgRegisterChainResponse{} } +func (m *MsgRegisterChainResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterChainResponse) ProtoMessage() {} +func (*MsgRegisterChainResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_12cd7e02078b20ee, []int{3} +} +func (m *MsgRegisterChainResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRegisterChainResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRegisterChainResponse.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 *MsgRegisterChainResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterChainResponse.Merge(m, src) +} +func (m *MsgRegisterChainResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRegisterChainResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterChainResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRegisterChainResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgUpdateParams)(nil), "babylon.btcstkconsumer.v1.MsgUpdateParams") + proto.RegisterType((*MsgUpdateParamsResponse)(nil), "babylon.btcstkconsumer.v1.MsgUpdateParamsResponse") + proto.RegisterType((*MsgRegisterChain)(nil), "babylon.btcstkconsumer.v1.MsgRegisterChain") + proto.RegisterType((*MsgRegisterChainResponse)(nil), "babylon.btcstkconsumer.v1.MsgRegisterChainResponse") +} + func init() { - proto.RegisterType((*MsgUpdateParams)(nil), "babylon.btcstkconsumer.MsgUpdateParams") - proto.RegisterType((*MsgUpdateParamsResponse)(nil), "babylon.btcstkconsumer.MsgUpdateParamsResponse") -} - -func init() { proto.RegisterFile("babylon/btcstkconsumer/tx.proto", fileDescriptor_76970a330f60bcb2) } - -var fileDescriptor_76970a330f60bcb2 = []byte{ - // 349 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0x4a, 0x4c, 0xaa, - 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, - 0x4d, 0x2d, 0xd2, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x83, 0x2a, 0xd0, - 0x43, 0x55, 0x20, 0x25, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, 0x21, 0x4a, 0xa5, 0xc4, - 0x93, 0xf3, 0x8b, 0x73, 0xf3, 0x8b, 0xf5, 0x73, 0x8b, 0xd3, 0xf5, 0xcb, 0x0c, 0x41, 0x14, 0x54, - 0x42, 0x12, 0x22, 0x11, 0x0f, 0xe6, 0xe9, 0x43, 0x38, 0x50, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, - 0x88, 0x38, 0x88, 0x05, 0x15, 0x55, 0xc6, 0xe1, 0xaa, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, 0x56, - 0xa5, 0x93, 0x8c, 0x5c, 0xfc, 0xbe, 0xc5, 0xe9, 0xa1, 0x05, 0x29, 0x89, 0x25, 0xa9, 0x01, 0x60, - 0x19, 0x21, 0x33, 0x2e, 0xce, 0xc4, 0xd2, 0x92, 0x8c, 0xfc, 0xa2, 0xcc, 0x92, 0x4a, 0x09, 0x46, - 0x05, 0x46, 0x0d, 0x4e, 0x27, 0x89, 0x4b, 0x5b, 0x74, 0x45, 0xa0, 0x76, 0x3a, 0xa6, 0xa4, 0x14, - 0xa5, 0x16, 0x17, 0x07, 0x97, 0x14, 0x65, 0xe6, 0xa5, 0x07, 0x21, 0x94, 0x0a, 0x39, 0x72, 0xb1, - 0x41, 0xcc, 0x96, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x36, 0x92, 0xd3, 0xc3, 0xee, 0x6d, 0x3d, 0x88, - 0x3d, 0x4e, 0x9c, 0x27, 0xee, 0xc9, 0x33, 0xac, 0x78, 0xbe, 0x41, 0x8b, 0x31, 0x08, 0xaa, 0xd1, - 0xca, 0xba, 0xe9, 0xf9, 0x06, 0x2d, 0x84, 0x91, 0x5d, 0xcf, 0x37, 0x68, 0x69, 0xc0, 0xbc, 0x51, - 0x81, 0xee, 0x11, 0x34, 0x77, 0x2b, 0x49, 0x72, 0x89, 0xa3, 0x09, 0x05, 0xa5, 0x16, 0x17, 0xe4, - 0xe7, 0x15, 0xa7, 0x1a, 0x95, 0x71, 0x31, 0xfb, 0x16, 0xa7, 0x0b, 0x65, 0x70, 0xf1, 0xa0, 0xf8, - 0x54, 0x1d, 0x97, 0x0b, 0xd1, 0xcc, 0x91, 0xd2, 0x27, 0x52, 0x21, 0xcc, 0x42, 0x29, 0xd6, 0x06, - 0x90, 0xbf, 0x9c, 0x02, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, - 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x2c, - 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6a, 0x76, 0x72, 0x46, 0x62, - 0x66, 0x9e, 0x3e, 0x4e, 0xef, 0x96, 0x54, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, 0xe3, 0xcd, 0x18, - 0x10, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xa5, 0x49, 0x21, 0x74, 0x02, 0x00, 0x00, + proto.RegisterFile("babylon/btcstkconsumer/v1/tx.proto", fileDescriptor_12cd7e02078b20ee) +} + +var fileDescriptor_12cd7e02078b20ee = []byte{ + // 483 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x31, 0x6f, 0x13, 0x31, + 0x14, 0x8e, 0x29, 0x14, 0xce, 0x05, 0xd1, 0x9e, 0x2a, 0x7a, 0x39, 0x89, 0xa3, 0xdc, 0x80, 0xaa, + 0x44, 0xdc, 0xa9, 0xa9, 0xd4, 0xa1, 0x03, 0x12, 0xa1, 0x0b, 0x43, 0x50, 0x75, 0x88, 0x85, 0xa5, + 0xf2, 0xdd, 0x59, 0x8e, 0x05, 0xb6, 0x0f, 0xdb, 0xa9, 0x9a, 0x0d, 0x31, 0x32, 0xf1, 0x0b, 0x98, + 0x19, 0x33, 0xf0, 0x23, 0xba, 0x51, 0x31, 0x31, 0x21, 0x94, 0x0c, 0x19, 0xf9, 0x0b, 0xe8, 0x6c, + 0x47, 0x51, 0x22, 0x52, 0xc1, 0x12, 0xe5, 0xbd, 0xef, 0xf3, 0xf7, 0xbd, 0xef, 0xdd, 0x83, 0x71, + 0x8e, 0xf2, 0xe1, 0x5b, 0xc1, 0xd3, 0x5c, 0x17, 0x4a, 0xbf, 0x29, 0x04, 0x57, 0x03, 0x86, 0x65, + 0x7a, 0xb6, 0x9f, 0xea, 0xf3, 0xa4, 0x92, 0x42, 0x0b, 0xbf, 0xe9, 0x38, 0xc9, 0x22, 0x27, 0x39, + 0xdb, 0x0f, 0xb7, 0x10, 0xa3, 0x5c, 0xa4, 0xe6, 0xd7, 0xb2, 0xc3, 0x9d, 0x42, 0x28, 0x26, 0x54, + 0xca, 0x14, 0xa9, 0x55, 0x98, 0x22, 0x0e, 0x68, 0x5a, 0xe0, 0xd4, 0x54, 0xa9, 0x2d, 0x1c, 0xb4, + 0x4d, 0x04, 0x11, 0xb6, 0x5f, 0xff, 0x73, 0xdd, 0x47, 0xab, 0x67, 0xab, 0x90, 0x44, 0xcc, 0xbd, + 0x8e, 0xbf, 0x01, 0x78, 0xb7, 0xa7, 0xc8, 0xab, 0xaa, 0x44, 0x1a, 0x9f, 0x18, 0xc4, 0x3f, 0x84, + 0x1e, 0x1a, 0xe8, 0xbe, 0x90, 0x54, 0x0f, 0x03, 0xb0, 0x0b, 0xf6, 0xbc, 0x6e, 0xf0, 0xfd, 0xeb, + 0xe3, 0x6d, 0x67, 0xfb, 0xb4, 0x2c, 0x25, 0x56, 0xea, 0xa5, 0x96, 0x94, 0x93, 0x6c, 0x4e, 0xf5, + 0x8f, 0xe1, 0xba, 0xd5, 0x0e, 0xae, 0xed, 0x82, 0xbd, 0x8d, 0xce, 0xc3, 0x64, 0x65, 0xf8, 0xc4, + 0x5a, 0x75, 0xbd, 0x8b, 0x9f, 0x0f, 0x1a, 0x5f, 0xa6, 0xa3, 0x16, 0xc8, 0xdc, 0xdb, 0xa3, 0x27, + 0x1f, 0xa6, 0xa3, 0xd6, 0x5c, 0xf5, 0xe3, 0x74, 0xd4, 0x6a, 0xcf, 0xc2, 0x9c, 0xff, 0x25, 0xce, + 0xd2, 0xf4, 0x71, 0x13, 0xee, 0x2c, 0xb5, 0x32, 0xac, 0x2a, 0xc1, 0x15, 0x8e, 0x3f, 0x03, 0xb8, + 0xd9, 0x53, 0x24, 0xc3, 0x84, 0x2a, 0x8d, 0xe5, 0xb3, 0x3e, 0xa2, 0xdc, 0xbf, 0x07, 0xd7, 0x15, + 0x25, 0x1c, 0x4b, 0x1b, 0x35, 0x73, 0x95, 0xdf, 0x84, 0xb7, 0x8a, 0x9a, 0x70, 0x4a, 0x4b, 0x93, + 0xc7, 0xcb, 0x6e, 0x9a, 0xfa, 0x79, 0xe9, 0xdf, 0x87, 0xd0, 0x42, 0x1c, 0x31, 0x1c, 0xac, 0x19, + 0xd0, 0x33, 0x9d, 0x17, 0x88, 0x61, 0xbf, 0x0d, 0xb7, 0x2c, 0x5c, 0x62, 0x55, 0x48, 0x5a, 0x69, + 0x2a, 0x78, 0x70, 0xdd, 0xb0, 0x36, 0x0d, 0x70, 0x3c, 0xef, 0x1f, 0x6d, 0xd4, 0x71, 0x9d, 0x67, + 0x1c, 0xc2, 0x60, 0x79, 0xbe, 0xd9, 0xf0, 0x9d, 0xdf, 0x00, 0xae, 0xf5, 0x14, 0xf1, 0x39, 0xbc, + 0xbd, 0xf0, 0xb5, 0x5a, 0x57, 0x6c, 0x79, 0x69, 0x11, 0x61, 0xe7, 0xdf, 0xb9, 0x33, 0x5f, 0xff, + 0x1d, 0xbc, 0xb3, 0xb8, 0xb0, 0xf6, 0xd5, 0x22, 0x0b, 0xe4, 0xf0, 0xe0, 0x3f, 0xc8, 0x33, 0xcb, + 0xf0, 0xc6, 0xfb, 0xfa, 0x22, 0xba, 0x27, 0x17, 0xe3, 0x08, 0x5c, 0x8e, 0x23, 0xf0, 0x6b, 0x1c, + 0x81, 0x4f, 0x93, 0xa8, 0x71, 0x39, 0x89, 0x1a, 0x3f, 0x26, 0x51, 0xe3, 0xf5, 0x21, 0xa1, 0xba, + 0x3f, 0xc8, 0x93, 0x42, 0xb0, 0xd4, 0xe9, 0x9b, 0xc5, 0xa6, 0x2b, 0x0f, 0x45, 0x0f, 0x2b, 0xac, + 0xf2, 0x75, 0x73, 0xf4, 0x07, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x75, 0xfa, 0xfc, 0x9e, 0xba, + 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -174,6 +296,8 @@ type MsgClient interface { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) + // RegisterChain registers a CZ chain to the btcstkconsumer module. + RegisterChain(ctx context.Context, in *MsgRegisterChain, opts ...grpc.CallOption) (*MsgRegisterChainResponse, error) } type msgClient struct { @@ -186,7 +310,16 @@ func NewMsgClient(cc grpc1.ClientConn) MsgClient { func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) { out := new(MsgUpdateParamsResponse) - err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.Msg/UpdateParams", in, out, opts...) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Msg/UpdateParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RegisterChain(ctx context.Context, in *MsgRegisterChain, opts ...grpc.CallOption) (*MsgRegisterChainResponse, error) { + out := new(MsgRegisterChainResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Msg/RegisterChain", in, out, opts...) if err != nil { return nil, err } @@ -198,6 +331,8 @@ type MsgServer interface { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) + // RegisterChain registers a CZ chain to the btcstkconsumer module. + RegisterChain(context.Context, *MsgRegisterChain) (*MsgRegisterChainResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -207,6 +342,9 @@ type UnimplementedMsgServer struct { func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") } +func (*UnimplementedMsgServer) RegisterChain(ctx context.Context, req *MsgRegisterChain) (*MsgRegisterChainResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterChain not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -222,7 +360,7 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/babylon.btcstkconsumer.Msg/UpdateParams", + FullMethod: "/babylon.btcstkconsumer.v1.Msg/UpdateParams", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MsgServer).UpdateParams(ctx, req.(*MsgUpdateParams)) @@ -230,17 +368,39 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Msg_RegisterChain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRegisterChain) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RegisterChain(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.btcstkconsumer.v1.Msg/RegisterChain", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RegisterChain(ctx, req.(*MsgRegisterChain)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ - ServiceName: "babylon.btcstkconsumer.Msg", + ServiceName: "babylon.btcstkconsumer.v1.Msg", HandlerType: (*MsgServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "UpdateParams", Handler: _Msg_UpdateParams_Handler, }, + { + MethodName: "RegisterChain", + Handler: _Msg_RegisterChain_Handler, + }, }, Streams: []grpc.StreamDesc{}, - Metadata: "babylon/btcstkconsumer/tx.proto", + Metadata: "babylon/btcstkconsumer/v1/tx.proto", } func (m *MsgUpdateParams) Marshal() (dAtA []byte, err error) { @@ -306,6 +466,80 @@ func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *MsgRegisterChain) 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 *MsgRegisterChain) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRegisterChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainDescription) > 0 { + i -= len(m.ChainDescription) + copy(dAtA[i:], m.ChainDescription) + i = encodeVarintTx(dAtA, i, uint64(len(m.ChainDescription))) + i-- + dAtA[i] = 0x22 + } + if len(m.ChainName) > 0 { + i -= len(m.ChainName) + copy(dAtA[i:], m.ChainName) + i = encodeVarintTx(dAtA, i, uint64(len(m.ChainName))) + i-- + dAtA[i] = 0x1a + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0x12 + } + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRegisterChainResponse) 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 *MsgRegisterChainResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRegisterChainResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -341,6 +575,40 @@ func (m *MsgUpdateParamsResponse) Size() (n int) { return n } +func (m *MsgRegisterChain) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ChainName) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ChainDescription) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgRegisterChainResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -512,6 +780,234 @@ func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgRegisterChain) 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 ErrIntOverflowTx + } + 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: MsgRegisterChain: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRegisterChain: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainDescription", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainDescription = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRegisterChainResponse) 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 ErrIntOverflowTx + } + 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: MsgRegisterChainResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRegisterChainResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/zoneconcierge/keeper/grpc_query.go b/x/zoneconcierge/keeper/grpc_query.go index cb5a6c14d..7d9e0226e 100644 --- a/x/zoneconcierge/keeper/grpc_query.go +++ b/x/zoneconcierge/keeper/grpc_query.go @@ -13,7 +13,7 @@ import ( var _ types.QueryServer = Keeper{} -const maxQueryChainsLimit = 100 +const maxQueryChainsInfoLimit = 100 func (k Keeper) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { if req == nil { @@ -61,8 +61,8 @@ func (k Keeper) ChainsInfo(c context.Context, req *types.QueryChainsInfoRequest) } // return if chain IDs exceed the limit - if len(req.ChainIds) > maxQueryChainsLimit { - return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsLimit) + if len(req.ChainIds) > maxQueryChainsInfoLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) } // return if chain IDs contain duplicates or empty strings @@ -122,8 +122,8 @@ func (k Keeper) EpochChainsInfo(c context.Context, req *types.QueryEpochChainsIn } // return if chain IDs exceed the limit - if len(req.ChainIds) > maxQueryChainsLimit { - return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsLimit) + if len(req.ChainIds) > maxQueryChainsInfoLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) } // return if chain IDs contain duplicates or empty strings @@ -225,8 +225,8 @@ func (k Keeper) FinalizedChainsInfo(c context.Context, req *types.QueryFinalized } // return if chain IDs exceed the limit - if len(req.ChainIds) > maxQueryChainsLimit { - return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsLimit) + if len(req.ChainIds) > maxQueryChainsInfoLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsInfoLimit) } // return if chain IDs contain duplicates or empty strings @@ -401,64 +401,3 @@ func (k Keeper) FinalizedChainInfoUntilHeight(c context.Context, req *types.Quer return resp, nil } - -func (k Keeper) ChainRegistryList(c context.Context, req *types.QueryChainRegistryListRequest) (*types.QueryChainRegistryListResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - - ctx := sdk.UnwrapSDKContext(c) - - chainIDs := []string{} - store := k.chainRegistryStore(ctx) - pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { - chainID := string(key) - chainIDs = append(chainIDs, chainID) - return nil - }) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - - resp := &types.QueryChainRegistryListResponse{ - ChainIds: chainIDs, - Pagination: pageRes, - } - return resp, nil -} - -// ChainsRegistry returns the registration for a given list of chains -func (k Keeper) ChainsRegistry(c context.Context, req *types.QueryChainsRegistryRequest) (*types.QueryChainsRegistryResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - - // return if no chain IDs are provided - if len(req.ChainIds) == 0 { - return nil, status.Error(codes.InvalidArgument, "chain IDs cannot be empty") - } - - // return if chain IDs exceed the limit - if len(req.ChainIds) > maxQueryChainsLimit { - return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsLimit) - } - - // return if chain IDs contain duplicates or empty strings - if err := bbntypes.CheckForDuplicatesAndEmptyStrings(req.ChainIds); err != nil { - return nil, status.Error(codes.InvalidArgument, types.ErrInvalidChainIDs.Wrap(err.Error()).Error()) - } - - ctx := sdk.UnwrapSDKContext(c) - var chainsRegister []*types.ChainRegister - for _, chainID := range req.ChainIds { - chainRegister, err := k.GetChainRegister(ctx, chainID) - if err != nil { - return nil, err - } - - chainsRegister = append(chainsRegister, chainRegister) - } - - resp := &types.QueryChainsRegistryResponse{ChainsRegister: chainsRegister} - return resp, nil -} diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index 6db74814f..08c5cab8b 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -25,10 +25,6 @@ type chainInfo struct { headerStartHeight uint64 } -type chainRegister struct { - chainID string -} - func FuzzChainList(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) @@ -440,86 +436,3 @@ func FuzzFinalizedChainInfo(f *testing.F) { } }) } - -func FuzzChainRegistryList(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 10) - - f.Fuzz(func(t *testing.T, seed int64) { - r := rand.New(rand.NewSource(seed)) - - babylonApp := app.Setup(t, false) - zcKeeper := babylonApp.ZoneConciergeKeeper - ctx := babylonApp.NewContext(false) - - // invoke the chain registration a random number of times with random chain IDs - numRegistrations := datagen.RandomInt(r, 100) + 1 - var allChainIDs []string - for i := uint64(0); i < numRegistrations; i++ { - var chainID = datagen.GenRandomHexStr(r, 30) - allChainIDs = append(allChainIDs, chainID) - - zcKeeper.SetChainRegister(ctx, &zctypes.ChainRegister{ - ChainId: chainID, - ChainName: datagen.GenRandomHexStr(r, 5), - }) - } - - limit := datagen.RandomInt(r, len(allChainIDs)) + 1 - - // Query to get actual chain IDs - resp, err := zcKeeper.ChainRegistryList(ctx, &zctypes.QueryChainRegistryListRequest{ - Pagination: &query.PageRequest{ - Limit: limit, - }, - }) - require.NoError(t, err) - actualChainIDs := resp.ChainIds - - require.Equal(t, limit, uint64(len(actualChainIDs))) - for i := uint64(0); i < limit; i++ { - require.Contains(t, allChainIDs, actualChainIDs[i]) - } - }) -} - -func FuzzChainsRegistry(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 10) - - f.Fuzz(func(t *testing.T, seed int64) { - r := rand.New(rand.NewSource(seed)) - - babylonApp := app.Setup(t, false) - zcKeeper := babylonApp.ZoneConciergeKeeper - ctx := babylonApp.NewContext(false) - - var ( - chainsRegister []chainRegister - chainIDs []string - ) - // invoke the chain registration a random number of times with random chain IDs - numChains := datagen.RandomInt(r, 100) + 1 - for i := uint64(0); i < numChains; i++ { - chainID := datagen.GenRandomHexStr(r, 30) - - chainIDs = append(chainIDs, chainID) - chainsRegister = append(chainsRegister, chainRegister{ - chainID: chainID, - }) - - zcKeeper.SetChainRegister(ctx, &zctypes.ChainRegister{ - ChainId: chainID, - ChainName: datagen.GenRandomHexStr(r, 5), - }) - - } - - resp, err := zcKeeper.ChainsRegistry(ctx, &zctypes.QueryChainsRegistryRequest{ - ChainIds: chainIDs, - }) - require.NoError(t, err) - - for i, respData := range resp.ChainsRegister { - require.Equal(t, chainsRegister[i].chainID, respData.ChainId) - } - }) -} diff --git a/x/zoneconcierge/keeper/msg_server.go b/x/zoneconcierge/keeper/msg_server.go index 6b7e66861..dee48dd04 100644 --- a/x/zoneconcierge/keeper/msg_server.go +++ b/x/zoneconcierge/keeper/msg_server.go @@ -37,25 +37,3 @@ func (ms msgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdatePara return &types.MsgUpdateParamsResponse{}, nil } - -// RegisterChain registers a CZ chain -func (ms msgServer) RegisterChain(goCtx context.Context, req *types.MsgRegisterChain) (*types.MsgRegisterChainResponse, error) { - // Create ChanRegister from MsgRegisterChain - chainRegister := types.ChainRegister{ - ChainId: req.ChainId, - ChainName: req.ChainName, - ChainDescription: req.ChainDescription, - } - - if err := chainRegister.Validate(); err != nil { - return nil, types.ErrInvalidChainRegister.Wrapf("invalid chain: %v", err) - } - - ctx := sdk.UnwrapSDKContext(goCtx) - if ms.IsChainRegistered(ctx, req.ChainId) { - return nil, types.ErrChainAlreadyRegistered - } - ms.SetChainRegister(ctx, &chainRegister) - - return &types.MsgRegisterChainResponse{}, nil -} diff --git a/x/zoneconcierge/types/msg.go b/x/zoneconcierge/types/msg.go index c091bafc2..782e3dcc1 100644 --- a/x/zoneconcierge/types/msg.go +++ b/x/zoneconcierge/types/msg.go @@ -7,5 +7,4 @@ import ( // ensure that these message types implement the sdk.Msg interface var ( _ sdk.Msg = &MsgUpdateParams{} - _ sdk.Msg = &MsgRegisterChain{} ) diff --git a/x/zoneconcierge/types/query.pb.go b/x/zoneconcierge/types/query.pb.go index 5f95bb127..64d219deb 100644 --- a/x/zoneconcierge/types/query.pb.go +++ b/x/zoneconcierge/types/query.pb.go @@ -986,197 +986,6 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) GetProof() *ProofFinalizedC return nil } -// QueryChainRegistryListRequest is request type for the Query/ChainRegistryList RPC method -type QueryChainRegistryListRequest struct { - // pagination defines whether to have the pagination in the request - Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryChainRegistryListRequest) Reset() { *m = QueryChainRegistryListRequest{} } -func (m *QueryChainRegistryListRequest) String() string { return proto.CompactTextString(m) } -func (*QueryChainRegistryListRequest) ProtoMessage() {} -func (*QueryChainRegistryListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{18} -} -func (m *QueryChainRegistryListRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryChainRegistryListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryChainRegistryListRequest.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 *QueryChainRegistryListRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainRegistryListRequest.Merge(m, src) -} -func (m *QueryChainRegistryListRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryChainRegistryListRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainRegistryListRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryChainRegistryListRequest proto.InternalMessageInfo - -func (m *QueryChainRegistryListRequest) GetPagination() *query.PageRequest { - if m != nil { - return m.Pagination - } - return nil -} - -// QueryChainRegistryListResponse is response type for the Query/ChainRegistryList RPC method -type QueryChainRegistryListResponse struct { - // chain_ids are IDs of the chains in ascending alphabetical order - ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` - // pagination defines the pagination in the response - Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryChainRegistryListResponse) Reset() { *m = QueryChainRegistryListResponse{} } -func (m *QueryChainRegistryListResponse) String() string { return proto.CompactTextString(m) } -func (*QueryChainRegistryListResponse) ProtoMessage() {} -func (*QueryChainRegistryListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{19} -} -func (m *QueryChainRegistryListResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryChainRegistryListResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryChainRegistryListResponse.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 *QueryChainRegistryListResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainRegistryListResponse.Merge(m, src) -} -func (m *QueryChainRegistryListResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryChainRegistryListResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainRegistryListResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryChainRegistryListResponse proto.InternalMessageInfo - -func (m *QueryChainRegistryListResponse) GetChainIds() []string { - if m != nil { - return m.ChainIds - } - return nil -} - -func (m *QueryChainRegistryListResponse) GetPagination() *query.PageResponse { - if m != nil { - return m.Pagination - } - return nil -} - -// QueryChainsRegistryRequest is request type for the Query/ChainsRegistry RPC method. -type QueryChainsRegistryRequest struct { - ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` -} - -func (m *QueryChainsRegistryRequest) Reset() { *m = QueryChainsRegistryRequest{} } -func (m *QueryChainsRegistryRequest) String() string { return proto.CompactTextString(m) } -func (*QueryChainsRegistryRequest) ProtoMessage() {} -func (*QueryChainsRegistryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{20} -} -func (m *QueryChainsRegistryRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryChainsRegistryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryChainsRegistryRequest.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 *QueryChainsRegistryRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainsRegistryRequest.Merge(m, src) -} -func (m *QueryChainsRegistryRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryChainsRegistryRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainsRegistryRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryChainsRegistryRequest proto.InternalMessageInfo - -func (m *QueryChainsRegistryRequest) GetChainIds() []string { - if m != nil { - return m.ChainIds - } - return nil -} - -// QueryChainsRegistryResponse is response type for the Query/ChainsRegistry RPC method. -type QueryChainsRegistryResponse struct { - ChainsRegister []*ChainRegister `protobuf:"bytes,1,rep,name=chains_register,json=chainsRegister,proto3" json:"chains_register,omitempty"` -} - -func (m *QueryChainsRegistryResponse) Reset() { *m = QueryChainsRegistryResponse{} } -func (m *QueryChainsRegistryResponse) String() string { return proto.CompactTextString(m) } -func (*QueryChainsRegistryResponse) ProtoMessage() {} -func (*QueryChainsRegistryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd665af90102da38, []int{21} -} -func (m *QueryChainsRegistryResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryChainsRegistryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryChainsRegistryResponse.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 *QueryChainsRegistryResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainsRegistryResponse.Merge(m, src) -} -func (m *QueryChainsRegistryResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryChainsRegistryResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainsRegistryResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryChainsRegistryResponse proto.InternalMessageInfo - -func (m *QueryChainsRegistryResponse) GetChainsRegister() []*ChainRegister { - if m != nil { - return m.ChainsRegister - } - return nil -} - func init() { proto.RegisterType((*QueryParamsRequest)(nil), "babylon.zoneconcierge.v1.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "babylon.zoneconcierge.v1.QueryParamsResponse") @@ -1196,10 +1005,6 @@ func init() { proto.RegisterType((*QueryFinalizedChainsInfoResponse)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainsInfoResponse") proto.RegisterType((*QueryFinalizedChainInfoUntilHeightRequest)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightRequest") proto.RegisterType((*QueryFinalizedChainInfoUntilHeightResponse)(nil), "babylon.zoneconcierge.v1.QueryFinalizedChainInfoUntilHeightResponse") - proto.RegisterType((*QueryChainRegistryListRequest)(nil), "babylon.zoneconcierge.v1.QueryChainRegistryListRequest") - proto.RegisterType((*QueryChainRegistryListResponse)(nil), "babylon.zoneconcierge.v1.QueryChainRegistryListResponse") - proto.RegisterType((*QueryChainsRegistryRequest)(nil), "babylon.zoneconcierge.v1.QueryChainsRegistryRequest") - proto.RegisterType((*QueryChainsRegistryResponse)(nil), "babylon.zoneconcierge.v1.QueryChainsRegistryResponse") } func init() { @@ -1207,89 +1012,81 @@ func init() { } var fileDescriptor_cd665af90102da38 = []byte{ - // 1308 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcf, 0x6f, 0xdc, 0xc4, - 0x17, 0x8f, 0xf3, 0xab, 0xc9, 0xdb, 0xef, 0x37, 0x29, 0x93, 0xb4, 0x2c, 0x6e, 0xbb, 0x89, 0x0c, - 0xa5, 0x49, 0x9b, 0xd8, 0x6c, 0xda, 0x34, 0x84, 0x03, 0x55, 0x93, 0x92, 0x34, 0x2a, 0x2a, 0xa9, - 0x21, 0x20, 0x71, 0x59, 0xbc, 0xde, 0x59, 0xaf, 0x95, 0xac, 0x67, 0x6b, 0x7b, 0xb7, 0x4d, 0x43, - 0x38, 0x20, 0xc4, 0x15, 0x24, 0x2e, 0x88, 0x13, 0x27, 0x0e, 0x1c, 0x2a, 0x2e, 0x1c, 0x39, 0x22, - 0xf5, 0xc0, 0xa1, 0x12, 0x17, 0x4e, 0x08, 0x25, 0xfc, 0x0f, 0x9c, 0x90, 0x90, 0x67, 0xc6, 0xbb, - 0xb6, 0xd7, 0x5e, 0x7b, 0x43, 0xc4, 0x6d, 0x3d, 0xf3, 0xde, 0xe7, 0x7d, 0xde, 0x9b, 0x37, 0x6f, - 0x3e, 0x5a, 0x78, 0xa5, 0xac, 0x95, 0xf7, 0xf7, 0x88, 0xa5, 0x3c, 0x21, 0x16, 0xd6, 0x89, 0xa5, - 0x9b, 0xd8, 0x36, 0xb0, 0xd2, 0x2a, 0x2a, 0x0f, 0x9b, 0xd8, 0xde, 0x97, 0x1b, 0x36, 0x71, 0x09, - 0xca, 0x73, 0x2b, 0x39, 0x64, 0x25, 0xb7, 0x8a, 0xe2, 0xb4, 0x41, 0x0c, 0x42, 0x8d, 0x14, 0xef, - 0x17, 0xb3, 0x17, 0x2f, 0x1a, 0x84, 0x18, 0x7b, 0x58, 0xd1, 0x1a, 0xa6, 0xa2, 0x59, 0x16, 0x71, - 0x35, 0xd7, 0x24, 0x96, 0xc3, 0x77, 0xaf, 0xea, 0xc4, 0xa9, 0x13, 0x47, 0x29, 0x6b, 0x0e, 0x66, - 0x61, 0x94, 0x56, 0xb1, 0x8c, 0x5d, 0xad, 0xa8, 0x34, 0x34, 0xc3, 0xb4, 0xa8, 0x31, 0xb7, 0x5d, - 0xf0, 0xf9, 0x95, 0x5d, 0x5d, 0xaf, 0x61, 0x7d, 0xb7, 0x41, 0x4c, 0xcb, 0xf5, 0xf8, 0x85, 0x16, - 0xb8, 0xf5, 0xbc, 0x6f, 0xdd, 0xd9, 0x31, 0x2d, 0xc3, 0xb3, 0xee, 0x32, 0x95, 0x7c, 0x53, 0xdc, - 0x20, 0x7a, 0x8d, 0x5b, 0xf9, 0xbf, 0xa3, 0xc1, 0xbb, 0x8a, 0x13, 0xae, 0x03, 0xb3, 0xbe, 0x9c, - 0x68, 0xdd, 0xd0, 0x6c, 0xad, 0xce, 0xb3, 0x97, 0xa6, 0x01, 0x3d, 0xf0, 0x72, 0xde, 0xa6, 0x8b, - 0x2a, 0x7e, 0xd8, 0xc4, 0x8e, 0x2b, 0xed, 0xc0, 0x54, 0x68, 0xd5, 0x69, 0x10, 0xcb, 0xc1, 0xe8, - 0x4d, 0x18, 0x65, 0xce, 0x79, 0x61, 0x56, 0x98, 0xcb, 0x2d, 0xcd, 0xca, 0x49, 0x27, 0x21, 0x33, - 0xcf, 0xb5, 0xe1, 0x67, 0xbf, 0xcf, 0x0c, 0xa8, 0xdc, 0x4b, 0xda, 0xe4, 0xc1, 0xee, 0x62, 0xad, - 0x82, 0x6d, 0x1e, 0x0c, 0xbd, 0x04, 0x63, 0x7a, 0x4d, 0x33, 0xad, 0x92, 0x59, 0xa1, 0xb8, 0xe3, - 0xea, 0x19, 0xfa, 0xbd, 0x55, 0x41, 0xe7, 0x61, 0xb4, 0x86, 0x4d, 0xa3, 0xe6, 0xe6, 0x07, 0x67, - 0x85, 0xb9, 0x61, 0x95, 0x7f, 0x49, 0xdf, 0x08, 0x9c, 0xa0, 0x8f, 0xc4, 0x09, 0xde, 0xf2, 0xec, - 0xbd, 0x15, 0x4e, 0xf0, 0x4a, 0x32, 0xc1, 0x2d, 0xab, 0x82, 0x1f, 0xe3, 0x0a, 0x07, 0xe0, 0x6e, - 0x68, 0x0d, 0xfe, 0x57, 0x25, 0xf6, 0x6e, 0x89, 0x7d, 0x3a, 0x34, 0x6c, 0x6e, 0x69, 0x26, 0x19, - 0x66, 0x83, 0xd8, 0xbb, 0x8e, 0x9a, 0xf3, 0x9c, 0x18, 0x94, 0x23, 0x95, 0xe0, 0x1c, 0xe5, 0xb6, - 0xee, 0x25, 0xf1, 0xb6, 0xe9, 0xb8, 0x7e, 0xa2, 0x1b, 0x00, 0x9d, 0x8e, 0xe2, 0x0c, 0x5f, 0x95, - 0x59, 0xfb, 0xc9, 0x5e, 0xfb, 0xc9, 0xac, 0xcb, 0x79, 0xfb, 0xc9, 0xdb, 0x9a, 0x81, 0xb9, 0xaf, - 0x1a, 0xf0, 0x94, 0x3e, 0x81, 0xf3, 0xd1, 0x00, 0x3c, 0xff, 0x0b, 0x30, 0xee, 0x97, 0xd2, 0x3b, - 0xa3, 0xa1, 0xb9, 0x71, 0x75, 0x8c, 0xd7, 0xd2, 0x41, 0x9b, 0xa1, 0xf0, 0x83, 0xbc, 0x40, 0x69, - 0xe1, 0x19, 0x72, 0x28, 0xfe, 0x72, 0x30, 0xbe, 0xb3, 0x65, 0x55, 0x89, 0x9f, 0x61, 0xaf, 0xf8, - 0x52, 0x09, 0x5e, 0xec, 0x72, 0xe3, 0xbc, 0xef, 0x40, 0x8e, 0x9a, 0x39, 0x25, 0xd3, 0xaa, 0x12, - 0xea, 0x99, 0x5b, 0x7a, 0x39, 0xb9, 0xea, 0x14, 0x82, 0x22, 0x80, 0xde, 0x46, 0x93, 0x3e, 0x80, - 0x0b, 0x34, 0xc0, 0x5b, 0xde, 0xbd, 0x89, 0x25, 0x47, 0x6f, 0x54, 0xc9, 0x6a, 0xd6, 0x69, 0xf5, - 0x87, 0xd5, 0x31, 0xba, 0x70, 0xbf, 0x59, 0x0f, 0x33, 0x1f, 0x8c, 0x30, 0xaf, 0xc0, 0xc5, 0x78, - 0xe0, 0x53, 0xa5, 0xff, 0x31, 0xaf, 0x8f, 0x77, 0xa2, 0xbc, 0x97, 0x32, 0x5c, 0x91, 0x8d, 0x98, - 0x53, 0x3d, 0x49, 0x53, 0x7d, 0x27, 0x40, 0xbe, 0x3b, 0x3c, 0x4f, 0xf0, 0x36, 0x9c, 0xf1, 0x6f, - 0x04, 0x4b, 0x2e, 0xf3, 0xc5, 0xf2, 0xfd, 0x4e, 0xaf, 0xfb, 0xde, 0xe7, 0x87, 0xe1, 0xf1, 0xa4, - 0x07, 0x12, 0xa9, 0x55, 0xcf, 0x63, 0x0e, 0x16, 0x72, 0x30, 0x54, 0x48, 0xa9, 0x0c, 0x97, 0x12, - 0x70, 0x4f, 0xad, 0x08, 0xd2, 0x7b, 0x30, 0x43, 0x63, 0x6c, 0x98, 0x96, 0xb6, 0x67, 0x3e, 0xc1, - 0x95, 0xfe, 0xae, 0x10, 0x9a, 0x86, 0x91, 0x86, 0x4d, 0x5a, 0x98, 0x72, 0x1f, 0x53, 0xd9, 0x87, - 0xf4, 0x99, 0x00, 0xb3, 0xc9, 0xb0, 0x9c, 0xfd, 0x47, 0x70, 0xae, 0xea, 0x6f, 0x97, 0xba, 0xbb, - 0x75, 0xa1, 0xc7, 0x88, 0x0b, 0xa1, 0x52, 0xd0, 0xa9, 0x6a, 0x77, 0x24, 0xc9, 0x85, 0xf9, 0x18, - 0x16, 0xde, 0xd6, 0x8e, 0xe5, 0x9a, 0x7b, 0x77, 0xe9, 0xe8, 0x3e, 0xf9, 0xd0, 0xef, 0x24, 0x3f, - 0x14, 0x4c, 0xfe, 0xe9, 0x10, 0x5c, 0xcd, 0x12, 0x96, 0x97, 0x61, 0x07, 0xa6, 0x23, 0x65, 0xf0, - 0xab, 0x20, 0x64, 0xbd, 0xb3, 0xa8, 0xda, 0x15, 0x09, 0xad, 0x02, 0xb0, 0xa6, 0xa3, 0x60, 0xac, - 0xbb, 0xc5, 0x36, 0x58, 0xfb, 0x21, 0x6f, 0x15, 0x65, 0xda, 0x5a, 0x2a, 0x6b, 0x51, 0xea, 0x7a, - 0x1f, 0x26, 0x6c, 0xed, 0x51, 0xa9, 0x23, 0x09, 0x68, 0x7e, 0xc1, 0xee, 0x0a, 0xc9, 0x07, 0x0f, - 0x43, 0xd5, 0x1e, 0xad, 0xb7, 0xd7, 0xd4, 0xff, 0xdb, 0xc1, 0x4f, 0xb4, 0x03, 0xa8, 0xec, 0xea, - 0x25, 0xa7, 0x59, 0xae, 0x9b, 0x8e, 0x63, 0x12, 0xab, 0xb4, 0x8b, 0xf7, 0xf3, 0xc3, 0x11, 0xcc, - 0xb0, 0x5e, 0x69, 0x15, 0xe5, 0x77, 0xdb, 0xf6, 0xf7, 0xf0, 0xbe, 0x7a, 0xb6, 0xec, 0xea, 0xa1, - 0x15, 0xb4, 0x49, 0xab, 0x4f, 0xaa, 0xf9, 0x11, 0x8a, 0x54, 0xec, 0xf1, 0xf4, 0x7b, 0x66, 0x31, - 0x4d, 0xc3, 0xfc, 0x25, 0x83, 0xdf, 0x33, 0xba, 0xa1, 0x62, 0xc3, 0x74, 0x5c, 0x76, 0xe9, 0x4e, - 0xfb, 0x99, 0xfc, 0x5c, 0x80, 0x42, 0x52, 0xa4, 0xff, 0xf4, 0xbd, 0x5c, 0x05, 0x31, 0xf0, 0xf0, - 0xf9, 0x44, 0x32, 0xbd, 0x99, 0x84, 0x3f, 0x69, 0x51, 0x57, 0xce, 0x7f, 0x1b, 0x26, 0xf9, 0x55, - 0xb6, 0xe9, 0x16, 0x15, 0x3e, 0x29, 0xa3, 0x29, 0x50, 0x0d, 0x6c, 0xab, 0x13, 0x7a, 0x00, 0x19, - 0xdb, 0x4b, 0x7f, 0x4d, 0xc2, 0x08, 0x8d, 0x88, 0xbe, 0x10, 0x60, 0x94, 0xa9, 0x38, 0xd4, 0x63, - 0x38, 0x74, 0x8b, 0x47, 0x71, 0x31, 0xa3, 0x35, 0xcb, 0x41, 0x9a, 0xfb, 0xf4, 0xd7, 0x3f, 0xbf, - 0x1a, 0x94, 0xd0, 0xac, 0x92, 0xa2, 0x58, 0xd1, 0x53, 0x01, 0x46, 0xd9, 0x44, 0x4d, 0x65, 0x14, - 0x52, 0x98, 0xa9, 0x8c, 0xc2, 0x2a, 0x52, 0xda, 0xa4, 0x8c, 0x6e, 0xa3, 0x5b, 0xc9, 0x8c, 0x3a, - 0x93, 0x43, 0x39, 0xf0, 0x4f, 0xef, 0x50, 0x61, 0x63, 0x5e, 0x39, 0x60, 0x03, 0xeb, 0x10, 0x7d, - 0x2d, 0xc0, 0x78, 0x5b, 0xa4, 0x21, 0x25, 0x85, 0x45, 0x54, 0x2f, 0x8a, 0xaf, 0x65, 0x77, 0xc8, - 0x5e, 0x4b, 0x76, 0xde, 0xe8, 0x5b, 0x01, 0xa0, 0x33, 0xbb, 0x51, 0xa6, 0x50, 0xc1, 0x77, 0x4a, - 0x2c, 0xf6, 0xe1, 0xc1, 0xd9, 0x2d, 0x52, 0x76, 0x57, 0xd0, 0xe5, 0x34, 0x76, 0xb4, 0xb0, 0xe8, - 0x47, 0x01, 0x26, 0x23, 0x8a, 0x0b, 0x2d, 0xa7, 0x44, 0x8d, 0x97, 0x7e, 0xe2, 0xcd, 0x7e, 0xdd, - 0x38, 0xe3, 0xeb, 0x94, 0xf1, 0x22, 0xba, 0x96, 0xcc, 0x98, 0x8d, 0xfd, 0x20, 0xef, 0xef, 0x05, - 0xc8, 0x05, 0x44, 0x14, 0x4a, 0xab, 0x54, 0xb7, 0xde, 0x13, 0x97, 0xfa, 0x71, 0xe1, 0x5c, 0x6f, - 0x50, 0xae, 0x32, 0x5a, 0x48, 0xe6, 0xca, 0x65, 0x48, 0xa0, 0x65, 0xd1, 0x2f, 0x02, 0x9c, 0x8d, - 0x2a, 0x1e, 0x74, 0x33, 0x43, 0xf8, 0x18, 0xe9, 0x25, 0xae, 0xf4, 0xed, 0x97, 0xfd, 0xc6, 0x75, - 0x73, 0x67, 0xa5, 0x77, 0x94, 0x83, 0xb6, 0xdc, 0x3b, 0x44, 0x3f, 0x0b, 0x30, 0x15, 0xa3, 0x82, - 0xd0, 0x6a, 0x0a, 0xb3, 0x64, 0x41, 0x26, 0xbe, 0x71, 0x12, 0x57, 0x9e, 0xd7, 0x0a, 0xcd, 0xab, - 0x88, 0x94, 0xe4, 0xbc, 0x62, 0x45, 0x19, 0xfa, 0x5b, 0x80, 0x4b, 0x3d, 0x05, 0x0d, 0x5a, 0xef, - 0x8b, 0x56, 0xbc, 0x0a, 0x13, 0xef, 0xfc, 0x3b, 0x10, 0x9e, 0xe5, 0x03, 0x9a, 0xe5, 0x3d, 0xb4, - 0x95, 0x39, 0xcb, 0x98, 0xc9, 0xe9, 0x21, 0x76, 0x26, 0xe7, 0x4f, 0x02, 0xbc, 0xd0, 0xf5, 0x6c, - 0xa3, 0x95, 0x2c, 0x33, 0x27, 0x46, 0x52, 0x88, 0xaf, 0xf7, 0xef, 0xc8, 0x73, 0x5b, 0xa6, 0xb9, - 0x29, 0x68, 0x31, 0xed, 0x2d, 0xb0, 0xb9, 0x77, 0x69, 0xcf, 0x63, 0xfa, 0x83, 0x00, 0x13, 0xe1, - 0x37, 0x1b, 0xdd, 0xc8, 0x34, 0x30, 0x23, 0xea, 0x40, 0x5c, 0xee, 0xd3, 0x8b, 0xd3, 0x2e, 0x52, - 0xda, 0xd7, 0xd0, 0x7c, 0xea, 0xa8, 0xf5, 0x79, 0xaf, 0xbd, 0xf3, 0xec, 0xa8, 0x20, 0x3c, 0x3f, - 0x2a, 0x08, 0x7f, 0x1c, 0x15, 0x84, 0x2f, 0x8f, 0x0b, 0x03, 0xcf, 0x8f, 0x0b, 0x03, 0xbf, 0x1d, - 0x17, 0x06, 0x3e, 0x5c, 0x36, 0x4c, 0xb7, 0xd6, 0x2c, 0xcb, 0x3a, 0xa9, 0xfb, 0x70, 0xd4, 0xb9, - 0x8d, 0xfd, 0x38, 0x82, 0xee, 0xee, 0x37, 0xb0, 0x53, 0x1e, 0xa5, 0xff, 0x30, 0x5d, 0xff, 0x27, - 0x00, 0x00, 0xff, 0xff, 0x5a, 0x55, 0x70, 0x78, 0xd5, 0x13, 0x00, 0x00, + // 1176 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6f, 0xdc, 0x44, + 0x14, 0x8e, 0xf3, 0xab, 0xc9, 0x5b, 0x0a, 0xd5, 0x24, 0x2d, 0x8b, 0xdb, 0x6e, 0x22, 0x43, 0x69, + 0x5a, 0x12, 0x9b, 0x4d, 0x49, 0xab, 0x72, 0xa0, 0x6a, 0x52, 0x92, 0x46, 0x45, 0xa5, 0x35, 0x04, + 0x24, 0x2e, 0xc6, 0xf6, 0xce, 0x7a, 0xad, 0x64, 0x3d, 0x5b, 0xdb, 0xbb, 0xed, 0x36, 0x84, 0x03, + 0xea, 0x1d, 0x24, 0x2e, 0x88, 0x13, 0x27, 0x0e, 0x1c, 0x7a, 0xe3, 0x4f, 0x40, 0xea, 0x81, 0x43, + 0x25, 0x2e, 0x9c, 0x10, 0x4a, 0xf8, 0x37, 0x90, 0x90, 0x67, 0xc6, 0xbb, 0xfe, 0xb9, 0xeb, 0x0d, + 0xb9, 0xed, 0x8c, 0xdf, 0xfb, 0xbe, 0xef, 0xbd, 0x79, 0x33, 0xef, 0x2d, 0xbc, 0x65, 0xe8, 0x46, + 0x77, 0x8f, 0x38, 0xca, 0x53, 0xe2, 0x60, 0x93, 0x38, 0xa6, 0x8d, 0x5d, 0x0b, 0x2b, 0x9d, 0xaa, + 0xf2, 0xa8, 0x8d, 0xdd, 0xae, 0xdc, 0x72, 0x89, 0x4f, 0x50, 0x99, 0x5b, 0xc9, 0x31, 0x2b, 0xb9, + 0x53, 0x15, 0xe7, 0x2d, 0x62, 0x11, 0x6a, 0xa4, 0x04, 0xbf, 0x98, 0xbd, 0x78, 0xc1, 0x22, 0xc4, + 0xda, 0xc3, 0x8a, 0xde, 0xb2, 0x15, 0xdd, 0x71, 0x88, 0xaf, 0xfb, 0x36, 0x71, 0x3c, 0xfe, 0xf5, + 0xaa, 0x49, 0xbc, 0x26, 0xf1, 0x14, 0x43, 0xf7, 0x30, 0xa3, 0x51, 0x3a, 0x55, 0x03, 0xfb, 0x7a, + 0x55, 0x69, 0xe9, 0x96, 0xed, 0x50, 0x63, 0x6e, 0xbb, 0x1c, 0xea, 0x33, 0x7c, 0xd3, 0x6c, 0x60, + 0x73, 0xb7, 0x45, 0x6c, 0xc7, 0x0f, 0xf4, 0xc5, 0x36, 0xb8, 0xf5, 0x95, 0xd0, 0xba, 0xff, 0xc5, + 0x76, 0xac, 0xc0, 0x3a, 0x65, 0x2a, 0x85, 0xa6, 0xb8, 0x45, 0xcc, 0x06, 0xb7, 0x0a, 0x7f, 0x27, + 0xc9, 0x53, 0xc9, 0x89, 0xe7, 0x81, 0x59, 0x5f, 0xca, 0xb5, 0x6e, 0xe9, 0xae, 0xde, 0xe4, 0xd1, + 0x4b, 0xf3, 0x80, 0x1e, 0x06, 0x31, 0x3f, 0xa0, 0x9b, 0x2a, 0x7e, 0xd4, 0xc6, 0x9e, 0x2f, 0xed, + 0xc0, 0x5c, 0x6c, 0xd7, 0x6b, 0x11, 0xc7, 0xc3, 0xe8, 0x03, 0x98, 0x66, 0xce, 0x65, 0x61, 0x51, + 0x58, 0x2a, 0xad, 0x2e, 0xca, 0x79, 0x27, 0x21, 0x33, 0xcf, 0xf5, 0xc9, 0x17, 0x7f, 0x2d, 0x8c, + 0xa9, 0xdc, 0x4b, 0xda, 0xe2, 0x64, 0x77, 0xb1, 0x5e, 0xc3, 0x2e, 0x27, 0x43, 0x6f, 0xc0, 0x8c, + 0xd9, 0xd0, 0x6d, 0x47, 0xb3, 0x6b, 0x14, 0x77, 0x56, 0x3d, 0x45, 0xd7, 0xdb, 0x35, 0x74, 0x0e, + 0xa6, 0x1b, 0xd8, 0xb6, 0x1a, 0x7e, 0x79, 0x7c, 0x51, 0x58, 0x9a, 0x54, 0xf9, 0x4a, 0xfa, 0x51, + 0xe0, 0x02, 0x43, 0x24, 0x2e, 0xf0, 0x56, 0x60, 0x1f, 0xec, 0x70, 0x81, 0x97, 0xf3, 0x05, 0x6e, + 0x3b, 0x35, 0xfc, 0x04, 0xd7, 0x38, 0x00, 0x77, 0x43, 0xeb, 0xf0, 0x4a, 0x9d, 0xb8, 0xbb, 0x1a, + 0x5b, 0x7a, 0x94, 0xb6, 0xb4, 0xba, 0x90, 0x0f, 0xb3, 0x49, 0xdc, 0x5d, 0x4f, 0x2d, 0x05, 0x4e, + 0x0c, 0xca, 0x93, 0x34, 0x38, 0x4b, 0xb5, 0x6d, 0x04, 0x41, 0x7c, 0x64, 0x7b, 0x7e, 0x18, 0xe8, + 0x26, 0x40, 0xbf, 0xa2, 0xb8, 0xc2, 0xb7, 0x65, 0x56, 0x7e, 0x72, 0x50, 0x7e, 0x32, 0xab, 0x72, + 0x5e, 0x7e, 0xf2, 0x03, 0xdd, 0xc2, 0xdc, 0x57, 0x8d, 0x78, 0x4a, 0x5f, 0xc3, 0xb9, 0x24, 0x01, + 0x8f, 0xff, 0x3c, 0xcc, 0x86, 0xa9, 0x0c, 0xce, 0x68, 0x62, 0x69, 0x56, 0x9d, 0xe1, 0xb9, 0xf4, + 0xd0, 0x56, 0x8c, 0x7e, 0x9c, 0x27, 0x68, 0x18, 0x3d, 0x43, 0x8e, 0xf1, 0xaf, 0x45, 0xf9, 0xbd, + 0x6d, 0xa7, 0x4e, 0xc2, 0x08, 0x07, 0xf1, 0x4b, 0x1a, 0xbc, 0x9e, 0x72, 0xe3, 0xba, 0xef, 0x40, + 0x89, 0x9a, 0x79, 0x9a, 0xed, 0xd4, 0x09, 0xf5, 0x2c, 0xad, 0xbe, 0x99, 0x9f, 0x75, 0x0a, 0x41, + 0x11, 0xc0, 0xec, 0xa1, 0x49, 0x9f, 0xc3, 0x79, 0x4a, 0xf0, 0x61, 0x70, 0x6f, 0x32, 0xc5, 0xd1, + 0x1b, 0xa5, 0x39, 0xed, 0x26, 0xcd, 0xfe, 0xa4, 0x3a, 0x43, 0x37, 0xee, 0xb7, 0x9b, 0x71, 0xe5, + 0xe3, 0x09, 0xe5, 0x35, 0xb8, 0x90, 0x0d, 0x7c, 0xa2, 0xf2, 0xbf, 0xe2, 0xf9, 0x09, 0x4e, 0x94, + 0xd7, 0x52, 0x81, 0x2b, 0xb2, 0x99, 0x71, 0xaa, 0xc7, 0x29, 0xaa, 0x9f, 0x05, 0x28, 0xa7, 0xe9, + 0x79, 0x80, 0xb7, 0xe1, 0x54, 0x78, 0x23, 0x58, 0x70, 0x85, 0x2f, 0x56, 0xe8, 0x77, 0x72, 0xd5, + 0xf7, 0x19, 0x3f, 0x8c, 0x40, 0x27, 0x3d, 0x90, 0x44, 0xae, 0x06, 0x1e, 0x73, 0x34, 0x91, 0xe3, + 0xb1, 0x44, 0x4a, 0x06, 0x5c, 0xcc, 0xc1, 0x3d, 0xb1, 0x24, 0x48, 0x9f, 0xc2, 0x02, 0xe5, 0xd8, + 0xb4, 0x1d, 0x7d, 0xcf, 0x7e, 0x8a, 0x6b, 0xa3, 0x5d, 0x21, 0x34, 0x0f, 0x53, 0x2d, 0x97, 0x74, + 0x30, 0xd5, 0x3e, 0xa3, 0xb2, 0x85, 0xf4, 0x4c, 0x80, 0xc5, 0x7c, 0x58, 0xae, 0xfe, 0x4b, 0x38, + 0x5b, 0x0f, 0x3f, 0x6b, 0xe9, 0x6a, 0x5d, 0x1e, 0xf0, 0xc4, 0xc5, 0x50, 0x29, 0xe8, 0x5c, 0x3d, + 0xcd, 0x24, 0xf9, 0x70, 0x25, 0x43, 0x45, 0xf0, 0x69, 0xc7, 0xf1, 0xed, 0xbd, 0xbb, 0xf4, 0xe9, + 0x3e, 0xfe, 0xa3, 0xdf, 0x0f, 0x7e, 0x22, 0x1a, 0xfc, 0xf3, 0x09, 0xb8, 0x5a, 0x84, 0x96, 0xa7, + 0x61, 0x07, 0xe6, 0x13, 0x69, 0x08, 0xb3, 0x20, 0x14, 0xbd, 0xb3, 0xa8, 0x9e, 0x62, 0x42, 0x37, + 0x01, 0x58, 0xd1, 0x51, 0x30, 0x56, 0xdd, 0x62, 0x0f, 0xac, 0xd7, 0xc8, 0x3b, 0x55, 0x99, 0x96, + 0x96, 0xca, 0x4a, 0x94, 0xba, 0xde, 0x87, 0x57, 0x5d, 0xfd, 0xb1, 0xd6, 0x1f, 0x09, 0x68, 0x7c, + 0xd1, 0xea, 0x8a, 0x8d, 0x0f, 0x01, 0x86, 0xaa, 0x3f, 0xde, 0xe8, 0xed, 0xa9, 0xa7, 0xdd, 0xe8, + 0x12, 0xed, 0x00, 0x32, 0x7c, 0x53, 0xf3, 0xda, 0x46, 0xd3, 0xf6, 0x3c, 0x9b, 0x38, 0xda, 0x2e, + 0xee, 0x96, 0x27, 0x13, 0x98, 0xf1, 0x79, 0xa5, 0x53, 0x95, 0x3f, 0xe9, 0xd9, 0xdf, 0xc3, 0x5d, + 0xf5, 0x8c, 0xe1, 0x9b, 0xb1, 0x1d, 0xb4, 0x45, 0xb3, 0x4f, 0xea, 0xe5, 0x29, 0x8a, 0x54, 0x1d, + 0xd0, 0xfa, 0x03, 0xb3, 0x8c, 0xa2, 0x61, 0xfe, 0xab, 0xcf, 0x4e, 0xc3, 0x14, 0x3d, 0x30, 0xf4, + 0xad, 0x00, 0xd3, 0x6c, 0x4e, 0x40, 0x03, 0xca, 0x2f, 0x3d, 0x9e, 0x88, 0x2b, 0x05, 0xad, 0xd9, + 0x99, 0x4b, 0x4b, 0xdf, 0xfc, 0xf1, 0xcf, 0xf7, 0xe3, 0x12, 0x5a, 0x54, 0x86, 0xcc, 0x44, 0xe8, + 0xb9, 0x00, 0xd3, 0xec, 0xce, 0x0e, 0x55, 0x14, 0x9b, 0x61, 0x86, 0x2a, 0x8a, 0xcf, 0x29, 0xd2, + 0x16, 0x55, 0x74, 0x1b, 0xdd, 0xca, 0x57, 0xd4, 0xaf, 0x4d, 0x65, 0x3f, 0xbc, 0x29, 0x07, 0x0a, + 0x7b, 0x48, 0x94, 0x7d, 0x76, 0x25, 0x0e, 0xd0, 0x0f, 0x02, 0xcc, 0xf6, 0xc6, 0x00, 0xa4, 0x0c, + 0x51, 0x91, 0x9c, 0x48, 0xc4, 0x77, 0x8b, 0x3b, 0x14, 0xcf, 0x25, 0x7b, 0x5c, 0xd0, 0x4f, 0x02, + 0x40, 0xff, 0x75, 0x40, 0x85, 0xa8, 0xa2, 0x2f, 0xa1, 0x58, 0x1d, 0xc1, 0x83, 0xab, 0x5b, 0xa1, + 0xea, 0x2e, 0xa3, 0x4b, 0xc3, 0xd4, 0xd1, 0xc4, 0xa2, 0x5f, 0x05, 0x78, 0x2d, 0xd1, 0xd3, 0xd1, + 0xda, 0x10, 0xd6, 0xec, 0xe1, 0x42, 0xbc, 0x3e, 0xaa, 0x1b, 0x57, 0x7c, 0x8d, 0x2a, 0x5e, 0x41, + 0xef, 0xe4, 0x2b, 0x66, 0x0f, 0x4b, 0x54, 0xf7, 0x2f, 0x02, 0x94, 0x22, 0x6d, 0x1a, 0x0d, 0xcb, + 0x54, 0x7a, 0xa2, 0x10, 0x57, 0x47, 0x71, 0xe1, 0x5a, 0xdf, 0xa3, 0x5a, 0x65, 0xb4, 0x9c, 0xaf, + 0x95, 0x37, 0xba, 0x48, 0xc9, 0xa2, 0xdf, 0x05, 0x38, 0x93, 0xec, 0xa9, 0xe8, 0x7a, 0x01, 0xfa, + 0x8c, 0xe6, 0x2e, 0xde, 0x18, 0xd9, 0xaf, 0xf8, 0x8d, 0x4b, 0x6b, 0x67, 0xa9, 0xf7, 0x94, 0xfd, + 0xde, 0x40, 0x71, 0x80, 0x7e, 0x13, 0x60, 0x2e, 0xa3, 0xcf, 0xa2, 0x9b, 0x43, 0x94, 0xe5, 0xb7, + 0x7c, 0xf1, 0xfd, 0xe3, 0xb8, 0xf2, 0xb8, 0x6e, 0xd0, 0xb8, 0xaa, 0x48, 0xc9, 0x8f, 0x2b, 0xb3, + 0xed, 0xa3, 0x7f, 0x05, 0xb8, 0x38, 0xb0, 0x65, 0xa2, 0x8d, 0x91, 0x64, 0x65, 0xf7, 0x79, 0xf1, + 0xce, 0xff, 0x03, 0xe1, 0x51, 0x3e, 0xa4, 0x51, 0xde, 0x43, 0xdb, 0x85, 0xa3, 0xcc, 0x78, 0x39, + 0x03, 0xc4, 0xde, 0xcb, 0xb9, 0xfe, 0xf1, 0x8b, 0xc3, 0x8a, 0xf0, 0xf2, 0xb0, 0x22, 0xfc, 0x7d, + 0x58, 0x11, 0xbe, 0x3b, 0xaa, 0x8c, 0xbd, 0x3c, 0xaa, 0x8c, 0xfd, 0x79, 0x54, 0x19, 0xfb, 0x62, + 0xcd, 0xb2, 0xfd, 0x46, 0xdb, 0x90, 0x4d, 0xd2, 0x0c, 0xe9, 0x28, 0x4c, 0x8f, 0xfb, 0x49, 0x82, + 0xdd, 0xef, 0xb6, 0xb0, 0x67, 0x4c, 0xd3, 0x3f, 0xd4, 0xd7, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, + 0x03, 0xf9, 0xf2, 0x6b, 0xc4, 0x10, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1326,10 +1123,6 @@ type QueryClient interface { // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than // the provided CZ height, with proofs FinalizedChainInfoUntilHeight(ctx context.Context, in *QueryFinalizedChainInfoUntilHeightRequest, opts ...grpc.CallOption) (*QueryFinalizedChainInfoUntilHeightResponse, error) - // ChainRegistryList queries the list of chains that are registered to Babylon - ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) - // ChainsRegistry queries the latest info for a given list of chains in Babylon's view - ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) } type queryClient struct { @@ -1421,24 +1214,6 @@ func (c *queryClient) FinalizedChainInfoUntilHeight(ctx context.Context, in *Que return out, nil } -func (c *queryClient) ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) { - out := new(QueryChainRegistryListResponse) - err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/ChainRegistryList", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) { - out := new(QueryChainsRegistryResponse) - err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Query/ChainsRegistry", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // QueryServer is the server API for Query service. type QueryServer interface { // Params queries the parameters of the module. @@ -1463,10 +1238,6 @@ type QueryServer interface { // FinalizedChainInfoUntilHeight queries the BTC-finalised info no later than // the provided CZ height, with proofs FinalizedChainInfoUntilHeight(context.Context, *QueryFinalizedChainInfoUntilHeightRequest) (*QueryFinalizedChainInfoUntilHeightResponse, error) - // ChainRegistryList queries the list of chains that are registered to Babylon - ChainRegistryList(context.Context, *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) - // ChainsRegistry queries the latest info for a given list of chains in Babylon's view - ChainsRegistry(context.Context, *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -1500,12 +1271,6 @@ func (*UnimplementedQueryServer) FinalizedChainsInfo(ctx context.Context, req *Q func (*UnimplementedQueryServer) FinalizedChainInfoUntilHeight(ctx context.Context, req *QueryFinalizedChainInfoUntilHeightRequest) (*QueryFinalizedChainInfoUntilHeightResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FinalizedChainInfoUntilHeight not implemented") } -func (*UnimplementedQueryServer) ChainRegistryList(ctx context.Context, req *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ChainRegistryList not implemented") -} -func (*UnimplementedQueryServer) ChainsRegistry(ctx context.Context, req *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ChainsRegistry not implemented") -} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -1673,42 +1438,6 @@ func _Query_FinalizedChainInfoUntilHeight_Handler(srv interface{}, ctx context.C return interceptor(ctx, in, info, handler) } -func _Query_ChainRegistryList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryChainRegistryListRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).ChainRegistryList(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/babylon.zoneconcierge.v1.Query/ChainRegistryList", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ChainRegistryList(ctx, req.(*QueryChainRegistryListRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_ChainsRegistry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryChainsRegistryRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).ChainsRegistry(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/babylon.zoneconcierge.v1.Query/ChainsRegistry", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ChainsRegistry(ctx, req.(*QueryChainsRegistryRequest)) - } - return interceptor(ctx, in, info, handler) -} - var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.zoneconcierge.v1.Query", HandlerType: (*QueryServer)(nil), @@ -1749,14 +1478,6 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "FinalizedChainInfoUntilHeight", Handler: _Query_FinalizedChainInfoUntilHeight_Handler, }, - { - MethodName: "ChainRegistryList", - Handler: _Query_ChainRegistryList_Handler, - }, - { - MethodName: "ChainsRegistry", - Handler: _Query_ChainsRegistry_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "babylon/zoneconcierge/v1/query.proto", @@ -2492,222 +2213,74 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) MarshalToSizedBuffer(dAtA [ return len(dAtA) - i, nil } -func (m *QueryChainRegistryListRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ } - return dAtA[:n], nil + dAtA[offset] = uint8(v) + return base } - -func (m *QueryChainRegistryListRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *QueryParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n } -func (m *QueryChainRegistryListRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i +func (m *QueryParamsResponse) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.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 + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + return n } -func (m *QueryChainRegistryListResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func (m *QueryHeaderRequest) Size() (n int) { + if m == nil { + return 0 } - return dAtA[:n], nil + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.Height != 0 { + n += 1 + sovQuery(uint64(m.Height)) + } + return n } -func (m *QueryChainRegistryListResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *QueryHeaderResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovQuery(uint64(l)) + } + if m.ForkHeaders != nil { + l = m.ForkHeaders.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n } -func (m *QueryChainRegistryListResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ChainIds) > 0 { - for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ChainIds[iNdEx]) - copy(dAtA[i:], m.ChainIds[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryChainsRegistryRequest) 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 *QueryChainsRegistryRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryChainsRegistryRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ChainIds) > 0 { - for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ChainIds[iNdEx]) - copy(dAtA[i:], m.ChainIds[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryChainsRegistryResponse) 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 *QueryChainsRegistryResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryChainsRegistryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ChainsRegister) > 0 { - for iNdEx := len(m.ChainsRegister) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ChainsRegister[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 encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryHeaderRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - if m.Height != 0 { - n += 1 + sovQuery(uint64(m.Height)) - } - return n -} - -func (m *QueryHeaderResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Header != nil { - l = m.Header.Size() - n += 1 + l + sovQuery(uint64(l)) - } - if m.ForkHeaders != nil { - l = m.ForkHeaders.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryChainListRequest) Size() (n int) { - if m == nil { - return 0 - } +func (m *QueryChainListRequest) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Pagination != nil { @@ -2947,68 +2520,6 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) Size() (n int) { return n } -func (m *QueryChainRegistryListRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryChainRegistryListResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ChainIds) > 0 { - for _, s := range m.ChainIds { - l = len(s) - n += 1 + l + sovQuery(uint64(l)) - } - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryChainsRegistryRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ChainIds) > 0 { - for _, s := range m.ChainIds { - l = len(s) - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryChainsRegistryResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ChainsRegister) > 0 { - for _, e := range m.ChainsRegister { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4886,376 +4397,6 @@ func (m *QueryFinalizedChainInfoUntilHeightResponse) Unmarshal(dAtA []byte) erro } return nil } -func (m *QueryChainRegistryListRequest) 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: QueryChainRegistryListRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainRegistryListRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", 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 - } - if m.Pagination == nil { - m.Pagination = &query.PageRequest{} - } - if err := m.Pagination.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 *QueryChainRegistryListResponse) 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: QueryChainRegistryListResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainRegistryListResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", 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 - } - if m.Pagination == nil { - m.Pagination = &query.PageResponse{} - } - if err := m.Pagination.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 *QueryChainsRegistryRequest) 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: QueryChainsRegistryRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainsRegistryRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) - 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 *QueryChainsRegistryResponse) 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: QueryChainsRegistryResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainsRegistryResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainsRegister", 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.ChainsRegister = append(m.ChainsRegister, &ChainRegister{}) - if err := m.ChainsRegister[len(m.ChainsRegister)-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 skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/zoneconcierge/types/query.pb.gw.go b/x/zoneconcierge/types/query.pb.gw.go index 3c8ed6c38..fc22099f6 100644 --- a/x/zoneconcierge/types/query.pb.gw.go +++ b/x/zoneconcierge/types/query.pb.gw.go @@ -513,78 +513,6 @@ func local_request_Query_FinalizedChainInfoUntilHeight_0(ctx context.Context, ma } -var ( - filter_Query_ChainRegistryList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_ChainRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainRegistryListRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainRegistryList_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ChainRegistryList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_ChainRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainRegistryListRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainRegistryList_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ChainRegistryList(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_ChainsRegistry_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainsRegistryRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsRegistry_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ChainsRegistry(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainsRegistryRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsRegistry_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ChainsRegistry(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. @@ -798,52 +726,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) - mux.Handle("GET", pattern_Query_ChainRegistryList_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_ChainRegistryList_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_ChainRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ChainsRegistry_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_ChainsRegistry_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_ChainsRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -1065,46 +947,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) - mux.Handle("GET", pattern_Query_ChainRegistryList_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_ChainRegistryList_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_ChainRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ChainsRegistry_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_ChainsRegistry_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_ChainsRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -1126,10 +968,6 @@ var ( pattern_Query_FinalizedChainsInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "finalized_chains_info"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_FinalizedChainInfoUntilHeight_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 5}, []string{"babylon", "zoneconcierge", "v1", "finalized_chain_info", "chain_id", "height"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_ChainRegistryList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "chain_registry_list"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_ChainsRegistry_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "zoneconcierge", "v1", "chains_registry"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -1150,8 +988,4 @@ var ( forward_Query_FinalizedChainsInfo_0 = runtime.ForwardResponseMessage forward_Query_FinalizedChainInfoUntilHeight_0 = runtime.ForwardResponseMessage - - forward_Query_ChainRegistryList_0 = runtime.ForwardResponseMessage - - forward_Query_ChainsRegistry_0 = runtime.ForwardResponseMessage ) diff --git a/x/zoneconcierge/types/tx.pb.go b/x/zoneconcierge/types/tx.pb.go index 6dc663e90..032e66afa 100644 --- a/x/zoneconcierge/types/tx.pb.go +++ b/x/zoneconcierge/types/tx.pb.go @@ -127,155 +127,36 @@ func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo -// MsgRegisterChain defines a message for registering CZ chains to the zoneconcierge module. -type MsgRegisterChain struct { - Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` - // chain_id is the ID of the chain - ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // chain_name is the name of the chain - ChainName string `protobuf:"bytes,3,opt,name=chain_name,json=chainName,proto3" json:"chain_name,omitempty"` - // chain_description is a description for the chain (can be empty) - ChainDescription string `protobuf:"bytes,4,opt,name=chain_description,json=chainDescription,proto3" json:"chain_description,omitempty"` -} - -func (m *MsgRegisterChain) Reset() { *m = MsgRegisterChain{} } -func (m *MsgRegisterChain) String() string { return proto.CompactTextString(m) } -func (*MsgRegisterChain) ProtoMessage() {} -func (*MsgRegisterChain) Descriptor() ([]byte, []int) { - return fileDescriptor_35e2112d987e4e18, []int{2} -} -func (m *MsgRegisterChain) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgRegisterChain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgRegisterChain.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 *MsgRegisterChain) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRegisterChain.Merge(m, src) -} -func (m *MsgRegisterChain) XXX_Size() int { - return m.Size() -} -func (m *MsgRegisterChain) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRegisterChain.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgRegisterChain proto.InternalMessageInfo - -func (m *MsgRegisterChain) GetSigner() string { - if m != nil { - return m.Signer - } - return "" -} - -func (m *MsgRegisterChain) GetChainId() string { - if m != nil { - return m.ChainId - } - return "" -} - -func (m *MsgRegisterChain) GetChainName() string { - if m != nil { - return m.ChainName - } - return "" -} - -func (m *MsgRegisterChain) GetChainDescription() string { - if m != nil { - return m.ChainDescription - } - return "" -} - -// MsgRegisterChainResponse is the response to the MsgRegisterChain message. -type MsgRegisterChainResponse struct { -} - -func (m *MsgRegisterChainResponse) Reset() { *m = MsgRegisterChainResponse{} } -func (m *MsgRegisterChainResponse) String() string { return proto.CompactTextString(m) } -func (*MsgRegisterChainResponse) ProtoMessage() {} -func (*MsgRegisterChainResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_35e2112d987e4e18, []int{3} -} -func (m *MsgRegisterChainResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgRegisterChainResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgRegisterChainResponse.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 *MsgRegisterChainResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRegisterChainResponse.Merge(m, src) -} -func (m *MsgRegisterChainResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgRegisterChainResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRegisterChainResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgRegisterChainResponse proto.InternalMessageInfo - func init() { proto.RegisterType((*MsgUpdateParams)(nil), "babylon.zoneconcierge.v1.MsgUpdateParams") proto.RegisterType((*MsgUpdateParamsResponse)(nil), "babylon.zoneconcierge.v1.MsgUpdateParamsResponse") - proto.RegisterType((*MsgRegisterChain)(nil), "babylon.zoneconcierge.v1.MsgRegisterChain") - proto.RegisterType((*MsgRegisterChainResponse)(nil), "babylon.zoneconcierge.v1.MsgRegisterChainResponse") } func init() { proto.RegisterFile("babylon/zoneconcierge/v1/tx.proto", fileDescriptor_35e2112d987e4e18) } var fileDescriptor_35e2112d987e4e18 = []byte{ - // 459 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x4f, 0x6f, 0xd3, 0x30, - 0x18, 0xc6, 0x6b, 0x36, 0x0a, 0xf5, 0xf8, 0x33, 0xac, 0x89, 0xa5, 0x91, 0x08, 0xa5, 0x12, 0xd2, - 0x28, 0x22, 0x51, 0x8b, 0xe0, 0xb0, 0x03, 0x12, 0x85, 0x0b, 0x87, 0x02, 0x0a, 0xe2, 0xc2, 0x65, - 0x72, 0x12, 0xcb, 0xb5, 0xb4, 0xd8, 0x91, 0xed, 0x4d, 0x2b, 0x27, 0xc4, 0x27, 0xe0, 0xca, 0x85, - 0xcf, 0xb0, 0x03, 0x1f, 0x62, 0xc7, 0x89, 0x13, 0x27, 0x84, 0xda, 0xc3, 0x0e, 0x7c, 0x09, 0x14, - 0xdb, 0x51, 0x95, 0x48, 0x9d, 0x7a, 0xcb, 0xeb, 0xe7, 0xe7, 0xf7, 0x79, 0xf2, 0xc8, 0xf0, 0x41, - 0x82, 0x93, 0xd9, 0xa1, 0xe0, 0xd1, 0x67, 0xc1, 0x49, 0x2a, 0x78, 0xca, 0x88, 0xa4, 0x24, 0x3a, - 0x1e, 0x46, 0xfa, 0x24, 0x2c, 0xa4, 0xd0, 0x02, 0x79, 0x0e, 0x09, 0x6b, 0x48, 0x78, 0x3c, 0xf4, - 0x77, 0xa8, 0xa0, 0xc2, 0x40, 0x51, 0xf9, 0x65, 0x79, 0xbf, 0x9b, 0x0a, 0x95, 0x0b, 0x75, 0x60, - 0x05, 0x3b, 0x38, 0x69, 0xd7, 0x4e, 0x51, 0xae, 0x68, 0x69, 0x91, 0x2b, 0xea, 0x84, 0x87, 0x2b, - 0x63, 0x14, 0x58, 0xe2, 0xdc, 0xdd, 0xef, 0x7f, 0x07, 0xf0, 0xf6, 0x44, 0xd1, 0x8f, 0x45, 0x86, - 0x35, 0x79, 0x6f, 0x14, 0xf4, 0x1c, 0x76, 0xf0, 0x91, 0x9e, 0x0a, 0xc9, 0xf4, 0xcc, 0x03, 0x3d, - 0xb0, 0xd7, 0x19, 0x7b, 0xbf, 0x7e, 0x3e, 0xd9, 0x71, 0xc6, 0x2f, 0xb3, 0x4c, 0x12, 0xa5, 0x3e, - 0x68, 0xc9, 0x38, 0x8d, 0x97, 0x28, 0x7a, 0x01, 0xdb, 0x76, 0xb7, 0x77, 0xa5, 0x07, 0xf6, 0xb6, - 0x46, 0xbd, 0x70, 0xd5, 0x7f, 0x86, 0xd6, 0x69, 0xbc, 0x79, 0xf6, 0xe7, 0x7e, 0x2b, 0x76, 0xb7, - 0xf6, 0x6f, 0x7d, 0xbd, 0x38, 0x1d, 0x2c, 0xf7, 0xf5, 0xbb, 0x70, 0xb7, 0x11, 0x2d, 0x26, 0xaa, - 0x10, 0x5c, 0x91, 0xfe, 0x0f, 0x00, 0xb7, 0x27, 0x8a, 0xc6, 0x84, 0x32, 0xa5, 0x89, 0x7c, 0x35, - 0xc5, 0x8c, 0xa3, 0xbb, 0xb0, 0xad, 0x18, 0xe5, 0x44, 0xda, 0xd0, 0xb1, 0x9b, 0x50, 0x17, 0x5e, - 0x4f, 0x4b, 0xe0, 0x80, 0x65, 0x26, 0x59, 0x27, 0xbe, 0x66, 0xe6, 0x37, 0x19, 0xba, 0x07, 0xa1, - 0x95, 0x38, 0xce, 0x89, 0xb7, 0x61, 0xc4, 0x8e, 0x39, 0x79, 0x8b, 0x73, 0x82, 0x1e, 0xc3, 0x3b, - 0x56, 0xce, 0x88, 0x4a, 0x25, 0x2b, 0x34, 0x13, 0xdc, 0xdb, 0x34, 0xd4, 0xb6, 0x11, 0x5e, 0x2f, - 0xcf, 0xf7, 0xb7, 0xca, 0xf8, 0xce, 0xb3, 0xef, 0x43, 0xaf, 0x99, 0xaf, 0x0a, 0x3f, 0xfa, 0x07, - 0xe0, 0xc6, 0x44, 0x51, 0x74, 0x08, 0x6f, 0xd4, 0x7a, 0x7f, 0xb4, 0xba, 0xaf, 0x46, 0x0f, 0xfe, - 0x70, 0x6d, 0xb4, 0x72, 0x45, 0x02, 0xde, 0xac, 0xd7, 0x35, 0xb8, 0x74, 0x47, 0x8d, 0xf5, 0x47, - 0xeb, 0xb3, 0x95, 0xa1, 0x7f, 0xf5, 0xcb, 0xc5, 0xe9, 0x00, 0x8c, 0xdf, 0x9d, 0xcd, 0x03, 0x70, - 0x3e, 0x0f, 0xc0, 0xdf, 0x79, 0x00, 0xbe, 0x2d, 0x82, 0xd6, 0xf9, 0x22, 0x68, 0xfd, 0x5e, 0x04, - 0xad, 0x4f, 0xcf, 0x28, 0xd3, 0xd3, 0xa3, 0x24, 0x4c, 0x45, 0x1e, 0xb9, 0xf5, 0xa6, 0xd4, 0x6a, - 0x88, 0x4e, 0x1a, 0x8f, 0x57, 0xcf, 0x0a, 0xa2, 0x92, 0xb6, 0x79, 0xb9, 0x4f, 0xff, 0x07, 0x00, - 0x00, 0xff, 0xff, 0xc1, 0x62, 0x32, 0x24, 0x69, 0x03, 0x00, 0x00, + // 331 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x4a, 0x4c, 0xaa, + 0xcc, 0xc9, 0xcf, 0xd3, 0xaf, 0xca, 0xcf, 0x4b, 0x4d, 0xce, 0xcf, 0x4b, 0xce, 0x4c, 0x2d, 0x4a, + 0x4f, 0xd5, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, + 0x2a, 0xd1, 0x43, 0x51, 0xa2, 0x57, 0x66, 0x28, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x56, 0xa4, + 0x0f, 0x62, 0x41, 0xd4, 0x4b, 0x49, 0x26, 0xe7, 0x17, 0xe7, 0xe6, 0x17, 0xc7, 0x43, 0x24, 0x20, + 0x1c, 0xa8, 0x94, 0x38, 0x84, 0xa7, 0x9f, 0x5b, 0x9c, 0x0e, 0xb2, 0x22, 0xb7, 0x38, 0x1d, 0x2a, + 0xa1, 0x8a, 0xd3, 0x19, 0x05, 0x89, 0x45, 0x89, 0xb9, 0x50, 0xfd, 0x4a, 0x33, 0x19, 0xb9, 0xf8, + 0x7d, 0x8b, 0xd3, 0x43, 0x0b, 0x52, 0x12, 0x4b, 0x52, 0x03, 0xc0, 0x32, 0x42, 0x66, 0x5c, 0x9c, + 0x89, 0xa5, 0x25, 0x19, 0xf9, 0x45, 0x99, 0x25, 0x95, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x4e, + 0x12, 0x97, 0xb6, 0xe8, 0x8a, 0x40, 0x2d, 0x76, 0x4c, 0x49, 0x29, 0x4a, 0x2d, 0x2e, 0x0e, 0x2e, + 0x29, 0xca, 0xcc, 0x4b, 0x0f, 0x42, 0x28, 0x15, 0xb2, 0xe3, 0x62, 0x83, 0x98, 0x2d, 0xc1, 0xa4, + 0xc0, 0xa8, 0xc1, 0x6d, 0xa4, 0xa0, 0x87, 0xcb, 0x9f, 0x7a, 0x10, 0x9b, 0x9c, 0x58, 0x4e, 0xdc, + 0x93, 0x67, 0x08, 0x82, 0xea, 0xb2, 0xe2, 0x6b, 0x7a, 0xbe, 0x41, 0x0b, 0x61, 0x9e, 0x92, 0x24, + 0x97, 0x38, 0x9a, 0xd3, 0x82, 0x52, 0x8b, 0x0b, 0xf2, 0xf3, 0x8a, 0x53, 0x8d, 0xaa, 0xb8, 0x98, + 0x7d, 0x8b, 0xd3, 0x85, 0x72, 0xb8, 0x78, 0x50, 0x5c, 0xae, 0x89, 0xdb, 0x46, 0x34, 0x93, 0xa4, + 0x0c, 0x89, 0x56, 0x0a, 0xb3, 0x54, 0x8a, 0xb5, 0xe1, 0xf9, 0x06, 0x2d, 0x46, 0x27, 0xff, 0x13, + 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, + 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, + 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x87, 0x9a, 0x9e, 0x9c, 0x91, 0x98, 0x99, 0x07, 0xe3, 0xe8, 0x57, + 0xa0, 0xc5, 0x46, 0x49, 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0x38, 0x2a, 0x8c, 0x01, 0x01, 0x00, + 0x00, 0xff, 0xff, 0x05, 0xf5, 0x03, 0x87, 0x3a, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -292,8 +173,6 @@ const _ = grpc.SupportPackageIsVersion4 type MsgClient interface { // UpdateParams updates the zoneconcierge module parameters. UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) - // RegisterChain registers a CZ chain to the zoneconcierge module. - RegisterChain(ctx context.Context, in *MsgRegisterChain, opts ...grpc.CallOption) (*MsgRegisterChainResponse, error) } type msgClient struct { @@ -313,21 +192,10 @@ func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts return out, nil } -func (c *msgClient) RegisterChain(ctx context.Context, in *MsgRegisterChain, opts ...grpc.CallOption) (*MsgRegisterChainResponse, error) { - out := new(MsgRegisterChainResponse) - err := c.cc.Invoke(ctx, "/babylon.zoneconcierge.v1.Msg/RegisterChain", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // MsgServer is the server API for Msg service. type MsgServer interface { // UpdateParams updates the zoneconcierge module parameters. UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) - // RegisterChain registers a CZ chain to the zoneconcierge module. - RegisterChain(context.Context, *MsgRegisterChain) (*MsgRegisterChainResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -337,9 +205,6 @@ type UnimplementedMsgServer struct { func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") } -func (*UnimplementedMsgServer) RegisterChain(ctx context.Context, req *MsgRegisterChain) (*MsgRegisterChainResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RegisterChain not implemented") -} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -363,24 +228,6 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } -func _Msg_RegisterChain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgRegisterChain) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).RegisterChain(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/babylon.zoneconcierge.v1.Msg/RegisterChain", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).RegisterChain(ctx, req.(*MsgRegisterChain)) - } - return interceptor(ctx, in, info, handler) -} - var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.zoneconcierge.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -389,10 +236,6 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "UpdateParams", Handler: _Msg_UpdateParams_Handler, }, - { - MethodName: "RegisterChain", - Handler: _Msg_RegisterChain_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "babylon/zoneconcierge/v1/tx.proto", @@ -461,80 +304,6 @@ func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *MsgRegisterChain) 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 *MsgRegisterChain) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgRegisterChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ChainDescription) > 0 { - i -= len(m.ChainDescription) - copy(dAtA[i:], m.ChainDescription) - i = encodeVarintTx(dAtA, i, uint64(len(m.ChainDescription))) - i-- - dAtA[i] = 0x22 - } - if len(m.ChainName) > 0 { - i -= len(m.ChainName) - copy(dAtA[i:], m.ChainName) - i = encodeVarintTx(dAtA, i, uint64(len(m.ChainName))) - i-- - dAtA[i] = 0x1a - } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintTx(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0x12 - } - if len(m.Signer) > 0 { - i -= len(m.Signer) - copy(dAtA[i:], m.Signer) - i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgRegisterChainResponse) 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 *MsgRegisterChainResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgRegisterChainResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -570,40 +339,6 @@ func (m *MsgUpdateParamsResponse) Size() (n int) { return n } -func (m *MsgRegisterChain) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Signer) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.ChainName) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.ChainDescription) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgRegisterChainResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -775,234 +510,6 @@ func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgRegisterChain) 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 ErrIntOverflowTx - } - 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: MsgRegisterChain: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRegisterChain: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainDescription", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainDescription = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgRegisterChainResponse) 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 ErrIntOverflowTx - } - 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: MsgRegisterChainResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRegisterChainResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/zoneconcierge/types/zoneconcierge.pb.go b/x/zoneconcierge/types/zoneconcierge.pb.go index 5a48b9511..8f4031b56 100644 --- a/x/zoneconcierge/types/zoneconcierge.pb.go +++ b/x/zoneconcierge/types/zoneconcierge.pb.go @@ -341,70 +341,6 @@ func (m *ChainInfoWithProof) GetProofHeaderInEpoch() *crypto.ProofOps { return nil } -// ChainRegister is the registration information of a CZ -type ChainRegister struct { - // chain_id is the ID of the chain - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // chain_name is the name of the chain - ChainName string `protobuf:"bytes,2,opt,name=chain_name,json=chainName,proto3" json:"chain_name,omitempty"` - // chain_description is a description for the chain (can be empty) - ChainDescription string `protobuf:"bytes,3,opt,name=chain_description,json=chainDescription,proto3" json:"chain_description,omitempty"` -} - -func (m *ChainRegister) Reset() { *m = ChainRegister{} } -func (m *ChainRegister) String() string { return proto.CompactTextString(m) } -func (*ChainRegister) ProtoMessage() {} -func (*ChainRegister) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{4} -} -func (m *ChainRegister) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ChainRegister) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ChainRegister.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 *ChainRegister) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChainRegister.Merge(m, src) -} -func (m *ChainRegister) XXX_Size() int { - return m.Size() -} -func (m *ChainRegister) XXX_DiscardUnknown() { - xxx_messageInfo_ChainRegister.DiscardUnknown(m) -} - -var xxx_messageInfo_ChainRegister proto.InternalMessageInfo - -func (m *ChainRegister) GetChainId() string { - if m != nil { - return m.ChainId - } - return "" -} - -func (m *ChainRegister) GetChainName() string { - if m != nil { - return m.ChainName - } - return "" -} - -func (m *ChainRegister) GetChainDescription() string { - if m != nil { - return m.ChainDescription - } - return "" -} - // FinalizedChainInfo is the information of a CZ that is BTC-finalised type FinalizedChainInfo struct { // chain_id is the ID of the chain @@ -426,7 +362,7 @@ func (m *FinalizedChainInfo) Reset() { *m = FinalizedChainInfo{} } func (m *FinalizedChainInfo) String() string { return proto.CompactTextString(m) } func (*FinalizedChainInfo) ProtoMessage() {} func (*FinalizedChainInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{5} + return fileDescriptor_ab886e1868e5c5cd, []int{4} } func (m *FinalizedChainInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -524,7 +460,7 @@ func (m *ProofEpochSealed) Reset() { *m = ProofEpochSealed{} } func (m *ProofEpochSealed) String() string { return proto.CompactTextString(m) } func (*ProofEpochSealed) ProtoMessage() {} func (*ProofEpochSealed) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{6} + return fileDescriptor_ab886e1868e5c5cd, []int{5} } func (m *ProofEpochSealed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -592,7 +528,7 @@ func (m *ProofFinalizedChainInfo) Reset() { *m = ProofFinalizedChainInfo func (m *ProofFinalizedChainInfo) String() string { return proto.CompactTextString(m) } func (*ProofFinalizedChainInfo) ProtoMessage() {} func (*ProofFinalizedChainInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{7} + return fileDescriptor_ab886e1868e5c5cd, []int{6} } func (m *ProofFinalizedChainInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -651,7 +587,7 @@ func (m *BTCChainSegment) Reset() { *m = BTCChainSegment{} } func (m *BTCChainSegment) String() string { return proto.CompactTextString(m) } func (*BTCChainSegment) ProtoMessage() {} func (*BTCChainSegment) Descriptor() ([]byte, []int) { - return fileDescriptor_ab886e1868e5c5cd, []int{8} + return fileDescriptor_ab886e1868e5c5cd, []int{7} } func (m *BTCChainSegment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -692,7 +628,6 @@ func init() { proto.RegisterType((*Forks)(nil), "babylon.zoneconcierge.v1.Forks") proto.RegisterType((*ChainInfo)(nil), "babylon.zoneconcierge.v1.ChainInfo") proto.RegisterType((*ChainInfoWithProof)(nil), "babylon.zoneconcierge.v1.ChainInfoWithProof") - proto.RegisterType((*ChainRegister)(nil), "babylon.zoneconcierge.v1.ChainRegister") proto.RegisterType((*FinalizedChainInfo)(nil), "babylon.zoneconcierge.v1.FinalizedChainInfo") proto.RegisterType((*ProofEpochSealed)(nil), "babylon.zoneconcierge.v1.ProofEpochSealed") proto.RegisterType((*ProofFinalizedChainInfo)(nil), "babylon.zoneconcierge.v1.ProofFinalizedChainInfo") @@ -704,71 +639,68 @@ func init() { } var fileDescriptor_ab886e1868e5c5cd = []byte{ - // 1014 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xcd, 0x6e, 0xdb, 0x46, - 0x10, 0x36, 0x2d, 0xd9, 0x8e, 0x46, 0x56, 0xe2, 0xac, 0x9d, 0x46, 0x71, 0x11, 0xd9, 0x60, 0x80, - 0x54, 0xe9, 0x0f, 0x05, 0xa9, 0xed, 0xa1, 0xbd, 0x55, 0x6a, 0xd2, 0x38, 0x2d, 0x92, 0x82, 0x72, - 0xd2, 0xa2, 0x68, 0x41, 0xf0, 0x67, 0x45, 0x12, 0xa6, 0xb8, 0x02, 0xb9, 0x56, 0x2c, 0x3f, 0x45, - 0xde, 0xa2, 0xbd, 0xf6, 0x01, 0x7a, 0xef, 0x31, 0xc7, 0xde, 0x5a, 0xd8, 0xaf, 0xd0, 0x4b, 0x6f, - 0xc5, 0xce, 0xee, 0x52, 0x54, 0x0c, 0xc5, 0xce, 0xc5, 0xd0, 0xce, 0x7e, 0x33, 0xf3, 0xed, 0x37, - 0x3f, 0x34, 0x7c, 0xec, 0xb9, 0xde, 0x2c, 0x61, 0x69, 0xe7, 0x94, 0xa5, 0xd4, 0x67, 0xa9, 0x1f, - 0xd3, 0x2c, 0xa4, 0x9d, 0x69, 0x77, 0xd1, 0x60, 0x4d, 0x32, 0xc6, 0x19, 0x69, 0x2a, 0xb4, 0xb5, - 0x78, 0x39, 0xed, 0xee, 0xee, 0x84, 0x2c, 0x64, 0x08, 0xea, 0x88, 0x5f, 0x12, 0xbf, 0xbb, 0x17, - 0x32, 0x16, 0x26, 0xb4, 0x83, 0x27, 0xef, 0x78, 0xd4, 0xe1, 0xf1, 0x98, 0xe6, 0xdc, 0x1d, 0x4f, - 0x14, 0xe0, 0x2e, 0xa7, 0x69, 0x40, 0xb3, 0x71, 0x9c, 0xf2, 0x8e, 0x9f, 0xcd, 0x26, 0x9c, 0x09, - 0x2c, 0x1b, 0xa9, 0xeb, 0x82, 0x9d, 0xc7, 0x7d, 0x3f, 0xa2, 0xfe, 0xd1, 0x84, 0x09, 0xe4, 0xb4, - 0xbb, 0x68, 0x50, 0xe8, 0xfb, 0x1a, 0x3d, 0xbf, 0x89, 0xd3, 0x10, 0xd1, 0x49, 0xee, 0x1c, 0xd1, - 0x99, 0xc2, 0x3d, 0x58, 0x8a, 0xbb, 0x10, 0xd2, 0xd4, 0x50, 0x3a, 0x61, 0x7e, 0xa4, 0x50, 0xfa, - 0xb7, 0xc2, 0x58, 0x25, 0x92, 0x49, 0x1c, 0x46, 0xe2, 0x2f, 0x2d, 0x58, 0x96, 0x2c, 0x12, 0x6f, - 0xfe, 0xb1, 0x0a, 0x8d, 0x83, 0x34, 0xa0, 0x27, 0x34, 0x78, 0x4c, 0xdd, 0x80, 0x66, 0xe4, 0x0e, - 0x5c, 0xf3, 0x23, 0x37, 0x4e, 0x9d, 0x38, 0x68, 0x1a, 0xfb, 0x46, 0xbb, 0x66, 0x6f, 0xe0, 0xf9, - 0x20, 0x20, 0x04, 0xaa, 0x91, 0x9b, 0x47, 0xcd, 0xd5, 0x7d, 0xa3, 0xbd, 0x69, 0xe3, 0x6f, 0xf2, - 0x1e, 0xac, 0x47, 0x54, 0x84, 0x6d, 0x56, 0xf6, 0x8d, 0x76, 0xd5, 0x56, 0x27, 0xf2, 0x19, 0x54, - 0x85, 0xbe, 0xcd, 0xea, 0xbe, 0xd1, 0xae, 0xf7, 0x76, 0x2d, 0x29, 0xbe, 0xa5, 0xc5, 0xb7, 0x0e, - 0xb5, 0xf8, 0xfd, 0xea, 0xab, 0xbf, 0xf7, 0x0c, 0x1b, 0xd1, 0xc4, 0x82, 0x6d, 0xf5, 0x00, 0x27, - 0x42, 0x3a, 0x0e, 0x26, 0x5c, 0xc3, 0x84, 0x37, 0xd5, 0x95, 0x24, 0xfa, 0x58, 0x64, 0xef, 0xc1, - 0xad, 0x37, 0xf1, 0x92, 0xcc, 0x3a, 0x92, 0xd9, 0x5e, 0xf4, 0x90, 0xcc, 0xee, 0x41, 0x43, 0xfb, - 0xa0, 0x78, 0xcd, 0x0d, 0xc4, 0x6e, 0x2a, 0xe3, 0x43, 0x61, 0x23, 0xf7, 0xe1, 0x86, 0x06, 0xf1, - 0x13, 0x49, 0xe2, 0x1a, 0x92, 0xd0, 0xbe, 0x87, 0x27, 0x82, 0x80, 0xf9, 0x04, 0xd6, 0x1e, 0xb1, - 0xec, 0x28, 0x27, 0x5f, 0xc1, 0x86, 0x64, 0x90, 0x37, 0x2b, 0xfb, 0x95, 0x76, 0xbd, 0xf7, 0x81, - 0xb5, 0xac, 0x3f, 0xad, 0x05, 0xc1, 0x6d, 0xed, 0x67, 0xfe, 0x6b, 0x40, 0x6d, 0x80, 0x52, 0xa7, - 0x23, 0xf6, 0xb6, 0x3a, 0x7c, 0x07, 0x8d, 0xc4, 0xe5, 0x34, 0xe7, 0xea, 0xd1, 0x58, 0x90, 0x77, - 0xc8, 0xb8, 0x29, 0xbd, 0x55, 0xc1, 0xfb, 0xa0, 0xce, 0xce, 0x48, 0xbc, 0x04, 0xeb, 0x58, 0xef, - 0xed, 0x2d, 0x0f, 0x86, 0x0f, 0xb6, 0xeb, 0xd2, 0x49, 0xbe, 0xfe, 0x4b, 0xb8, 0x53, 0x4c, 0x13, - 0x0d, 0x14, 0xad, 0xdc, 0xf1, 0xd9, 0x71, 0xca, 0xb1, 0x05, 0xaa, 0xf6, 0xed, 0x12, 0x40, 0x66, - 0xce, 0x07, 0xe2, 0xda, 0xfc, 0xcd, 0x00, 0x52, 0x3c, 0xfb, 0x87, 0x98, 0x47, 0xdf, 0x8b, 0xa1, - 0x23, 0x7d, 0x00, 0xf5, 0xfe, 0x74, 0xc4, 0x50, 0x81, 0x7a, 0xef, 0xde, 0x72, 0x52, 0x45, 0x04, - 0xbb, 0xe6, 0x17, 0x1a, 0x3e, 0x85, 0x5b, 0x38, 0xc1, 0xba, 0x39, 0x62, 0x5d, 0x72, 0x29, 0xd8, - 0xfb, 0xd6, 0x7c, 0xe2, 0x2d, 0x39, 0xf1, 0x16, 0x26, 0x7f, 0x36, 0xc9, 0x6d, 0x82, 0x9e, 0x92, - 0xe9, 0x81, 0xec, 0x0a, 0x73, 0x0a, 0x0d, 0xcc, 0x63, 0xd3, 0x30, 0xce, 0xf9, 0xdb, 0x87, 0xe5, - 0xae, 0xe6, 0x9f, 0xba, 0x63, 0x8a, 0x09, 0x6b, 0x8a, 0xda, 0x53, 0x77, 0x4c, 0xc9, 0x47, 0x70, - 0x53, 0x5e, 0x07, 0x34, 0xf7, 0xb3, 0x78, 0xc2, 0x63, 0x96, 0xa2, 0xf4, 0x35, 0x7b, 0x0b, 0x2f, - 0xbe, 0x9e, 0xdb, 0xcd, 0xdf, 0x2b, 0x40, 0x1e, 0xc5, 0xa9, 0x9b, 0xc4, 0xa7, 0x34, 0xb8, 0x52, - 0x8b, 0x3c, 0x87, 0x9d, 0x91, 0x76, 0x70, 0x4a, 0x3a, 0xae, 0x5e, 0x5d, 0x47, 0x32, 0xba, 0x98, - 0xf1, 0x0b, 0x00, 0x14, 0x50, 0x06, 0xab, 0xa8, 0xd9, 0xd6, 0xc1, 0x8a, 0x5d, 0x34, 0xed, 0x5a, - 0x28, 0x98, 0x5d, 0x43, 0x93, 0xaa, 0xc5, 0xf5, 0xcc, 0x7d, 0xe9, 0xcc, 0xb7, 0x9a, 0x5a, 0x0d, - 0xf3, 0xae, 0x5d, 0xd8, 0x80, 0x22, 0x86, 0xed, 0xbe, 0x1c, 0x14, 0x36, 0xbb, 0x91, 0x95, 0x8f, - 0xe4, 0x39, 0x10, 0x8f, 0xfb, 0x4e, 0x7e, 0xec, 0x8d, 0xe3, 0x3c, 0x8f, 0x59, 0x2a, 0x96, 0x2a, - 0x6e, 0x8a, 0x72, 0xcc, 0xc5, 0xd5, 0x3c, 0xed, 0x5a, 0xc3, 0x02, 0xff, 0x2d, 0x9d, 0xd9, 0x5b, - 0x1e, 0xf7, 0x17, 0x2c, 0xe4, 0x1b, 0x58, 0xc3, 0xc2, 0xe3, 0x06, 0xa9, 0xf7, 0xba, 0xcb, 0x95, - 0xc2, 0x4e, 0xb9, 0x58, 0x15, 0x5b, 0xfa, 0x9b, 0xff, 0x19, 0xb0, 0x85, 0x10, 0x54, 0x62, 0x48, - 0xdd, 0x84, 0x06, 0xc4, 0x86, 0xc6, 0xd4, 0x4d, 0xe2, 0xc0, 0xe5, 0x2c, 0x73, 0x72, 0xca, 0x9b, - 0x06, 0xee, 0x8a, 0x4f, 0x96, 0x6b, 0xf0, 0x42, 0xc3, 0xc5, 0x64, 0xf4, 0x93, 0x5c, 0xb0, 0xde, - 0x2c, 0x62, 0x0c, 0x29, 0x27, 0x0f, 0x61, 0x4b, 0x36, 0x79, 0xa9, 0x32, 0x57, 0xe8, 0xef, 0xeb, - 0x93, 0x82, 0x1c, 0xd6, 0xe7, 0x09, 0x6c, 0x97, 0xc3, 0x4c, 0xdd, 0x04, 0x09, 0x56, 0x2e, 0x8f, - 0xb4, 0x35, 0x8f, 0xf4, 0xc2, 0x4d, 0x86, 0x94, 0x9b, 0xbf, 0xae, 0xc2, 0xed, 0x25, 0xf2, 0x90, - 0x21, 0x34, 0x65, 0x1e, 0xff, 0xf4, 0xc2, 0x58, 0x1a, 0x97, 0x27, 0xdb, 0x41, 0xe7, 0xc1, 0xe9, - 0xc2, 0x60, 0x92, 0x1f, 0x81, 0x94, 0xc9, 0xe7, 0xa8, 0xb6, 0x52, 0xe1, 0xc3, 0x4b, 0x4a, 0x58, - 0xaa, 0x4f, 0xf9, 0x29, 0xaa, 0x62, 0xbf, 0xe8, 0x15, 0xa2, 0x22, 0x8b, 0x66, 0xe1, 0x9c, 0x06, - 0x6a, 0xcb, 0x3f, 0x58, 0xde, 0x69, 0x87, 0x99, 0x9b, 0xe6, 0xae, 0x2f, 0x06, 0x18, 0xfb, 0x62, - 0xbb, 0x14, 0x5b, 0x47, 0x31, 0x7f, 0x86, 0x1b, 0xfd, 0xc3, 0x01, 0xaa, 0x33, 0xa4, 0xe1, 0x98, - 0xa6, 0x9c, 0x1c, 0x40, 0x5d, 0x34, 0xb6, 0xfe, 0x9a, 0xc8, 0x0e, 0x69, 0x97, 0xf3, 0x94, 0x3f, - 0xe3, 0xd3, 0xae, 0xd5, 0x3f, 0x1c, 0x68, 0x35, 0x46, 0xcc, 0x06, 0x8f, 0xfb, 0x6a, 0xbf, 0xf6, - 0x9f, 0xfd, 0x79, 0xd6, 0x32, 0x5e, 0x9f, 0xb5, 0x8c, 0x7f, 0xce, 0x5a, 0xc6, 0xab, 0xf3, 0xd6, - 0xca, 0xeb, 0xf3, 0xd6, 0xca, 0x5f, 0xe7, 0xad, 0x95, 0x9f, 0x3e, 0x0f, 0x63, 0x1e, 0x1d, 0x7b, - 0x96, 0xcf, 0xc6, 0x1d, 0x15, 0x19, 0xb7, 0x84, 0x3e, 0x74, 0x4e, 0xde, 0xf8, 0x27, 0x8c, 0xcf, - 0x26, 0x34, 0xf7, 0xd6, 0xf1, 0xfb, 0xfd, 0xe9, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4e, 0xd5, - 0x62, 0xb4, 0xaa, 0x09, 0x00, 0x00, + // 964 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xcf, 0xc6, 0x4e, 0xd2, 0x3c, 0xc7, 0x6d, 0x98, 0xa4, 0xd4, 0x0d, 0xc2, 0xb1, 0x5c, 0xa9, + 0xb8, 0x08, 0xd6, 0xb2, 0x81, 0x03, 0xdc, 0xb0, 0xd5, 0xd2, 0x14, 0x44, 0xd1, 0xda, 0x2d, 0x08, + 0x81, 0x56, 0xfb, 0x67, 0xbc, 0xbb, 0xca, 0x7a, 0xc7, 0xda, 0x9d, 0xb8, 0x71, 0x3e, 0x45, 0xbf, + 0x05, 0x5c, 0xf9, 0x00, 0xdc, 0x39, 0xf6, 0xc8, 0x0d, 0x94, 0x7c, 0x05, 0x2e, 0xdc, 0xd0, 0xbc, + 0x99, 0x59, 0xef, 0x26, 0x32, 0x49, 0x2f, 0xd1, 0xce, 0xcc, 0xef, 0xbd, 0xf7, 0x7b, 0xbf, 0xf7, + 0xc7, 0x81, 0x8f, 0x5c, 0xc7, 0x5d, 0xc4, 0x2c, 0xe9, 0x9e, 0xb1, 0x84, 0x7a, 0x2c, 0xf1, 0x22, + 0x9a, 0x06, 0xb4, 0x3b, 0xef, 0x95, 0x2f, 0xcc, 0x59, 0xca, 0x38, 0x23, 0x0d, 0x85, 0x36, 0xcb, + 0x8f, 0xf3, 0xde, 0xc1, 0x7e, 0xc0, 0x02, 0x86, 0xa0, 0xae, 0xf8, 0x92, 0xf8, 0x83, 0xc3, 0x80, + 0xb1, 0x20, 0xa6, 0x5d, 0x3c, 0xb9, 0x27, 0x93, 0x2e, 0x8f, 0xa6, 0x34, 0xe3, 0xce, 0x74, 0xa6, + 0x00, 0xef, 0x73, 0x9a, 0xf8, 0x34, 0x9d, 0x46, 0x09, 0xef, 0x7a, 0xe9, 0x62, 0xc6, 0x99, 0xc0, + 0xb2, 0x89, 0x7a, 0xce, 0xd9, 0xb9, 0xdc, 0xf3, 0x42, 0xea, 0x1d, 0xcf, 0x98, 0x40, 0xce, 0x7b, + 0xe5, 0x0b, 0x85, 0x7e, 0xa8, 0xd1, 0xcb, 0x97, 0x28, 0x09, 0x10, 0x1d, 0x67, 0xf6, 0x31, 0x5d, + 0x28, 0xdc, 0xa3, 0x95, 0xb8, 0x2b, 0x2e, 0xdb, 0x1a, 0x4a, 0x67, 0xcc, 0x0b, 0x15, 0x4a, 0x7f, + 0x2b, 0x8c, 0x59, 0x20, 0x19, 0x47, 0x41, 0x28, 0xfe, 0xd2, 0x9c, 0x65, 0xe1, 0x46, 0xe2, 0xdb, + 0xbf, 0xaf, 0x43, 0xfd, 0x28, 0xf1, 0xe9, 0x29, 0xf5, 0x9f, 0x52, 0xc7, 0xa7, 0x29, 0xb9, 0x0f, + 0xb7, 0xbc, 0xd0, 0x89, 0x12, 0x3b, 0xf2, 0x1b, 0x46, 0xcb, 0xe8, 0x6c, 0x5b, 0x5b, 0x78, 0x3e, + 0xf2, 0x09, 0x81, 0x6a, 0xe8, 0x64, 0x61, 0x63, 0xbd, 0x65, 0x74, 0x76, 0x2c, 0xfc, 0x26, 0xef, + 0xc2, 0x66, 0x48, 0x85, 0xdb, 0x46, 0xa5, 0x65, 0x74, 0xaa, 0x96, 0x3a, 0x91, 0x4f, 0xa1, 0x2a, + 0xf4, 0x6d, 0x54, 0x5b, 0x46, 0xa7, 0xd6, 0x3f, 0x30, 0xa5, 0xf8, 0xa6, 0x16, 0xdf, 0x1c, 0x6b, + 0xf1, 0x07, 0xd5, 0xd7, 0x7f, 0x1d, 0x1a, 0x16, 0xa2, 0x89, 0x09, 0x7b, 0x2a, 0x01, 0x3b, 0x44, + 0x3a, 0x36, 0x06, 0xdc, 0xc0, 0x80, 0xef, 0xa8, 0x27, 0x49, 0xf4, 0xa9, 0x88, 0xde, 0x87, 0xbb, + 0x97, 0xf1, 0x92, 0xcc, 0x26, 0x92, 0xd9, 0x2b, 0x5b, 0x48, 0x66, 0x0f, 0xa0, 0xae, 0x6d, 0x50, + 0xbc, 0xc6, 0x16, 0x62, 0x77, 0xd4, 0xe5, 0x63, 0x71, 0x47, 0x1e, 0xc2, 0x1d, 0x0d, 0xe2, 0xa7, + 0x92, 0xc4, 0x2d, 0x24, 0xa1, 0x6d, 0xc7, 0xa7, 0x82, 0x40, 0xfb, 0x19, 0x6c, 0x3c, 0x61, 0xe9, + 0x71, 0x46, 0xbe, 0x84, 0x2d, 0xc9, 0x20, 0x6b, 0x54, 0x5a, 0x95, 0x4e, 0xad, 0xff, 0x81, 0xb9, + 0xaa, 0x3f, 0xcd, 0x92, 0xe0, 0x96, 0xb6, 0x6b, 0xff, 0x63, 0xc0, 0xf6, 0x10, 0xa5, 0x4e, 0x26, + 0xec, 0xff, 0xea, 0xf0, 0x0d, 0xd4, 0x63, 0x87, 0xd3, 0x8c, 0xab, 0xa4, 0xb1, 0x20, 0x6f, 0x11, + 0x71, 0x47, 0x5a, 0xab, 0x82, 0x0f, 0x40, 0x9d, 0xed, 0x89, 0xc8, 0x04, 0xeb, 0x58, 0xeb, 0x1f, + 0xae, 0x76, 0x86, 0x09, 0x5b, 0x35, 0x69, 0x24, 0xb3, 0xff, 0x02, 0xee, 0xe7, 0xd3, 0x44, 0x7d, + 0x45, 0x2b, 0xb3, 0x3d, 0x76, 0x92, 0x70, 0x6c, 0x81, 0xaa, 0x75, 0xaf, 0x00, 0x90, 0x91, 0xb3, + 0xa1, 0x78, 0x6e, 0xff, 0x6a, 0x00, 0xc9, 0xd3, 0xfe, 0x3e, 0xe2, 0xe1, 0x77, 0x62, 0xe8, 0xc8, + 0x00, 0x40, 0xe5, 0x9f, 0x4c, 0x18, 0x2a, 0x50, 0xeb, 0x3f, 0x58, 0x4d, 0x2a, 0xf7, 0x60, 0x6d, + 0x7b, 0xb9, 0x86, 0xdf, 0xc2, 0x5d, 0x9c, 0x60, 0xdd, 0x1c, 0x91, 0x2e, 0xb9, 0x14, 0xec, 0x3d, + 0x73, 0x39, 0xf1, 0xa6, 0x9c, 0x78, 0x13, 0x83, 0x3f, 0x9f, 0x65, 0x16, 0x41, 0x4b, 0xc9, 0xf4, + 0x48, 0x76, 0x45, 0xfb, 0xb7, 0x0a, 0x90, 0x27, 0x51, 0xe2, 0xc4, 0xd1, 0x19, 0xf5, 0x6f, 0x54, + 0xaa, 0x17, 0xb0, 0x3f, 0xd1, 0x06, 0x76, 0x21, 0x9f, 0xf5, 0x9b, 0xe7, 0x43, 0x26, 0x57, 0x23, + 0x7e, 0x0e, 0x80, 0x89, 0x48, 0x67, 0x15, 0x35, 0x63, 0xda, 0x59, 0xbe, 0x13, 0xe6, 0x3d, 0x13, + 0x89, 0x5b, 0xdb, 0x78, 0xa5, 0x34, 0xb9, 0x9d, 0x3a, 0xaf, 0xec, 0xe5, 0x76, 0x51, 0x23, 0xba, + 0xec, 0x9e, 0xd2, 0x26, 0x12, 0x3e, 0x2c, 0xe7, 0xd5, 0x30, 0xbf, 0xb3, 0xea, 0x69, 0xf1, 0x48, + 0x5e, 0x00, 0x71, 0xb9, 0x67, 0x67, 0x27, 0xee, 0x34, 0xca, 0xb2, 0x88, 0x25, 0x62, 0xb9, 0xe1, + 0xc4, 0x16, 0x7d, 0x96, 0x57, 0xe4, 0xbc, 0x67, 0x8e, 0x72, 0xfc, 0xd7, 0x74, 0x61, 0xed, 0xba, + 0xdc, 0x2b, 0xdd, 0x90, 0xaf, 0x60, 0x03, 0x0b, 0x80, 0x93, 0x5c, 0xeb, 0xf7, 0x56, 0x2b, 0x85, + 0x15, 0xbb, 0x5a, 0x15, 0x4b, 0xda, 0xb7, 0xff, 0x35, 0x60, 0x17, 0x21, 0xa8, 0xc4, 0x88, 0x3a, + 0x31, 0xf5, 0x89, 0x05, 0xf5, 0xb9, 0x13, 0x47, 0xbe, 0xc3, 0x59, 0x6a, 0x67, 0x94, 0x37, 0x0c, + 0x9c, 0xd9, 0x8f, 0x57, 0x6b, 0xf0, 0x52, 0xc3, 0x45, 0x87, 0x0e, 0xe2, 0x4c, 0xb0, 0xde, 0xc9, + 0x7d, 0x8c, 0x28, 0x27, 0x8f, 0x61, 0x57, 0x36, 0x5b, 0xa1, 0x32, 0x37, 0xe8, 0xb3, 0xdb, 0xb3, + 0x9c, 0x1c, 0xd6, 0xe7, 0x19, 0xec, 0x15, 0xdd, 0xcc, 0x9d, 0x18, 0x09, 0x56, 0xae, 0xf7, 0xb4, + 0xbb, 0xf4, 0xf4, 0xd2, 0x89, 0x47, 0x94, 0xb7, 0x7f, 0x59, 0x87, 0x7b, 0x2b, 0xe4, 0x21, 0x23, + 0x68, 0xc8, 0x38, 0xde, 0xd9, 0x95, 0xf1, 0x30, 0xae, 0x0f, 0xb6, 0x8f, 0xc6, 0xc3, 0xb3, 0xd2, + 0x80, 0x90, 0x1f, 0x80, 0x14, 0xc9, 0x67, 0xa8, 0xb6, 0x52, 0xe1, 0xc3, 0x6b, 0x4a, 0x58, 0xa8, + 0x4f, 0x31, 0x15, 0x55, 0xb1, 0x9f, 0xf5, 0x28, 0x2b, 0xcf, 0xa2, 0x59, 0x38, 0xa7, 0xbe, 0xda, + 0xb6, 0x8f, 0x56, 0x77, 0xda, 0x38, 0x75, 0x92, 0xcc, 0xf1, 0x78, 0xc4, 0x64, 0x5f, 0xec, 0x15, + 0x7c, 0x6b, 0x2f, 0xed, 0x9f, 0xe0, 0xce, 0x60, 0x3c, 0x44, 0x75, 0x46, 0x34, 0x98, 0xd2, 0x84, + 0x93, 0x23, 0xa8, 0x89, 0xc6, 0xd6, 0x5b, 0x5d, 0x76, 0x48, 0xa7, 0x18, 0xa7, 0xf8, 0x73, 0x3a, + 0xef, 0x99, 0x83, 0xf1, 0x50, 0xab, 0x31, 0x61, 0x16, 0xb8, 0xdc, 0x53, 0x7b, 0x6e, 0xf0, 0xfc, + 0x8f, 0xf3, 0xa6, 0xf1, 0xe6, 0xbc, 0x69, 0xfc, 0x7d, 0xde, 0x34, 0x5e, 0x5f, 0x34, 0xd7, 0xde, + 0x5c, 0x34, 0xd7, 0xfe, 0xbc, 0x68, 0xae, 0xfd, 0xf8, 0x59, 0x10, 0xf1, 0xf0, 0xc4, 0x35, 0x3d, + 0x36, 0xed, 0x2a, 0xcf, 0xb8, 0x25, 0xf4, 0xa1, 0x7b, 0x7a, 0xe9, 0x9f, 0x21, 0xbe, 0x98, 0xd1, + 0xcc, 0xdd, 0xc4, 0xdf, 0xd1, 0x4f, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xdf, 0x50, 0x58, + 0x32, 0x09, 0x00, 0x00, } func (m *IndexedHeader) Marshal() (dAtA []byte, err error) { @@ -990,50 +922,6 @@ func (m *ChainInfoWithProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ChainRegister) 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 *ChainRegister) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ChainRegister) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ChainDescription) > 0 { - i -= len(m.ChainDescription) - copy(dAtA[i:], m.ChainDescription) - i = encodeVarintZoneconcierge(dAtA, i, uint64(len(m.ChainDescription))) - i-- - dAtA[i] = 0x1a - } - if len(m.ChainName) > 0 { - i -= len(m.ChainName) - copy(dAtA[i:], m.ChainName) - i = encodeVarintZoneconcierge(dAtA, i, uint64(len(m.ChainName))) - i-- - dAtA[i] = 0x12 - } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintZoneconcierge(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *FinalizedChainInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1388,27 +1276,6 @@ func (m *ChainInfoWithProof) Size() (n int) { return n } -func (m *ChainRegister) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovZoneconcierge(uint64(l)) - } - l = len(m.ChainName) - if l > 0 { - n += 1 + l + sovZoneconcierge(uint64(l)) - } - l = len(m.ChainDescription) - if l > 0 { - n += 1 + l + sovZoneconcierge(uint64(l)) - } - return n -} - func (m *FinalizedChainInfo) Size() (n int) { if m == nil { return 0 @@ -2165,152 +2032,6 @@ func (m *ChainInfoWithProof) Unmarshal(dAtA []byte) error { } return nil } -func (m *ChainRegister) 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 ErrIntOverflowZoneconcierge - } - 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: ChainRegister: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ChainRegister: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowZoneconcierge - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthZoneconcierge - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthZoneconcierge - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowZoneconcierge - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthZoneconcierge - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthZoneconcierge - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainDescription", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowZoneconcierge - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthZoneconcierge - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthZoneconcierge - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainDescription = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipZoneconcierge(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthZoneconcierge - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *FinalizedChainInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 From 873cfce1c0c35884c3480ea1e3e3a544b3004a20 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Fri, 15 Mar 2024 08:29:59 +0100 Subject: [PATCH 04/85] F/register codecs (#210) * Register zoneconcierge msg codecs * Register btcstkconsumer msg codecs --- x/btcstkconsumer/types/codec.go | 8 ++++++++ x/zoneconcierge/types/codec.go | 9 ++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/x/btcstkconsumer/types/codec.go b/x/btcstkconsumer/types/codec.go index 199b17fd8..3c8a23c41 100644 --- a/x/btcstkconsumer/types/codec.go +++ b/x/btcstkconsumer/types/codec.go @@ -9,11 +9,19 @@ import ( func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgUpdateParams{}, "btcstkconsumer/MsgUpdateParams", nil) + cdc.RegisterConcrete(&MsgRegisterChain{}, "btcstkconsumer/MsgRegisterChain", nil) } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { registry.RegisterImplementations((*sdk.Msg)(nil), &MsgUpdateParams{}, + &MsgRegisterChain{}, ) + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } + +var ( + Amino = codec.NewLegacyAmino() + ModuleCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) +) diff --git a/x/zoneconcierge/types/codec.go b/x/zoneconcierge/types/codec.go index c88ab8585..769e3c67d 100644 --- a/x/zoneconcierge/types/codec.go +++ b/x/zoneconcierge/types/codec.go @@ -3,13 +3,20 @@ package types import ( "github.com/cosmos/cosmos-sdk/codec" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/msgservice" ) -func RegisterCodec(_ *codec.LegacyAmino) {} +func RegisterCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgUpdateParams{}, "zoneconcierge/MsgUpdateParams", nil) +} func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgUpdateParams{}, + ) + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } From 7928f6634e74e971e10018f5d3cac8b7e9282400 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 20 Mar 2024 10:53:09 +0100 Subject: [PATCH 05/85] F/consumer FP registry (#216) * Add chain id to finality provider * Add finality provider registry * Update fps per chain id registry * Remove commented line * FP registers only non-canonical chains * Add FP registry test * Add registered chain check * Add registration check to fp registry test * Remove optional from chain id * Add own CZ chains FPs store * Store CZ chains FPs in their own store * Adjust names / tests * Refactor fp consumer registry * Adapt tests * Rename for clarity * Add FP CZ chains registry queries * Add FP consumer query tests * Adapt test * Add chain id to fp query response * Remove useless slash condition check * Improve error msg * Move type builder to types package --- go.mod | 43 +- go.sum | 80 +- proto/babylon/btcstaking/v1/btcstaking.proto | 5 +- proto/babylon/btcstaking/v1/tx.proto | 3 + proto/babylon/btcstkconsumer/v1/query.proto | 79 + proto/buf.lock | 4 +- testutil/datagen/btcstaking.go | 1 + x/btcstaking/keeper/keeper_test.go | 1 + x/btcstaking/keeper/msg_server.go | 9 +- x/btcstaking/types/btcstaking.pb.go | 212 +- x/btcstaking/types/errors.go | 1 + x/btcstaking/types/expected_keepers.go | 5 +- x/btcstaking/types/tx.pb.go | 214 +- .../keeper/finality_provider_registry.go | 99 + .../keeper/finality_provider_registry_test.go | 61 + x/btcstkconsumer/keeper/grpc_query.go | 60 +- x/btcstkconsumer/keeper/grpc_query_test.go | 169 +- x/btcstkconsumer/types/keys.go | 5 +- x/btcstkconsumer/types/query.go | 18 + x/btcstkconsumer/types/query.pb.go | 1892 +++++++++++++++-- x/btcstkconsumer/types/query.pb.gw.go | 202 ++ 21 files changed, 2780 insertions(+), 383 deletions(-) create mode 100644 x/btcstkconsumer/keeper/finality_provider_registry.go create mode 100644 x/btcstkconsumer/keeper/finality_provider_registry_test.go create mode 100644 x/btcstkconsumer/types/query.go diff --git a/go.mod b/go.mod index 5112e46da..bc6932357 100644 --- a/go.mod +++ b/go.mod @@ -18,8 +18,8 @@ require ( github.com/stretchr/testify v1.9.0 github.com/supranational/blst v0.3.11 google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/grpc v1.63.2 - google.golang.org/protobuf v1.33.0 + google.golang.org/grpc v1.64.0 + google.golang.org/protobuf v1.34.1 gopkg.in/yaml.v2 v2.4.0 ) @@ -44,6 +44,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 github.com/btcsuite/btcd/btcutil v1.1.5 github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 + github.com/bufbuild/buf v1.15.1 github.com/cosmos/cosmos-db v1.0.2 github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/gogoproto v1.4.12 @@ -53,6 +54,7 @@ require ( github.com/docker/docker v23.0.8+incompatible github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.4 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 github.com/hashicorp/go-metrics v0.5.3 github.com/jinzhu/copier v0.3.5 github.com/jsternberg/zap-logfmt v1.3.0 @@ -60,7 +62,9 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/vulpine-io/io-test v1.0.0 go.uber.org/zap v1.26.0 - google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de + golang.org/x/tools v0.20.0 + google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 ) require ( @@ -134,11 +138,10 @@ require ( ) require ( - cloud.google.com/go v0.112.0 // indirect - cloud.google.com/go/compute v1.24.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go v0.112.1 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect cloud.google.com/go/iam v1.1.6 // indirect - cloud.google.com/go/storage v1.36.0 // indirect + cloud.google.com/go/storage v1.38.0 // indirect cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/x/nft v0.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect @@ -185,8 +188,12 @@ require ( github.com/felixge/fgprof v0.9.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-chi/chi/v5 v5.0.8 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gofrs/uuid/v5 v5.0.0 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.2.0 // indirect @@ -199,7 +206,7 @@ require ( github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect + github.com/googleapis/gax-go/v2 v2.12.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.7.3 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect @@ -250,22 +257,22 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zondax/ledger-go v0.14.3 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect - go.opentelemetry.io/otel v1.22.0 // indirect - go.opentelemetry.io/otel/metric v1.22.0 // indirect - go.opentelemetry.io/otel/trace v1.22.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/sdk v1.22.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.24.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.20.0 // indirect - google.golang.org/api v0.162.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect + google.golang.org/api v0.169.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.1 // indirect pgregory.net/rapid v1.1.0 // indirect diff --git a/go.sum b/go.sum index fc46feea5..af13a9618 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -68,10 +68,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= @@ -171,8 +169,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= -cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg= +cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= @@ -364,8 +362,6 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -511,8 +507,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= @@ -730,8 +724,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= +github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -755,8 +749,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -1250,18 +1244,18 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= -go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= -go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1435,8 +1429,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1664,8 +1658,9 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1715,8 +1710,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.162.0 h1:Vhs54HkaEpkMBdgGdOT2P6F0csGG/vxDS0hWHJzmmps= -google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= +google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= +google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1725,8 +1720,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1836,10 +1829,10 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 h1:W5Xj/70xIA4x60O/IFyXivR5MGqblAb8R3w26pnD6No= +google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:mxSlqyb8ZAHsYDCfiXN1EDdNTdvjUJSLY+OnAUtYNYA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1881,8 +1874,9 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1900,8 +1894,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/proto/babylon/btcstaking/v1/btcstaking.proto b/proto/babylon/btcstaking/v1/btcstaking.proto index 04757d74b..2477d4c6b 100644 --- a/proto/babylon/btcstaking/v1/btcstaking.proto +++ b/proto/babylon/btcstaking/v1/btcstaking.proto @@ -32,7 +32,10 @@ message FinalityProvider { // slashed_btc_height indicates the BTC height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - uint64 slashed_btc_height = 7; + uint64 slashed_btc_height = 9; + // chain_id is the chain id of the chain the finality provider is operating on. + // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. + string chain_id = 10; } // FinalityProviderWithMeta wraps the FinalityProvider with metadata. diff --git a/proto/babylon/btcstaking/v1/tx.proto b/proto/babylon/btcstaking/v1/tx.proto index e2cdcbf6b..9ad4ad3de 100644 --- a/proto/babylon/btcstaking/v1/tx.proto +++ b/proto/babylon/btcstaking/v1/tx.proto @@ -51,6 +51,9 @@ message MsgCreateFinalityProvider { bytes btc_pk = 4 [ (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BIP340PubKey" ]; // pop is the proof of possession of btc_pk over the FP signer address. ProofOfPossessionBTC pop = 5; + // chain id is a registered CZ chain id, or Babylon's chain id. + // If it's empty, it's assumed to be Babylon's chain id + string chain_id = 7; } // MsgCreateFinalityProviderResponse is the response for MsgCreateFinalityProvider diff --git a/proto/babylon/btcstkconsumer/v1/query.proto b/proto/babylon/btcstkconsumer/v1/query.proto index 75f9e48af..1b0f276c4 100644 --- a/proto/babylon/btcstkconsumer/v1/query.proto +++ b/proto/babylon/btcstkconsumer/v1/query.proto @@ -4,7 +4,12 @@ package babylon.btcstkconsumer.v1; import "amino/amino.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; +import "cosmos_proto/cosmos.proto"; +import "cosmos/crypto/secp256k1/keys.proto"; +import "cosmos/staking/v1beta1/staking.proto"; import "cosmos/base/query/v1beta1/pagination.proto"; +import "babylon/btcstaking/v1/btcstaking.proto"; +import "babylon/btcstaking/v1/pop.proto"; import "babylon/btcstkconsumer/v1/btcstkconsumer.proto"; import "babylon/btcstkconsumer/v1/params.proto"; @@ -24,6 +29,16 @@ service Query { rpc ChainsRegistry(QueryChainsRegistryRequest) returns (QueryChainsRegistryResponse) { option (google.api.http).get = "/babylon/btcstkconsumer/v1/chains_registry"; } + + // FinalityProviders queries all finality providers for a given chain + rpc FinalityProviders(QueryFinalityProvidersRequest) returns (QueryFinalityProvidersResponse) { + option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_providers"; + } + + // FinalityProvider info about one finality provider + rpc FinalityProvider(QueryFinalityProviderRequest) returns (QueryFinalityProviderResponse) { + option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_providers/{fp_btc_pk_hex}/finality_provider"; + } } // QueryParamsRequest is request type for the Query/Params RPC method. @@ -59,3 +74,67 @@ message QueryChainsRegistryRequest { repeated string chain_ids = 1; } message QueryChainsRegistryResponse { repeated babylon.btcstkconsumer.v1.ChainRegister chains_register = 1; } + +// QueryFinalityProvidersRequest is the request type for the +// Query/FinalityProviders RPC method. +message QueryFinalityProvidersRequest { + string chain_id = 1; + // pagination defines an optional pagination for the request. + cosmos.base.query.v1beta1.PageRequest pagination = 2; +} + +// QueryFinalityProvidersResponse is the response type for the +// Query/FinalityProviders RPC method. +message QueryFinalityProvidersResponse { + // finality_providers contains all the finality providers + repeated FinalityProviderResponse finality_providers = 1; + + // pagination defines the pagination in the response. + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} + +// QueryFinalityProviderRequest requests information about a finality provider +message QueryFinalityProviderRequest { + // chain id is the chain id this finality provider is registered to + string chain_id = 1; + // fp_btc_pk_hex is the hex str of Bitcoin secp256k1 PK of the finality provider + string fp_btc_pk_hex = 2; +} + +// QueryFinalityProviderResponse contains information about a finality provider +message QueryFinalityProviderResponse { + // finality_provider contains the FinalityProvider + FinalityProviderResponse finality_provider = 1; +} + +// FinalityProviderResponse defines a finality provider with voting power information. +message FinalityProviderResponse { + // description defines the description terms for the finality provider. + cosmos.staking.v1beta1.Description description = 1; + // commission defines the commission rate of the finality provider. + string commission = 2 [ + (cosmos_proto.scalar) = "cosmos.Dec", + (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec" + ]; + // babylon_pk is the Babylon secp256k1 PK of this finality provider + string addr = 3 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + // btc_pk is the Bitcoin secp256k1 PK of this finality provider + // the PK follows encoding in BIP-340 spec + bytes btc_pk = 4 [ (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BIP340PubKey" ]; + // pop is the proof of possession of babylon_pk and btc_pk + btcstaking.v1.ProofOfPossessionBTC pop = 5; + // slashed_babylon_height indicates the Babylon height when + // the finality provider is slashed. + // if it's 0 then the finality provider is not slashed + uint64 slashed_babylon_height = 6; + // slashed_btc_height indicates the BTC height when + // the finality provider is slashed. + // if it's 0 then the finality provider is not slashed + uint64 slashed_btc_height = 7; + // height is the queried Babylon height + uint64 height = 8; + // voting_power is the voting power of this finality provider at the given height + uint64 voting_power = 9; + // chain_id is the chain id this finality provider is registered to + string chain_id = 10; +} diff --git a/proto/buf.lock b/proto/buf.lock index 3cbca79b9..10bb32ad9 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -19,8 +19,8 @@ deps: - remote: buf.build owner: cosmos repository: ibc - commit: b32ecf3ebbcb45f3b727ae95d9ea317d - digest: shake256:0010f681e8a1b37d5331dbd93fa07486572caaea564137fa040438e81c99b7f516adcef4991752972331771d95e757b794c4f28ffcd0f6c832f0793f8089f30d + commit: 266dbe8e0fc54582bc1b2cb572b4c9b8 + digest: shake256:1e6f8437985795b6244bc81e468af19a68140a5930ccda2cc592929e38ebbe3467f5462b8e896defe30baf74b3b7883d1e38a7b437c5e07db4fe40d0fcf437cf - remote: buf.build owner: cosmos repository: ics23 diff --git a/testutil/datagen/btcstaking.go b/testutil/datagen/btcstaking.go index 810be2364..60a6a30d0 100644 --- a/testutil/datagen/btcstaking.go +++ b/testutil/datagen/btcstaking.go @@ -75,6 +75,7 @@ func GenRandomFinalityProviderWithBTCBabylonSKs(r *rand.Rand, btcSK *btcec.Priva BtcPk: bip340PK, Addr: fpAddr.String(), Pop: pop, + ChainId: "", // TODO: parameterise }, nil } diff --git a/x/btcstaking/keeper/keeper_test.go b/x/btcstaking/keeper/keeper_test.go index 9659b9f5d..9a577a346 100644 --- a/x/btcstaking/keeper/keeper_test.go +++ b/x/btcstaking/keeper/keeper_test.go @@ -138,6 +138,7 @@ func (h *Helper) CreateFinalityProvider(r *rand.Rand) (*btcec.PrivateKey, *btcec Commission: fp.Commission, BtcPk: fp.BtcPk, Pop: fp.Pop, + ChainId: "", } _, err = h.MsgServer.CreateFinalityProvider(h.Ctx, &msgNewFp) diff --git a/x/btcstaking/keeper/msg_server.go b/x/btcstaking/keeper/msg_server.go index 2a97b6662..10067748c 100644 --- a/x/btcstaking/keeper/msg_server.go +++ b/x/btcstaking/keeper/msg_server.go @@ -86,6 +86,13 @@ func (ms msgServer) CreateFinalityProvider(goCtx context.Context, req *types.Msg return nil, types.ErrFpRegistered } + // Default chain id + chainID := req.GetChainId() + if chainID == "" { + // canonical chain id + chainID = ctx.ChainID() + } + // all good, add this finality provider fp := types.FinalityProvider{ Description: req.Description, @@ -93,8 +100,8 @@ func (ms msgServer) CreateFinalityProvider(goCtx context.Context, req *types.Msg Addr: fpAddr.String(), BtcPk: req.BtcPk, Pop: req.Pop, + ChainId: chainID, } - ms.SetFinalityProvider(ctx, &fp) // notify subscriber if err := ctx.EventManager().EmitTypedEvent(&types.EventNewFinalityProvider{Fp: &fp}); err != nil { diff --git a/x/btcstaking/types/btcstaking.pb.go b/x/btcstaking/types/btcstaking.pb.go index cd2d79f7e..7c66ad022 100644 --- a/x/btcstaking/types/btcstaking.pb.go +++ b/x/btcstaking/types/btcstaking.pb.go @@ -89,7 +89,10 @@ type FinalityProvider struct { // slashed_btc_height indicates the BTC height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - SlashedBtcHeight uint64 `protobuf:"varint,7,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` + SlashedBtcHeight uint64 `protobuf:"varint,9,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` + // chain_id is the chain id of the chain the finality provider is operating on. + // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. + ChainId string `protobuf:"bytes,10,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (m *FinalityProvider) Reset() { *m = FinalityProvider{} } @@ -160,6 +163,13 @@ func (m *FinalityProvider) GetSlashedBtcHeight() uint64 { return 0 } +func (m *FinalityProvider) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + // FinalityProviderWithMeta wraps the FinalityProvider with metadata. type FinalityProviderWithMeta struct { // btc_pk is the Bitcoin secp256k1 PK of thisfinality provider @@ -744,82 +754,83 @@ func init() { } var fileDescriptor_3851ae95ccfaf7db = []byte{ - // 1191 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x6f, 0x13, 0xc7, - 0x1b, 0xce, 0xda, 0x8e, 0x43, 0x5e, 0xdb, 0xc4, 0x0c, 0x21, 0x2c, 0x44, 0xbf, 0x24, 0x3f, 0x97, - 0xa2, 0xa8, 0x25, 0x36, 0x04, 0x5a, 0x95, 0x43, 0x0f, 0x71, 0x1c, 0x4a, 0x04, 0x04, 0x77, 0xed, - 0x50, 0xb5, 0x95, 0xba, 0x1a, 0xef, 0x4e, 0xd6, 0x23, 0xdb, 0x3b, 0xdb, 0x9d, 0xb1, 0xeb, 0x7c, - 0x83, 0x5e, 0x2a, 0xf5, 0xda, 0x7b, 0x3f, 0x02, 0x9f, 0xa1, 0xe2, 0x88, 0x38, 0x55, 0x39, 0x44, - 0x15, 0x9c, 0xfb, 0x1d, 0xaa, 0x99, 0x59, 0xef, 0xae, 0x29, 0xa1, 0x40, 0x72, 0xf3, 0xbc, 0xff, - 0x9e, 0x77, 0xde, 0xe7, 0xf1, 0x3b, 0x0b, 0xd7, 0x3b, 0xb8, 0x73, 0xd8, 0x67, 0x7e, 0xad, 0x23, - 0x1c, 0x2e, 0x70, 0x8f, 0xfa, 0x5e, 0x6d, 0x74, 0x2b, 0x75, 0xaa, 0x06, 0x21, 0x13, 0x0c, 0x5d, - 0x8a, 0xe2, 0xaa, 0x29, 0xcf, 0xe8, 0xd6, 0xd5, 0x45, 0x8f, 0x79, 0x4c, 0x45, 0xd4, 0xe4, 0x2f, - 0x1d, 0x7c, 0xf5, 0x8a, 0xc3, 0xf8, 0x80, 0x71, 0x5b, 0x3b, 0xf4, 0x21, 0x72, 0x5d, 0xd3, 0xa7, - 0x5a, 0x82, 0xd5, 0x21, 0x02, 0xdf, 0xaa, 0x4d, 0xa1, 0x5d, 0x5d, 0x7d, 0x73, 0x57, 0x01, 0x0b, - 0x74, 0x40, 0xe5, 0x59, 0x16, 0xca, 0xf7, 0xa8, 0x8f, 0xfb, 0x54, 0x1c, 0x36, 0x43, 0x36, 0xa2, - 0x2e, 0x09, 0xd1, 0x0d, 0xc8, 0x61, 0xd7, 0x0d, 0x4d, 0x63, 0xcd, 0x58, 0x9f, 0xaf, 0x9b, 0x2f, - 0x9e, 0x6e, 0x2c, 0x46, 0xd8, 0x5b, 0xae, 0x1b, 0x12, 0xce, 0x5b, 0x22, 0xa4, 0xbe, 0x67, 0xa9, - 0x28, 0xb4, 0x03, 0x05, 0x97, 0x70, 0x27, 0xa4, 0x81, 0xa0, 0xcc, 0x37, 0x33, 0x6b, 0xc6, 0x7a, - 0x61, 0xf3, 0xa3, 0x6a, 0x94, 0x91, 0xdc, 0x51, 0xf5, 0x57, 0x6d, 0x24, 0xa1, 0x56, 0x3a, 0x0f, - 0x3d, 0x02, 0x70, 0xd8, 0x60, 0x40, 0x39, 0x97, 0x55, 0xb2, 0x0a, 0x7a, 0xe3, 0xe8, 0x78, 0x75, - 0x59, 0x17, 0xe2, 0x6e, 0xaf, 0x4a, 0x59, 0x6d, 0x80, 0x45, 0xb7, 0xfa, 0x90, 0x78, 0xd8, 0x39, - 0x6c, 0x10, 0xe7, 0xc5, 0xd3, 0x0d, 0x88, 0x70, 0x1a, 0xc4, 0xb1, 0x52, 0x05, 0xd0, 0x23, 0xc8, - 0x77, 0x84, 0x63, 0x07, 0x3d, 0x33, 0xb7, 0x66, 0xac, 0x17, 0xeb, 0x9f, 0x1f, 0x1d, 0xaf, 0x6e, - 0x7a, 0x54, 0x74, 0x87, 0x9d, 0xaa, 0xc3, 0x06, 0xb5, 0x68, 0x30, 0x4e, 0x17, 0x53, 0x7f, 0x72, - 0xa8, 0x89, 0xc3, 0x80, 0xf0, 0x6a, 0x7d, 0xb7, 0x79, 0xfb, 0xce, 0xcd, 0xe6, 0xb0, 0xf3, 0x80, - 0x1c, 0x5a, 0xb3, 0x1d, 0xe1, 0x34, 0x7b, 0xe8, 0x4b, 0xc8, 0x06, 0x2c, 0x30, 0x67, 0xd5, 0xe5, - 0x3e, 0xad, 0xbe, 0x91, 0xc4, 0x6a, 0x33, 0x64, 0xec, 0xe0, 0xf1, 0x41, 0x93, 0x71, 0x4e, 0x54, - 0x17, 0xf5, 0xf6, 0xb6, 0x25, 0xf3, 0xd0, 0x1d, 0x58, 0xe2, 0x7d, 0xcc, 0xbb, 0xc4, 0xb5, 0xa3, - 0x54, 0xbb, 0x4b, 0xa8, 0xd7, 0x15, 0x66, 0x7e, 0xcd, 0x58, 0xcf, 0x59, 0x8b, 0x91, 0xb7, 0xae, - 0x9d, 0xf7, 0x95, 0x0f, 0xdd, 0x00, 0x14, 0x67, 0x09, 0x67, 0x92, 0x31, 0xa7, 0x32, 0xca, 0x93, - 0x0c, 0xe1, 0xe8, 0xe8, 0xca, 0xcf, 0x19, 0x30, 0x5f, 0xa7, 0xf2, 0x1b, 0x2a, 0xba, 0x8f, 0x88, - 0xc0, 0xa9, 0x71, 0x18, 0x67, 0x31, 0x8e, 0x25, 0xc8, 0x47, 0xdd, 0x64, 0x54, 0x37, 0xd1, 0x09, - 0xfd, 0x1f, 0x8a, 0x23, 0x26, 0xa8, 0xef, 0xd9, 0x01, 0xfb, 0x89, 0x84, 0x8a, 0xc6, 0x9c, 0x55, - 0xd0, 0xb6, 0xa6, 0x34, 0xbd, 0x65, 0x14, 0xb9, 0xf7, 0x1e, 0xc5, 0xec, 0x09, 0xa3, 0xf8, 0x3b, - 0x0f, 0xa5, 0x7a, 0x7b, 0xbb, 0x41, 0xfa, 0xc4, 0xc3, 0x4a, 0x5d, 0x77, 0xa1, 0x20, 0x89, 0x22, - 0xa1, 0xfd, 0x4e, 0xca, 0x06, 0x1d, 0x2c, 0x8d, 0xa9, 0xd1, 0x65, 0xce, 0x50, 0x49, 0xd9, 0x0f, - 0x54, 0xd2, 0xf7, 0x70, 0xfe, 0x20, 0xb0, 0x75, 0x43, 0x76, 0x9f, 0x72, 0x39, 0xb6, 0xec, 0x29, - 0xba, 0x2a, 0x1c, 0x04, 0x75, 0xd9, 0xd7, 0x43, 0xca, 0x15, 0x7d, 0x5c, 0xe0, 0x50, 0x4c, 0xcf, - 0xb7, 0xa0, 0x6c, 0x11, 0x11, 0xff, 0x03, 0x20, 0xbe, 0x3b, 0xad, 0xde, 0x79, 0xe2, 0xbb, 0x91, - 0x7b, 0x19, 0xe6, 0x05, 0x13, 0xb8, 0x6f, 0x73, 0x3c, 0x51, 0xea, 0x39, 0x65, 0x68, 0x61, 0x95, - 0x1b, 0xdd, 0xd1, 0x16, 0x63, 0xf3, 0x9c, 0x9c, 0xa6, 0x35, 0x1f, 0x59, 0xda, 0x63, 0xc5, 0x71, - 0xe4, 0x66, 0x43, 0x11, 0x0c, 0x85, 0x4d, 0xdd, 0xb1, 0x39, 0xbf, 0x66, 0xac, 0x97, 0xac, 0x72, - 0xe4, 0x79, 0xac, 0x1c, 0xbb, 0xee, 0x18, 0x6d, 0x42, 0x41, 0xf1, 0x1e, 0x55, 0x03, 0xc5, 0xcd, - 0x85, 0xa3, 0xe3, 0x55, 0xc9, 0x7c, 0x2b, 0xf2, 0xb4, 0xc7, 0x16, 0xf0, 0xf8, 0x37, 0xfa, 0x01, - 0x4a, 0xae, 0xd6, 0x04, 0x0b, 0x6d, 0x4e, 0x3d, 0xb3, 0xa0, 0xb2, 0xee, 0x1e, 0x1d, 0xaf, 0x7e, - 0xf6, 0x3e, 0xb3, 0x6b, 0x51, 0xcf, 0xc7, 0x62, 0x18, 0x12, 0xab, 0x18, 0xd7, 0x6b, 0x51, 0x0f, - 0xed, 0x43, 0xc9, 0x61, 0x23, 0xe2, 0x63, 0x5f, 0xc8, 0xf2, 0xdc, 0x2c, 0xae, 0x65, 0xd7, 0x0b, - 0x9b, 0x37, 0x4f, 0x60, 0x79, 0x3b, 0x8a, 0xdd, 0x72, 0x71, 0xa0, 0x2b, 0xe8, 0xaa, 0xdc, 0x2a, - 0x4e, 0xca, 0xb4, 0xa8, 0xc7, 0xd1, 0xc7, 0x70, 0x7e, 0xe8, 0x77, 0x98, 0xef, 0xaa, 0xbb, 0xd2, - 0x01, 0x31, 0x4b, 0x6a, 0x28, 0xa5, 0xd8, 0xda, 0xa6, 0x03, 0x82, 0xbe, 0x86, 0xb2, 0xd4, 0xc5, - 0xd0, 0x77, 0x63, 0xdd, 0x9b, 0xe7, 0x95, 0xcc, 0xae, 0x9f, 0xd0, 0x40, 0xbd, 0xbd, 0xbd, 0x9f, - 0x8a, 0xb6, 0x16, 0x3a, 0xc2, 0x49, 0x1b, 0x24, 0x72, 0x80, 0x43, 0x3c, 0xe0, 0xf6, 0x88, 0x84, - 0x6a, 0x31, 0x2f, 0x68, 0x64, 0x6d, 0x7d, 0xa2, 0x8d, 0x95, 0xdf, 0x72, 0xb0, 0xf0, 0x5a, 0x2d, - 0xa9, 0xa5, 0x54, 0xd3, 0x63, 0xbd, 0x77, 0xac, 0x42, 0xd2, 0xf2, 0xbf, 0x28, 0xcc, 0xbc, 0x0b, - 0x85, 0x3f, 0xc2, 0xe5, 0x84, 0xc2, 0x04, 0x40, 0x92, 0x99, 0x3d, 0x2d, 0x99, 0x97, 0xe2, 0xca, - 0xfb, 0x93, 0xc2, 0x92, 0x55, 0x06, 0x4b, 0x29, 0xd5, 0x4c, 0x1a, 0x96, 0x88, 0xb9, 0xd3, 0x22, - 0x2e, 0x26, 0xf2, 0x89, 0xea, 0x4a, 0xc0, 0x03, 0x58, 0x4a, 0x64, 0x94, 0xc2, 0xe3, 0xe6, 0xec, - 0x07, 0xea, 0x69, 0x31, 0xd6, 0x53, 0x02, 0xc3, 0x91, 0x03, 0xcb, 0x31, 0xce, 0xd4, 0x28, 0xf5, - 0x62, 0xc9, 0x2b, 0xb0, 0x6b, 0x27, 0x80, 0xc5, 0xd5, 0x77, 0xfd, 0x03, 0x66, 0x99, 0x93, 0x42, - 0xe9, 0xc9, 0xc9, 0x9d, 0x52, 0x69, 0xc1, 0xe5, 0x64, 0x15, 0xb3, 0x30, 0xd9, 0xc9, 0x1c, 0x7d, - 0x01, 0x39, 0x97, 0xf4, 0xb9, 0x69, 0xbc, 0x15, 0x68, 0x6a, 0x91, 0x5b, 0x2a, 0xa3, 0xb2, 0x07, - 0xcb, 0x6f, 0x2e, 0xba, 0xeb, 0xbb, 0x64, 0x8c, 0x6a, 0xb0, 0x98, 0x2c, 0x1a, 0xbb, 0x8b, 0x79, - 0x57, 0xdf, 0x48, 0x02, 0x15, 0xad, 0x0b, 0xf1, 0xca, 0xb9, 0x8f, 0x79, 0x57, 0x35, 0xf9, 0xbb, - 0x01, 0xa5, 0xa9, 0x0b, 0xa1, 0x7b, 0x90, 0x39, 0xf5, 0x63, 0x99, 0x09, 0x7a, 0xe8, 0x01, 0x64, - 0xa5, 0x52, 0x32, 0xa7, 0x55, 0x8a, 0xac, 0x52, 0xf9, 0xc5, 0x80, 0x2b, 0x27, 0x92, 0x2c, 0x1f, - 0x2a, 0x87, 0x8d, 0xce, 0xe0, 0x8d, 0x77, 0xd8, 0xa8, 0xd9, 0x93, 0x7f, 0x60, 0xac, 0x31, 0xb4, - 0xf6, 0x32, 0x6a, 0x78, 0x05, 0x1c, 0xe3, 0xf2, 0xca, 0x1f, 0x06, 0x5c, 0x69, 0x91, 0x3e, 0x71, - 0x04, 0x1d, 0x91, 0x89, 0xb4, 0x76, 0xe4, 0x97, 0x87, 0xef, 0x10, 0x74, 0x1d, 0x16, 0x5e, 0x63, - 0x41, 0xbf, 0xbb, 0x56, 0x69, 0x8a, 0x00, 0x64, 0xc1, 0x7c, 0xfc, 0xa4, 0x9d, 0xf2, 0x8d, 0x9d, - 0x8b, 0x5e, 0x33, 0xb4, 0x01, 0x17, 0x43, 0x22, 0x35, 0x19, 0x12, 0xd7, 0x8e, 0xaa, 0xf3, 0x9e, - 0x5e, 0x11, 0x56, 0x39, 0x76, 0xdd, 0x93, 0xe1, 0xad, 0xde, 0x27, 0x3b, 0x70, 0x71, 0x4a, 0x66, - 0x2d, 0x81, 0xc5, 0x90, 0xa3, 0x02, 0xcc, 0x35, 0x77, 0xf6, 0x1a, 0xbb, 0x7b, 0x5f, 0x95, 0x67, - 0x10, 0x40, 0x7e, 0x6b, 0xbb, 0xbd, 0xfb, 0x64, 0xa7, 0x6c, 0xa0, 0x22, 0x9c, 0xdb, 0xdf, 0xab, - 0x3f, 0xde, 0x6b, 0xec, 0x34, 0xca, 0x19, 0x34, 0x07, 0xd9, 0xad, 0xbd, 0x6f, 0xcb, 0xd9, 0xfa, - 0xc3, 0x67, 0x2f, 0x57, 0x8c, 0xe7, 0x2f, 0x57, 0x8c, 0xbf, 0x5e, 0xae, 0x18, 0xbf, 0xbe, 0x5a, - 0x99, 0x79, 0xfe, 0x6a, 0x65, 0xe6, 0xcf, 0x57, 0x2b, 0x33, 0xdf, 0xfd, 0xe7, 0x65, 0xc6, 0xe9, - 0x4f, 0x74, 0x75, 0xb3, 0x4e, 0x5e, 0x7d, 0xa2, 0xdf, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, 0xc9, - 0xf5, 0x0c, 0xdf, 0x5b, 0x0c, 0x00, 0x00, + // 1206 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xcf, 0xda, 0x8e, 0x93, 0x3c, 0xdb, 0x8d, 0x3b, 0x4d, 0xd3, 0x4d, 0x23, 0x92, 0x60, 0x4a, + 0x15, 0x41, 0x63, 0xb7, 0x69, 0x41, 0xf4, 0xc0, 0x21, 0x8e, 0x53, 0x6a, 0xb5, 0x4d, 0xcd, 0xda, + 0x29, 0x02, 0x24, 0x56, 0xe3, 0xdd, 0xc9, 0x7a, 0x64, 0x7b, 0x67, 0xd9, 0x19, 0x1b, 0xe7, 0x1b, + 0x70, 0x41, 0xe2, 0xca, 0x9d, 0x8f, 0xd0, 0xcf, 0x80, 0x38, 0x56, 0x3d, 0xa1, 0x1c, 0x22, 0xd4, + 0x9c, 0xf9, 0x0e, 0x68, 0x66, 0xd7, 0xbb, 0xeb, 0x92, 0x94, 0xb6, 0xce, 0xcd, 0xf3, 0xfe, 0xfd, + 0xde, 0xbc, 0xdf, 0xcf, 0x6f, 0x16, 0x6e, 0xb6, 0x71, 0xfb, 0xa8, 0xc7, 0xdc, 0x4a, 0x5b, 0x58, + 0x5c, 0xe0, 0x2e, 0x75, 0x9d, 0xca, 0xf0, 0x4e, 0xe2, 0x54, 0xf6, 0x7c, 0x26, 0x18, 0xba, 0x1a, + 0xc6, 0x95, 0x13, 0x9e, 0xe1, 0x9d, 0xeb, 0x4b, 0x0e, 0x73, 0x98, 0x8a, 0xa8, 0xc8, 0x5f, 0x41, + 0xf0, 0xf5, 0x15, 0x8b, 0xf1, 0x3e, 0xe3, 0x66, 0xe0, 0x08, 0x0e, 0xa1, 0xeb, 0x46, 0x70, 0xaa, + 0xc4, 0x58, 0x6d, 0x22, 0xf0, 0x9d, 0xca, 0x04, 0xda, 0xf5, 0xf5, 0xb3, 0xbb, 0xf2, 0x98, 0x17, + 0x04, 0x94, 0x4e, 0xd3, 0x50, 0x7c, 0x40, 0x5d, 0xdc, 0xa3, 0xe2, 0xa8, 0xe1, 0xb3, 0x21, 0xb5, + 0x89, 0x8f, 0x6e, 0x41, 0x06, 0xdb, 0xb6, 0xaf, 0x6b, 0x1b, 0xda, 0xe6, 0x42, 0x55, 0x7f, 0xf9, + 0x7c, 0x6b, 0x29, 0xc4, 0xde, 0xb1, 0x6d, 0x9f, 0x70, 0xde, 0x14, 0x3e, 0x75, 0x1d, 0x43, 0x45, + 0xa1, 0x3d, 0xc8, 0xd9, 0x84, 0x5b, 0x3e, 0xf5, 0x04, 0x65, 0xae, 0x9e, 0xda, 0xd0, 0x36, 0x73, + 0xdb, 0x1f, 0x95, 0xc3, 0x8c, 0xf8, 0x8e, 0xaa, 0xbf, 0x72, 0x2d, 0x0e, 0x35, 0x92, 0x79, 0xe8, + 0x09, 0x80, 0xc5, 0xfa, 0x7d, 0xca, 0xb9, 0xac, 0x92, 0x56, 0xd0, 0x5b, 0xc7, 0x27, 0xeb, 0xab, + 0x41, 0x21, 0x6e, 0x77, 0xcb, 0x94, 0x55, 0xfa, 0x58, 0x74, 0xca, 0x8f, 0x89, 0x83, 0xad, 0xa3, + 0x1a, 0xb1, 0x5e, 0x3e, 0xdf, 0x82, 0x10, 0xa7, 0x46, 0x2c, 0x23, 0x51, 0x00, 0x3d, 0x81, 0x6c, + 0x5b, 0x58, 0xa6, 0xd7, 0xd5, 0x33, 0x1b, 0xda, 0x66, 0xbe, 0xfa, 0xf9, 0xf1, 0xc9, 0xfa, 0xb6, + 0x43, 0x45, 0x67, 0xd0, 0x2e, 0x5b, 0xac, 0x5f, 0x09, 0x07, 0x63, 0x75, 0x30, 0x75, 0xc7, 0x87, + 0x8a, 0x38, 0xf2, 0x08, 0x2f, 0x57, 0xeb, 0x8d, 0xbb, 0xf7, 0x6e, 0x37, 0x06, 0xed, 0x47, 0xe4, + 0xc8, 0x98, 0x6d, 0x0b, 0xab, 0xd1, 0x45, 0x5f, 0x42, 0xda, 0x63, 0x9e, 0x3e, 0xab, 0x2e, 0xf7, + 0x69, 0xf9, 0x4c, 0x12, 0xcb, 0x0d, 0x9f, 0xb1, 0xc3, 0xa7, 0x87, 0x0d, 0xc6, 0x39, 0x51, 0x5d, + 0x54, 0x5b, 0xbb, 0x86, 0xcc, 0x43, 0xf7, 0x60, 0x99, 0xf7, 0x30, 0xef, 0x10, 0xdb, 0x0c, 0x53, + 0xcd, 0x0e, 0xa1, 0x4e, 0x47, 0xe8, 0xd9, 0x0d, 0x6d, 0x33, 0x63, 0x2c, 0x85, 0xde, 0x6a, 0xe0, + 0x7c, 0xa8, 0x7c, 0xe8, 0x16, 0xa0, 0x28, 0x4b, 0x58, 0xe3, 0x8c, 0x05, 0x95, 0x51, 0x1c, 0x67, + 0x08, 0x2b, 0x8c, 0x5e, 0x81, 0x79, 0x75, 0x1b, 0x93, 0xda, 0x3a, 0xc8, 0xf1, 0x19, 0x73, 0xea, + 0x5c, 0xb7, 0x4b, 0x3f, 0xa7, 0x40, 0x7f, 0x9d, 0xe5, 0x6f, 0xa8, 0xe8, 0x3c, 0x21, 0x02, 0x27, + 0x26, 0xa5, 0x5d, 0xc4, 0xa4, 0x96, 0x21, 0x1b, 0x36, 0x9a, 0x52, 0x8d, 0x86, 0x27, 0xf4, 0x21, + 0xe4, 0x87, 0x4c, 0x50, 0xd7, 0x31, 0x3d, 0xf6, 0x13, 0xf1, 0x15, 0xc3, 0x19, 0x23, 0x17, 0xd8, + 0x1a, 0xd2, 0xf4, 0x86, 0x29, 0x65, 0xde, 0x79, 0x4a, 0xb3, 0x67, 0x4f, 0xa9, 0xf4, 0x4f, 0x16, + 0x0a, 0xd5, 0xd6, 0x6e, 0x8d, 0xf4, 0x88, 0x83, 0x95, 0xf0, 0xee, 0x43, 0x4e, 0x72, 0x48, 0x7c, + 0xf3, 0xad, 0x44, 0x0f, 0x41, 0xb0, 0x34, 0x26, 0x46, 0x97, 0xba, 0x40, 0x91, 0xa5, 0xdf, 0x53, + 0x64, 0xdf, 0xc3, 0xa5, 0x43, 0xcf, 0x0c, 0x1a, 0x32, 0x7b, 0x94, 0xcb, 0xb1, 0xa5, 0xa7, 0xe8, + 0x2a, 0x77, 0xe8, 0x55, 0x65, 0x5f, 0x8f, 0x29, 0x57, 0xf4, 0x71, 0x81, 0x7d, 0x31, 0x39, 0xdf, + 0x9c, 0xb2, 0x85, 0x44, 0x7c, 0x00, 0x40, 0x5c, 0x7b, 0x52, 0xd8, 0x0b, 0xc4, 0xb5, 0x43, 0xf7, + 0x2a, 0x2c, 0x08, 0x26, 0x70, 0xcf, 0xe4, 0x58, 0xe8, 0x73, 0xca, 0x3b, 0xaf, 0x0c, 0x4d, 0xac, + 0x72, 0xc3, 0x3b, 0x9a, 0x62, 0xa4, 0xcf, 0xcb, 0x69, 0x1a, 0x0b, 0xa1, 0xa5, 0x35, 0x52, 0x1c, + 0x87, 0x6e, 0x36, 0x10, 0xde, 0x40, 0x98, 0xd4, 0x1e, 0xa9, 0x7f, 0x42, 0xc1, 0x28, 0x86, 0x9e, + 0xa7, 0xca, 0x51, 0xb7, 0x47, 0x68, 0x1b, 0x72, 0x8a, 0xf7, 0xb0, 0x1a, 0x28, 0x6e, 0x2e, 0x1f, + 0x9f, 0xac, 0x4b, 0xe6, 0x9b, 0xa1, 0xa7, 0x35, 0x32, 0x80, 0x47, 0xbf, 0xd1, 0x0f, 0x50, 0xb0, + 0x03, 0x4d, 0x30, 0xdf, 0xe4, 0xd4, 0xd1, 0x73, 0x2a, 0xeb, 0xfe, 0xf1, 0xc9, 0xfa, 0x67, 0xef, + 0x32, 0xbb, 0x26, 0x75, 0x5c, 0x2c, 0x06, 0x3e, 0x31, 0xf2, 0x51, 0xbd, 0x26, 0x75, 0xd0, 0x01, + 0x14, 0x2c, 0x36, 0x24, 0x2e, 0x76, 0x85, 0x2c, 0xcf, 0xf5, 0xfc, 0x46, 0x7a, 0x33, 0xb7, 0x7d, + 0xfb, 0x1c, 0x96, 0x77, 0xc3, 0xd8, 0x1d, 0x1b, 0x7b, 0x41, 0x85, 0xa0, 0x2a, 0x37, 0xf2, 0xe3, + 0x32, 0x4d, 0xea, 0x70, 0xf4, 0x31, 0x5c, 0x1a, 0xb8, 0x6d, 0xe6, 0xda, 0xea, 0xae, 0xb4, 0x4f, + 0xf4, 0x82, 0x1a, 0x4a, 0x21, 0xb2, 0xb6, 0x68, 0x9f, 0xa0, 0xaf, 0xa1, 0x28, 0x75, 0x31, 0x70, + 0xed, 0x48, 0xf7, 0xfa, 0x25, 0x25, 0xb3, 0x9b, 0xe7, 0x34, 0x50, 0x6d, 0xed, 0x1e, 0x24, 0xa2, + 0x8d, 0xc5, 0xb6, 0xb0, 0x92, 0x06, 0x89, 0xec, 0x61, 0x1f, 0xf7, 0xb9, 0x39, 0x24, 0xbe, 0xda, + 0xd9, 0x8b, 0x01, 0x72, 0x60, 0x7d, 0x16, 0x18, 0x4b, 0xbf, 0x65, 0x60, 0xf1, 0xb5, 0x5a, 0x52, + 0x4b, 0x89, 0xa6, 0x47, 0xc1, 0xde, 0x31, 0x72, 0x71, 0xcb, 0xff, 0xa1, 0x30, 0xf5, 0x36, 0x14, + 0xfe, 0x08, 0xd7, 0x62, 0x0a, 0x63, 0x00, 0x49, 0x66, 0x7a, 0x5a, 0x32, 0xaf, 0x46, 0x95, 0x0f, + 0xc6, 0x85, 0x25, 0xab, 0x0c, 0x96, 0x13, 0xaa, 0x19, 0x37, 0x2c, 0x11, 0x33, 0xd3, 0x22, 0x2e, + 0xc5, 0xf2, 0x09, 0xeb, 0x4a, 0xc0, 0x43, 0x58, 0x8e, 0x65, 0x94, 0xc0, 0xe3, 0xfa, 0xec, 0x7b, + 0xea, 0x69, 0x29, 0xd2, 0x53, 0x0c, 0xc3, 0x91, 0x05, 0xab, 0x11, 0xce, 0xc4, 0x28, 0x83, 0xc5, + 0x92, 0x55, 0x60, 0x37, 0xce, 0x01, 0x8b, 0xaa, 0xd7, 0xdd, 0x43, 0x66, 0xe8, 0xe3, 0x42, 0xc9, + 0xc9, 0xc9, 0x9d, 0x52, 0x6a, 0xc2, 0xb5, 0x78, 0x15, 0x33, 0x3f, 0xde, 0xc9, 0x1c, 0x7d, 0x01, + 0x19, 0x9b, 0xf4, 0xb8, 0xae, 0xbd, 0x11, 0x68, 0x62, 0x91, 0x1b, 0x2a, 0xa3, 0xb4, 0x0f, 0xab, + 0x67, 0x17, 0xad, 0xbb, 0x36, 0x19, 0xa1, 0x0a, 0x2c, 0xc5, 0x8b, 0xc6, 0xec, 0x60, 0xde, 0x09, + 0x6e, 0x24, 0x81, 0xf2, 0xc6, 0xe5, 0x68, 0xe5, 0x3c, 0xc4, 0xbc, 0xa3, 0x9a, 0xfc, 0x5d, 0x83, + 0xc2, 0xc4, 0x85, 0xd0, 0x03, 0x48, 0x4d, 0xfd, 0x58, 0xa6, 0xbc, 0x2e, 0x7a, 0x04, 0x69, 0xa9, + 0x94, 0xd4, 0xb4, 0x4a, 0x91, 0x55, 0x4a, 0xbf, 0x68, 0xb0, 0x72, 0x2e, 0xc9, 0xf2, 0xa1, 0xb2, + 0xd8, 0xf0, 0x02, 0xde, 0x78, 0x8b, 0x0d, 0x1b, 0x5d, 0xf9, 0x07, 0xc6, 0x01, 0x46, 0xa0, 0xbd, + 0x94, 0x1a, 0x5e, 0x0e, 0x47, 0xb8, 0xbc, 0xf4, 0x87, 0x06, 0x2b, 0x4d, 0xd2, 0x23, 0x96, 0xa0, + 0x43, 0x32, 0x96, 0xd6, 0x9e, 0xfc, 0xf2, 0x70, 0x2d, 0x82, 0x6e, 0xc2, 0xe2, 0x6b, 0x2c, 0x04, + 0xef, 0xae, 0x51, 0x98, 0x20, 0x00, 0x19, 0xb0, 0x10, 0x3d, 0x69, 0x53, 0xbe, 0xb1, 0x73, 0xe1, + 0x6b, 0x86, 0xb6, 0xe0, 0x8a, 0x4f, 0xa4, 0x26, 0x7d, 0x62, 0x9b, 0x61, 0x75, 0xde, 0x0d, 0x56, + 0x84, 0x51, 0x8c, 0x5c, 0x0f, 0x64, 0x78, 0xb3, 0xfb, 0xc9, 0x1e, 0x5c, 0x99, 0x90, 0x59, 0x53, + 0x60, 0x31, 0xe0, 0x28, 0x07, 0x73, 0x8d, 0xbd, 0xfd, 0x5a, 0x7d, 0xff, 0xab, 0xe2, 0x0c, 0x02, + 0xc8, 0xee, 0xec, 0xb6, 0xea, 0xcf, 0xf6, 0x8a, 0x1a, 0xca, 0xc3, 0xfc, 0xc1, 0x7e, 0xf5, 0xe9, + 0x7e, 0x6d, 0xaf, 0x56, 0x4c, 0xa1, 0x39, 0x48, 0xef, 0xec, 0x7f, 0x5b, 0x4c, 0x57, 0x1f, 0xff, + 0xf9, 0x6a, 0x4d, 0x7b, 0xf1, 0x6a, 0x4d, 0xfb, 0xfb, 0xd5, 0x9a, 0xf6, 0xeb, 0xe9, 0xda, 0xcc, + 0x8b, 0xd3, 0xb5, 0x99, 0xbf, 0x4e, 0xd7, 0x66, 0xbe, 0xfb, 0xdf, 0xcb, 0x8c, 0x92, 0x5f, 0xef, + 0xea, 0x66, 0xed, 0xac, 0xfa, 0x7a, 0xbf, 0xfb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc4, 0x63, + 0xb8, 0x38, 0x76, 0x0c, 0x00, 0x00, } func (m *FinalityProvider) Marshal() (dAtA []byte, err error) { @@ -842,10 +853,17 @@ func (m *FinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintBtcstaking(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0x52 + } if m.SlashedBtcHeight != 0 { i = encodeVarintBtcstaking(dAtA, i, uint64(m.SlashedBtcHeight)) i-- - dAtA[i] = 0x38 + dAtA[i] = 0x48 } if m.SlashedBabylonHeight != 0 { i = encodeVarintBtcstaking(dAtA, i, uint64(m.SlashedBabylonHeight)) @@ -1466,6 +1484,10 @@ func (m *FinalityProvider) Size() (n int) { if m.SlashedBtcHeight != 0 { n += 1 + sovBtcstaking(uint64(m.SlashedBtcHeight)) } + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovBtcstaking(uint64(l)) + } return n } @@ -1914,7 +1936,7 @@ func (m *FinalityProvider) Unmarshal(dAtA []byte) error { break } } - case 7: + case 9: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SlashedBtcHeight", wireType) } @@ -1933,6 +1955,38 @@ func (m *FinalityProvider) Unmarshal(dAtA []byte) error { break } } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBtcstaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthBtcstaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBtcstaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipBtcstaking(dAtA[iNdEx:]) diff --git a/x/btcstaking/types/errors.go b/x/btcstaking/types/errors.go index 5de1421d5..0e17eeb47 100644 --- a/x/btcstaking/types/errors.go +++ b/x/btcstaking/types/errors.go @@ -31,4 +31,5 @@ var ( ErrVotingPowerTableNotUpdated = errorsmod.Register(ModuleName, 1122, "voting power table has not been updated") ErrVotingPowerDistCacheNotFound = errorsmod.Register(ModuleName, 1123, "the voting power distribution cache is not found") ErrParamsNotFound = errorsmod.Register(ModuleName, 1124, "the parameters are not found") + ErrChainIDNotRegistered = errorsmod.Register(ModuleName, 1125, "CZ chain not registered") ) diff --git a/x/btcstaking/types/expected_keepers.go b/x/btcstaking/types/expected_keepers.go index a01632e19..a7e24a7aa 100644 --- a/x/btcstaking/types/expected_keepers.go +++ b/x/btcstaking/types/expected_keepers.go @@ -26,4 +26,7 @@ type CheckpointingKeeper interface { GetLastFinalizedEpoch(ctx context.Context) uint64 } -type BTCStkConsumerKeeper interface{} +type BTCStkConsumerKeeper interface { + IsChainRegistered(ctx context.Context, chainID string) bool + SetFinalityProvider(ctx context.Context, fp *FinalityProvider) +} diff --git a/x/btcstaking/types/tx.pb.go b/x/btcstaking/types/tx.pb.go index b2f595e61..7006b33b6 100644 --- a/x/btcstaking/types/tx.pb.go +++ b/x/btcstaking/types/tx.pb.go @@ -48,6 +48,9 @@ type MsgCreateFinalityProvider struct { BtcPk *github_com_babylonchain_babylon_types.BIP340PubKey `protobuf:"bytes,4,opt,name=btc_pk,json=btcPk,proto3,customtype=github.com/babylonchain/babylon/types.BIP340PubKey" json:"btc_pk,omitempty"` // pop is the proof of possession of btc_pk over the FP signer address. Pop *ProofOfPossessionBTC `protobuf:"bytes,5,opt,name=pop,proto3" json:"pop,omitempty"` + // chain id is a registered CZ chain id, or Babylon's chain id. + // If it's empty, it's assumed to be Babylon's chain id + ChainId string `protobuf:"bytes,7,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (m *MsgCreateFinalityProvider) Reset() { *m = MsgCreateFinalityProvider{} } @@ -104,6 +107,13 @@ func (m *MsgCreateFinalityProvider) GetPop() *ProofOfPossessionBTC { return nil } +func (m *MsgCreateFinalityProvider) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + // MsgCreateFinalityProviderResponse is the response for MsgCreateFinalityProvider type MsgCreateFinalityProviderResponse struct { } @@ -854,86 +864,87 @@ func init() { func init() { proto.RegisterFile("babylon/btcstaking/v1/tx.proto", fileDescriptor_4baddb53e97f38f2) } var fileDescriptor_4baddb53e97f38f2 = []byte{ - // 1259 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x6f, 0x13, 0x47, - 0x14, 0xcf, 0xda, 0x89, 0x69, 0x9e, 0xe3, 0x24, 0x5d, 0x42, 0xd8, 0x6c, 0xc1, 0x76, 0x0c, 0x85, - 0x40, 0xc9, 0x9a, 0x84, 0x82, 0x4a, 0x50, 0x0f, 0x38, 0x09, 0x02, 0x15, 0xab, 0xd6, 0xda, 0xe9, - 0xa1, 0x3d, 0x58, 0xeb, 0xdd, 0xc9, 0x7a, 0x64, 0x7b, 0x67, 0xb5, 0x33, 0xb1, 0x1c, 0x55, 0xaa, - 0x2a, 0xd4, 0x6b, 0xa5, 0x9e, 0x7a, 0xe8, 0xa7, 0xe0, 0xc0, 0x47, 0xa8, 0x2a, 0x8e, 0x88, 0x53, - 0x95, 0x43, 0x54, 0x41, 0x25, 0x3e, 0x41, 0xa5, 0xde, 0x5a, 0xed, 0xec, 0x5f, 0xbb, 0xde, 0x92, - 0x60, 0x6e, 0xde, 0x99, 0xdf, 0xfb, 0xbd, 0xf7, 0x7e, 0xef, 0xbd, 0x99, 0x31, 0xe4, 0x5b, 0x5a, - 0xeb, 0xb0, 0x4b, 0xac, 0x72, 0x8b, 0xe9, 0x94, 0x69, 0x1d, 0x6c, 0x99, 0xe5, 0xfe, 0x46, 0x99, - 0x0d, 0x14, 0xdb, 0x21, 0x8c, 0x88, 0xe7, 0xfc, 0x7d, 0x25, 0xda, 0x57, 0xfa, 0x1b, 0xf2, 0x92, - 0x49, 0x4c, 0xc2, 0x11, 0x65, 0xf7, 0x97, 0x07, 0x96, 0x57, 0x74, 0x42, 0x7b, 0x84, 0x36, 0xbd, - 0x0d, 0xef, 0xc3, 0xdf, 0x3a, 0xef, 0x7d, 0x95, 0x7b, 0x94, 0xf3, 0xf7, 0xa8, 0xe9, 0x6f, 0x94, - 0xc6, 0x07, 0x60, 0x6b, 0x8e, 0xd6, 0x0b, 0x8c, 0x6f, 0xc4, 0x30, 0x7a, 0x1b, 0xe9, 0x1d, 0x9b, - 0x60, 0x8b, 0xb9, 0xb0, 0xa1, 0x05, 0x1f, 0x7d, 0xd9, 0x77, 0x15, 0xb1, 0xb5, 0x10, 0xd3, 0x36, - 0x82, 0x6f, 0x1f, 0x55, 0x48, 0xf0, 0x4b, 0x6c, 0x0f, 0x50, 0xfa, 0x3b, 0x05, 0x2b, 0x55, 0x6a, - 0x6e, 0x3b, 0x48, 0x63, 0xe8, 0x01, 0xb6, 0xb4, 0x2e, 0x66, 0x87, 0x35, 0x87, 0xf4, 0xb1, 0x81, - 0x1c, 0xf1, 0x06, 0x4c, 0x6b, 0x86, 0xe1, 0x48, 0x42, 0x51, 0x58, 0x9b, 0xad, 0x48, 0x2f, 0x9f, - 0xad, 0x2f, 0xf9, 0xf9, 0xde, 0x37, 0x0c, 0x07, 0x51, 0x5a, 0x67, 0x0e, 0xb6, 0x4c, 0x95, 0xa3, - 0xc4, 0x5d, 0xc8, 0x1a, 0x88, 0xea, 0x0e, 0xb6, 0x19, 0x26, 0x96, 0x94, 0x2a, 0x0a, 0x6b, 0xd9, - 0xcd, 0x4b, 0x8a, 0x6f, 0x11, 0xe9, 0xca, 0x03, 0x55, 0x76, 0x22, 0xa8, 0x1a, 0xb7, 0x13, 0xab, - 0x00, 0x3a, 0xe9, 0xf5, 0x30, 0xa5, 0x2e, 0x4b, 0x9a, 0xbb, 0x5e, 0x3f, 0x3a, 0x2e, 0x7c, 0xe4, - 0x11, 0x51, 0xa3, 0xa3, 0x60, 0x52, 0xee, 0x69, 0xac, 0xad, 0x3c, 0x46, 0xa6, 0xa6, 0x1f, 0xee, - 0x20, 0xfd, 0xe5, 0xb3, 0x75, 0xf0, 0xfd, 0xec, 0x20, 0x5d, 0x8d, 0x11, 0x88, 0x55, 0xc8, 0xb4, - 0x98, 0xde, 0xb4, 0x3b, 0xd2, 0x74, 0x51, 0x58, 0x9b, 0xab, 0xdc, 0x39, 0x3a, 0x2e, 0x6c, 0x9a, - 0x98, 0xb5, 0x0f, 0x5a, 0x8a, 0x4e, 0x7a, 0x65, 0x5f, 0x21, 0xbd, 0xad, 0x61, 0x2b, 0xf8, 0x28, - 0xb3, 0x43, 0x1b, 0x51, 0xa5, 0xf2, 0xa8, 0x76, 0xeb, 0xd3, 0x9b, 0xb5, 0x83, 0xd6, 0x17, 0xe8, - 0x50, 0x9d, 0x69, 0x31, 0xbd, 0xd6, 0x11, 0x3f, 0x87, 0xb4, 0x4d, 0x6c, 0x69, 0x86, 0x27, 0xf7, - 0x89, 0x32, 0xb6, 0x71, 0x94, 0x9a, 0x43, 0xc8, 0xfe, 0x97, 0xfb, 0x35, 0x42, 0x29, 0xe2, 0x51, - 0x54, 0x1a, 0xdb, 0xaa, 0x6b, 0xb7, 0x35, 0xfb, 0xe4, 0xcd, 0xd3, 0xeb, 0x5c, 0xae, 0xd2, 0x25, - 0x58, 0x4d, 0x54, 0x5e, 0x45, 0xd4, 0x26, 0x16, 0x45, 0xa5, 0x7f, 0x04, 0x38, 0x5f, 0xa5, 0xe6, - 0xae, 0x81, 0xd9, 0x84, 0xd5, 0x39, 0x17, 0xea, 0xe0, 0x16, 0x66, 0x2e, 0xc8, 0x67, 0xa4, 0x68, - 0xe9, 0xf7, 0x52, 0xb4, 0xe9, 0x09, 0x8b, 0x16, 0x97, 0x69, 0x15, 0x0a, 0x09, 0x02, 0x84, 0x22, - 0xfd, 0x76, 0x06, 0x96, 0x43, 0x29, 0x2b, 0x8d, 0xed, 0x1d, 0xd4, 0x45, 0xa6, 0xc6, 0xe3, 0xba, - 0x0b, 0x59, 0x37, 0x07, 0xe4, 0x34, 0x4f, 0x24, 0x15, 0x78, 0x60, 0x77, 0x31, 0xa8, 0x74, 0xea, - 0xdd, 0x2a, 0x1d, 0xeb, 0xbb, 0xf4, 0xfb, 0xe8, 0xbb, 0x6f, 0x60, 0x7e, 0xdf, 0x6e, 0x7a, 0x8c, - 0xcd, 0x2e, 0xa6, 0x4c, 0x9a, 0x2e, 0xa6, 0x27, 0xa0, 0xcd, 0xee, 0xdb, 0x15, 0x97, 0xf8, 0x31, - 0xa6, 0x4c, 0x5c, 0x85, 0x39, 0x3f, 0xa7, 0x26, 0xc3, 0x3d, 0xc4, 0xbb, 0x3b, 0xa7, 0x66, 0xfd, - 0xb5, 0x06, 0xee, 0x21, 0xf1, 0x12, 0xe4, 0x02, 0x48, 0x5f, 0xeb, 0x1e, 0x20, 0x29, 0x53, 0x14, - 0xd6, 0xd2, 0x6a, 0x60, 0xf7, 0x95, 0xbb, 0x26, 0x3e, 0x04, 0x08, 0x79, 0x06, 0xd2, 0x19, 0xae, - 0xdc, 0xb5, 0xb8, 0x72, 0xb1, 0x63, 0xac, 0xbf, 0xa1, 0x34, 0x1c, 0xcd, 0xa2, 0x9a, 0xee, 0x16, - 0xea, 0x91, 0xb5, 0x4f, 0xd4, 0xd9, 0xc0, 0xe1, 0x40, 0xdc, 0x84, 0x2c, 0xed, 0x6a, 0xb4, 0xed, - 0x53, 0x7d, 0xc0, 0x25, 0xfc, 0xf0, 0xe8, 0xb8, 0x90, 0xab, 0x34, 0xb6, 0xeb, 0xfe, 0x4e, 0x63, - 0xa0, 0x02, 0x0d, 0x7f, 0x8b, 0x04, 0x96, 0x0d, 0xaf, 0xf2, 0xc4, 0x69, 0x86, 0xd6, 0x14, 0x9b, - 0xd2, 0x2c, 0x37, 0xbf, 0x7b, 0x74, 0x5c, 0xb8, 0x7d, 0x1a, 0xa9, 0xea, 0xd8, 0xb4, 0x34, 0x76, - 0xe0, 0x20, 0x75, 0x29, 0x24, 0x0e, 0x7c, 0xd7, 0xb1, 0x29, 0x7e, 0x0c, 0xf3, 0x07, 0x56, 0x8b, - 0x58, 0x46, 0x28, 0x1c, 0x70, 0xe1, 0x72, 0xe1, 0x2a, 0x97, 0x6e, 0x15, 0xe6, 0x62, 0xb0, 0x81, - 0x94, 0xe5, 0xf3, 0x97, 0x8d, 0x40, 0x03, 0xf1, 0x2a, 0x2c, 0x44, 0x10, 0x4f, 0xdf, 0x39, 0xae, - 0x6f, 0xe4, 0xc0, 0x53, 0x78, 0x17, 0xce, 0x45, 0xc0, 0xb8, 0x42, 0xb9, 0x24, 0x85, 0xce, 0x86, - 0xf8, 0x68, 0x51, 0x7c, 0x22, 0x40, 0x31, 0xd2, 0x6a, 0x0c, 0xa3, 0xab, 0xda, 0xfc, 0xa4, 0xaa, - 0x5d, 0x0c, 0x5d, 0xec, 0x8d, 0xc6, 0x50, 0xc7, 0xe6, 0xd6, 0xa2, 0x3b, 0xe4, 0xf1, 0xf1, 0x2c, - 0x15, 0x21, 0x3f, 0x7e, 0x8e, 0xc3, 0x51, 0xff, 0x2b, 0x05, 0x62, 0x95, 0x9a, 0xf7, 0x0d, 0x63, - 0x9b, 0xf4, 0x91, 0xa5, 0x59, 0xac, 0x8e, 0x4d, 0x2a, 0x2e, 0x43, 0x86, 0x62, 0xd3, 0x42, 0xfe, - 0x84, 0xab, 0xfe, 0x97, 0xf8, 0x00, 0x52, 0xc1, 0x81, 0xf7, 0xce, 0x93, 0x92, 0xb2, 0x3b, 0xe2, - 0x15, 0x58, 0x88, 0x1a, 0xbb, 0xd9, 0xd6, 0x68, 0xdb, 0xbb, 0x98, 0xd4, 0x5c, 0xd8, 0xb2, 0x0f, - 0x35, 0xda, 0x16, 0xd7, 0x60, 0x31, 0x56, 0x14, 0x57, 0x45, 0xea, 0xcd, 0xa9, 0x3a, 0x1f, 0x35, - 0x2a, 0x8f, 0x58, 0x87, 0xc5, 0x78, 0x53, 0x70, 0xc1, 0x67, 0x26, 0x15, 0x7c, 0x3e, 0xd6, 0x53, - 0x6e, 0x83, 0xde, 0x03, 0x39, 0x0c, 0x67, 0xd4, 0x1b, 0x95, 0x32, 0x3c, 0xb0, 0xf3, 0x01, 0x62, - 0x6f, 0xc8, 0x96, 0x6e, 0x65, 0xdd, 0xf2, 0xf8, 0x42, 0x96, 0x2e, 0x80, 0xfc, 0x5f, 0xd9, 0xc3, - 0xaa, 0xfc, 0x2a, 0xc0, 0x62, 0x95, 0x9a, 0x95, 0xc6, 0xf6, 0x9e, 0xe5, 0xd7, 0x1c, 0x25, 0xd6, - 0x64, 0x8c, 0x96, 0xa9, 0x71, 0x5a, 0x8e, 0x53, 0x28, 0xfd, 0x9e, 0x15, 0x1a, 0x4e, 0x52, 0x06, - 0x69, 0x34, 0x8b, 0x30, 0xc5, 0x5f, 0x04, 0xb8, 0x50, 0xa5, 0x66, 0x1d, 0x75, 0x91, 0xce, 0x70, - 0x1f, 0x05, 0x8d, 0xbc, 0xeb, 0x5e, 0x45, 0x96, 0x3e, 0x79, 0xba, 0xeb, 0x70, 0xd6, 0x41, 0x3a, - 0xe9, 0x23, 0x07, 0x19, 0x4d, 0xff, 0xa8, 0xa7, 0xfe, 0xe5, 0xa1, 0x2e, 0x86, 0x5b, 0x0f, 0xdc, - 0x63, 0xbb, 0xde, 0x19, 0x0e, 0xfc, 0x0a, 0x5c, 0xfe, 0xbf, 0xd8, 0xc2, 0x24, 0x7e, 0x16, 0x60, - 0xa1, 0x4a, 0xcd, 0x3d, 0xdb, 0xd0, 0x18, 0xaa, 0xf1, 0xc7, 0xa7, 0x78, 0x07, 0x66, 0xb5, 0x03, - 0xd6, 0x26, 0x0e, 0x66, 0x87, 0x6f, 0xbd, 0x1f, 0x23, 0xa8, 0x78, 0x0f, 0x32, 0xde, 0xf3, 0xd5, - 0xbf, 0x21, 0x2f, 0x26, 0xdd, 0x90, 0x1c, 0x54, 0x99, 0x7e, 0x7e, 0x5c, 0x98, 0x52, 0x7d, 0x93, - 0xad, 0x79, 0x37, 0xfa, 0x88, 0xac, 0xb4, 0xc2, 0x5f, 0x39, 0xf1, 0xb8, 0x82, 0x98, 0x37, 0xff, - 0xcc, 0x40, 0xba, 0x4a, 0x4d, 0xf1, 0x07, 0x01, 0x96, 0x13, 0x9e, 0xa9, 0x37, 0x13, 0x5c, 0x27, - 0x3e, 0xaf, 0xe4, 0xcf, 0x4e, 0x6b, 0x11, 0x84, 0x23, 0x7e, 0x07, 0x4b, 0x63, 0x1f, 0x63, 0x4a, - 0x32, 0xe3, 0x38, 0xbc, 0x7c, 0xe7, 0x74, 0xf8, 0xd0, 0xff, 0xb7, 0x70, 0x76, 0xdc, 0x3b, 0x67, - 0xfd, 0x6d, 0x09, 0x0d, 0xc1, 0xe5, 0xdb, 0xa7, 0x82, 0x87, 0xce, 0x09, 0x2c, 0x8c, 0x9e, 0xbc, - 0xd7, 0x92, 0x99, 0x46, 0xa0, 0xf2, 0xc6, 0x89, 0xa1, 0xa1, 0x43, 0x0c, 0xb9, 0xe1, 0x43, 0xe5, - 0x6a, 0x32, 0xc7, 0x10, 0x50, 0x2e, 0x9f, 0x10, 0x18, 0xba, 0xfa, 0x51, 0x80, 0x95, 0xe4, 0xe9, - 0xbe, 0x95, 0x4c, 0x97, 0x68, 0x24, 0xdf, 0x7b, 0x07, 0xa3, 0x30, 0x9e, 0x7d, 0x98, 0x1b, 0x9a, - 0xd3, 0x2b, 0xc9, 0x64, 0x71, 0x9c, 0xac, 0x9c, 0x0c, 0x17, 0xf8, 0x91, 0x67, 0xbe, 0x7f, 0xf3, - 0xf4, 0xba, 0x50, 0x79, 0xfc, 0xfc, 0x55, 0x5e, 0x78, 0xf1, 0x2a, 0x2f, 0xfc, 0xf1, 0x2a, 0x2f, - 0xfc, 0xf4, 0x3a, 0x3f, 0xf5, 0xe2, 0x75, 0x7e, 0xea, 0xf7, 0xd7, 0xf9, 0xa9, 0xaf, 0xdf, 0x7a, - 0x67, 0x0e, 0xe2, 0xff, 0x2e, 0xf9, 0xb1, 0xdb, 0xca, 0xf0, 0x7f, 0x97, 0xb7, 0xfe, 0x0d, 0x00, - 0x00, 0xff, 0xff, 0xf6, 0xe9, 0xb3, 0x62, 0x79, 0x0f, 0x00, 0x00, + // 1277 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6f, 0x13, 0xc7, + 0x17, 0xcf, 0xc6, 0x89, 0x21, 0xcf, 0x71, 0x92, 0xef, 0x10, 0x82, 0xb3, 0x5f, 0xb0, 0x1d, 0x43, + 0x21, 0x50, 0xb2, 0x26, 0xa1, 0xa0, 0x12, 0xd4, 0x03, 0x4e, 0x82, 0x40, 0xc5, 0xaa, 0xb5, 0x76, + 0x7a, 0x68, 0x0f, 0xd6, 0x7a, 0x77, 0xb2, 0x1e, 0xd9, 0xde, 0x59, 0xed, 0x4c, 0x2c, 0x47, 0x95, + 0xaa, 0x0a, 0xf5, 0x5a, 0xa9, 0x52, 0xa5, 0x1e, 0xfa, 0x57, 0x70, 0xe0, 0x4f, 0xa8, 0x2a, 0x8e, + 0x88, 0x53, 0x95, 0x43, 0x54, 0x41, 0x25, 0xfe, 0x82, 0x9e, 0x5b, 0xed, 0xec, 0x4f, 0xa7, 0xde, + 0x92, 0x60, 0x6e, 0xde, 0x99, 0xcf, 0xfb, 0xbc, 0xf7, 0x3e, 0xef, 0xbd, 0x99, 0x31, 0xe4, 0x5b, + 0x5a, 0xeb, 0xa0, 0x4b, 0xad, 0x72, 0x8b, 0xeb, 0x8c, 0x6b, 0x1d, 0x62, 0x99, 0xe5, 0xfe, 0x7a, + 0x99, 0x0f, 0x14, 0xdb, 0xa1, 0x9c, 0xa2, 0xf3, 0xfe, 0xbe, 0x12, 0xed, 0x2b, 0xfd, 0x75, 0x79, + 0xd1, 0xa4, 0x26, 0x15, 0x88, 0xb2, 0xfb, 0xcb, 0x03, 0xcb, 0xcb, 0x3a, 0x65, 0x3d, 0xca, 0x9a, + 0xde, 0x86, 0xf7, 0xe1, 0x6f, 0x5d, 0xf0, 0xbe, 0xca, 0x3d, 0x26, 0xf8, 0x7b, 0xcc, 0xf4, 0x37, + 0x4a, 0xa3, 0x03, 0xb0, 0x35, 0x47, 0xeb, 0x05, 0xc6, 0x37, 0x63, 0x18, 0xbd, 0x8d, 0xf5, 0x8e, + 0x4d, 0x89, 0xc5, 0x5d, 0xd8, 0xd0, 0x82, 0x8f, 0xbe, 0xe2, 0xbb, 0x8a, 0xd8, 0x5a, 0x98, 0x6b, + 0xeb, 0xc1, 0xb7, 0x8f, 0x2a, 0x24, 0xf8, 0xa5, 0xb6, 0x07, 0x28, 0xfd, 0x94, 0x82, 0xe5, 0x2a, + 0x33, 0xb7, 0x1c, 0xac, 0x71, 0xfc, 0x90, 0x58, 0x5a, 0x97, 0xf0, 0x83, 0x9a, 0x43, 0xfb, 0xc4, + 0xc0, 0x0e, 0xba, 0x09, 0x53, 0x9a, 0x61, 0x38, 0x39, 0xa9, 0x28, 0xad, 0xce, 0x54, 0x72, 0xaf, + 0x9e, 0xaf, 0x2d, 0xfa, 0xf9, 0x3e, 0x30, 0x0c, 0x07, 0x33, 0x56, 0xe7, 0x0e, 0xb1, 0x4c, 0x55, + 0xa0, 0xd0, 0x0e, 0x64, 0x0c, 0xcc, 0x74, 0x87, 0xd8, 0x9c, 0x50, 0x2b, 0x37, 0x59, 0x94, 0x56, + 0x33, 0x1b, 0x97, 0x15, 0xdf, 0x22, 0xd2, 0x55, 0x04, 0xaa, 0x6c, 0x47, 0x50, 0x35, 0x6e, 0x87, + 0xaa, 0x00, 0x3a, 0xed, 0xf5, 0x08, 0x63, 0x2e, 0x4b, 0x4a, 0xb8, 0x5e, 0x3b, 0x3c, 0x2a, 0xfc, + 0xdf, 0x23, 0x62, 0x46, 0x47, 0x21, 0xb4, 0xdc, 0xd3, 0x78, 0x5b, 0x79, 0x82, 0x4d, 0x4d, 0x3f, + 0xd8, 0xc6, 0xfa, 0xab, 0xe7, 0x6b, 0xe0, 0xfb, 0xd9, 0xc6, 0xba, 0x1a, 0x23, 0x40, 0x55, 0x48, + 0xb7, 0xb8, 0xde, 0xb4, 0x3b, 0xb9, 0xa9, 0xa2, 0xb4, 0x3a, 0x5b, 0xb9, 0x7b, 0x78, 0x54, 0xd8, + 0x30, 0x09, 0x6f, 0xef, 0xb7, 0x14, 0x9d, 0xf6, 0xca, 0xbe, 0x42, 0x7a, 0x5b, 0x23, 0x56, 0xf0, + 0x51, 0xe6, 0x07, 0x36, 0x66, 0x4a, 0xe5, 0x71, 0xed, 0xf6, 0x27, 0xb7, 0x6a, 0xfb, 0xad, 0xcf, + 0xf1, 0x81, 0x3a, 0xdd, 0xe2, 0x7a, 0xad, 0x83, 0x3e, 0x83, 0x94, 0x4d, 0xed, 0xdc, 0xb4, 0x48, + 0xee, 0x63, 0x65, 0x64, 0xe3, 0x28, 0x35, 0x87, 0xd2, 0xbd, 0x2f, 0xf6, 0x6a, 0x94, 0x31, 0x2c, + 0xa2, 0xa8, 0x34, 0xb6, 0x54, 0xd7, 0x0e, 0x2d, 0xc3, 0x59, 0xe1, 0xa9, 0x49, 0x8c, 0xdc, 0x19, + 0x37, 0x35, 0xf5, 0x8c, 0xf8, 0x7e, 0x6c, 0x6c, 0xce, 0x3c, 0x7d, 0xfb, 0xec, 0x86, 0x50, 0xb2, + 0x74, 0x19, 0x56, 0x12, 0x8b, 0xa2, 0x62, 0x66, 0x53, 0x8b, 0xe1, 0xd2, 0xdf, 0x12, 0x5c, 0xa8, + 0x32, 0x73, 0xc7, 0x20, 0x7c, 0xcc, 0xc2, 0x9d, 0x0f, 0x25, 0x72, 0x6b, 0x36, 0x1b, 0xa4, 0x7a, + 0xac, 0x9e, 0xa9, 0x0f, 0x52, 0xcf, 0xa9, 0x31, 0xeb, 0x19, 0x97, 0x69, 0x05, 0x0a, 0x09, 0x02, + 0x84, 0x22, 0xfd, 0x76, 0x06, 0x96, 0x42, 0x29, 0x2b, 0x8d, 0xad, 0x6d, 0xdc, 0xc5, 0xa6, 0x26, + 0xe2, 0xba, 0x07, 0x19, 0x37, 0x07, 0xec, 0x34, 0x4f, 0x24, 0x15, 0x78, 0x60, 0x77, 0x31, 0x68, + 0x82, 0xc9, 0xf7, 0x6c, 0x82, 0xa8, 0x25, 0x53, 0x1f, 0xa2, 0x25, 0xbf, 0x86, 0xb9, 0x3d, 0xbb, + 0xe9, 0x31, 0x36, 0xbb, 0x84, 0xf1, 0xdc, 0x54, 0x31, 0x35, 0x06, 0x6d, 0x66, 0xcf, 0xae, 0xb8, + 0xc4, 0x4f, 0x08, 0xe3, 0x68, 0x05, 0x66, 0xfd, 0x9c, 0x9a, 0x9c, 0xf4, 0xb0, 0x68, 0xfc, 0xac, + 0x9a, 0xf1, 0xd7, 0x1a, 0xa4, 0x87, 0xd1, 0x65, 0xc8, 0x06, 0x90, 0xbe, 0xd6, 0xdd, 0xc7, 0xb9, + 0x74, 0x51, 0x5a, 0x4d, 0xa9, 0x81, 0xdd, 0x97, 0xee, 0x1a, 0x7a, 0x04, 0x10, 0xf2, 0x0c, 0x44, + 0xeb, 0x67, 0x36, 0xae, 0xc7, 0x95, 0x8b, 0x9d, 0x70, 0xfd, 0x75, 0xa5, 0xe1, 0x68, 0x16, 0xd3, + 0x74, 0xb7, 0x50, 0x8f, 0xad, 0x3d, 0xaa, 0xce, 0x04, 0x0e, 0x07, 0x68, 0x03, 0x32, 0xac, 0xab, + 0xb1, 0xb6, 0x4f, 0x75, 0x56, 0x48, 0xf8, 0xbf, 0xc3, 0xa3, 0x42, 0xb6, 0xd2, 0xd8, 0xaa, 0xfb, + 0x3b, 0x8d, 0x81, 0x0a, 0x2c, 0xfc, 0x8d, 0x28, 0x2c, 0x19, 0x5e, 0xe5, 0xa9, 0xd3, 0x0c, 0xad, + 0x19, 0x31, 0x73, 0x33, 0xc2, 0xfc, 0xde, 0xe1, 0x51, 0xe1, 0xce, 0x69, 0xa4, 0xaa, 0x13, 0xd3, + 0xd2, 0xf8, 0xbe, 0x83, 0xd5, 0xc5, 0x90, 0x38, 0xf0, 0x5d, 0x27, 0x26, 0xfa, 0x08, 0xe6, 0xf6, + 0xad, 0x16, 0xb5, 0x8c, 0x50, 0x38, 0x10, 0xc2, 0x65, 0xc3, 0x55, 0x21, 0xdd, 0x0a, 0xcc, 0xc6, + 0x60, 0x83, 0x5c, 0x46, 0xcc, 0x5f, 0x26, 0x02, 0x0d, 0xd0, 0x35, 0x98, 0x8f, 0x20, 0x9e, 0xbe, + 0xb3, 0x42, 0xdf, 0xc8, 0x81, 0xa7, 0xf0, 0x0e, 0x9c, 0x8f, 0x80, 0x71, 0x85, 0xb2, 0x49, 0x0a, + 0x9d, 0x0b, 0xf1, 0xd1, 0x22, 0x7a, 0x2a, 0x41, 0x31, 0xd2, 0x6a, 0x04, 0xa3, 0xab, 0xda, 0xdc, + 0xb8, 0xaa, 0x5d, 0x0a, 0x5d, 0xec, 0x1e, 0x8f, 0xa1, 0x4e, 0xcc, 0xcd, 0x05, 0x77, 0xc8, 0xe3, + 0xe3, 0x59, 0x2a, 0x42, 0x7e, 0xf4, 0x1c, 0x87, 0xa3, 0xfe, 0xd7, 0x24, 0xa0, 0x2a, 0x33, 0x1f, + 0x18, 0xc6, 0x16, 0xed, 0x63, 0x4b, 0xb3, 0x78, 0x9d, 0x98, 0x0c, 0x2d, 0x41, 0x9a, 0x11, 0xd3, + 0xc2, 0xfe, 0x84, 0xab, 0xfe, 0x17, 0x7a, 0x08, 0x93, 0xc1, 0x81, 0xf7, 0xde, 0x93, 0x32, 0x69, + 0x77, 0xd0, 0x55, 0x98, 0x8f, 0x1a, 0xbb, 0xd9, 0xd6, 0x58, 0xdb, 0xbb, 0xb3, 0xd4, 0x6c, 0xd8, + 0xb2, 0x8f, 0x34, 0xd6, 0x46, 0xab, 0xb0, 0x10, 0x2b, 0x8a, 0xab, 0x22, 0xf3, 0xe6, 0x54, 0x9d, + 0x8b, 0x1a, 0x55, 0x44, 0xac, 0xc3, 0x42, 0xbc, 0x29, 0x84, 0xe0, 0xd3, 0xe3, 0x0a, 0x3e, 0x17, + 0xeb, 0x29, 0xb7, 0x41, 0xef, 0x83, 0x1c, 0x86, 0x73, 0xdc, 0x1b, 0xcb, 0xa5, 0x45, 0x60, 0x17, + 0x02, 0xc4, 0xee, 0x90, 0x2d, 0xdb, 0xcc, 0xb8, 0xe5, 0xf1, 0x85, 0x2c, 0x5d, 0x04, 0xf9, 0xdf, + 0xb2, 0x87, 0x55, 0xf9, 0x55, 0x82, 0x85, 0x2a, 0x33, 0x2b, 0x8d, 0xad, 0x5d, 0xcb, 0xaf, 0x39, + 0x4e, 0xac, 0xc9, 0x08, 0x2d, 0x27, 0x47, 0x69, 0x39, 0x4a, 0xa1, 0xd4, 0x07, 0x56, 0x68, 0x38, + 0x49, 0x19, 0x72, 0xc7, 0xb3, 0x08, 0x53, 0xfc, 0x45, 0x82, 0x8b, 0x55, 0x66, 0xd6, 0x71, 0x17, + 0xeb, 0x9c, 0xf4, 0x71, 0xd0, 0xc8, 0x3b, 0xee, 0x55, 0x64, 0xe9, 0xe3, 0xa7, 0xbb, 0x06, 0xe7, + 0x1c, 0xac, 0xd3, 0x3e, 0x76, 0xb0, 0xd1, 0xf4, 0x8f, 0x7a, 0xe6, 0x5f, 0x1e, 0xea, 0x42, 0xb8, + 0xf5, 0xd0, 0x3d, 0xb6, 0xeb, 0x9d, 0xe1, 0xc0, 0xaf, 0xc2, 0x95, 0xff, 0x8a, 0x2d, 0x4c, 0xe2, + 0x67, 0x09, 0xe6, 0xab, 0xcc, 0xdc, 0xb5, 0x0d, 0x8d, 0xe3, 0x9a, 0x78, 0x97, 0xa2, 0xbb, 0x30, + 0xa3, 0xed, 0xf3, 0x36, 0x75, 0x08, 0x3f, 0x78, 0xe7, 0xfd, 0x18, 0x41, 0xd1, 0x7d, 0x48, 0x7b, + 0x2f, 0x5b, 0xff, 0x86, 0xbc, 0x94, 0x74, 0x43, 0x0a, 0x50, 0x65, 0xea, 0xc5, 0x51, 0x61, 0x42, + 0xf5, 0x4d, 0x36, 0xe7, 0xdc, 0xe8, 0x23, 0xb2, 0xd2, 0xb2, 0x78, 0xe5, 0xc4, 0xe3, 0x0a, 0x62, + 0xde, 0xf8, 0x33, 0x0d, 0xa9, 0x2a, 0x33, 0xd1, 0xf7, 0x12, 0x2c, 0x25, 0xbc, 0x60, 0x6f, 0x25, + 0xb8, 0x4e, 0x7c, 0x5e, 0xc9, 0x9f, 0x9e, 0xd6, 0x22, 0x08, 0x07, 0x7d, 0x0b, 0x8b, 0x23, 0x1f, + 0x63, 0x4a, 0x32, 0xe3, 0x28, 0xbc, 0x7c, 0xf7, 0x74, 0xf8, 0xd0, 0xff, 0x37, 0x70, 0x6e, 0xd4, + 0x3b, 0x67, 0xed, 0x5d, 0x09, 0x0d, 0xc1, 0xe5, 0x3b, 0xa7, 0x82, 0x87, 0xce, 0x29, 0xcc, 0x1f, + 0x3f, 0x79, 0xaf, 0x27, 0x33, 0x1d, 0x83, 0xca, 0xeb, 0x27, 0x86, 0x86, 0x0e, 0x09, 0x64, 0x87, + 0x0f, 0x95, 0x6b, 0xc9, 0x1c, 0x43, 0x40, 0xb9, 0x7c, 0x42, 0x60, 0xe8, 0xea, 0x07, 0x09, 0x96, + 0x93, 0xa7, 0xfb, 0x76, 0x32, 0x5d, 0xa2, 0x91, 0x7c, 0xff, 0x3d, 0x8c, 0xc2, 0x78, 0xf6, 0x60, + 0x76, 0x68, 0x4e, 0xaf, 0x26, 0x93, 0xc5, 0x71, 0xb2, 0x72, 0x32, 0x5c, 0xe0, 0x47, 0x9e, 0xfe, + 0xee, 0xed, 0xb3, 0x1b, 0x52, 0xe5, 0xc9, 0x8b, 0xd7, 0x79, 0xe9, 0xe5, 0xeb, 0xbc, 0xf4, 0xc7, + 0xeb, 0xbc, 0xf4, 0xe3, 0x9b, 0xfc, 0xc4, 0xcb, 0x37, 0xf9, 0x89, 0xdf, 0xdf, 0xe4, 0x27, 0xbe, + 0x7a, 0xe7, 0x9d, 0x39, 0x88, 0xff, 0xf1, 0x14, 0xc7, 0x6e, 0x2b, 0x2d, 0xfe, 0x78, 0xde, 0xfe, + 0x27, 0x00, 0x00, 0xff, 0xff, 0x47, 0x71, 0x56, 0xef, 0x94, 0x0f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1268,6 +1279,13 @@ func (m *MsgCreateFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, erro _ = i var l int _ = l + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0x3a + } if m.Pop != nil { { size, err := m.Pop.MarshalToSizedBuffer(dAtA[:i]) @@ -1952,6 +1970,10 @@ func (m *MsgCreateFinalityProvider) Size() (n int) { l = m.Pop.Size() n += 1 + l + sovTx(uint64(l)) } + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } return n } @@ -2410,6 +2432,38 @@ func (m *MsgCreateFinalityProvider) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) diff --git a/x/btcstkconsumer/keeper/finality_provider_registry.go b/x/btcstkconsumer/keeper/finality_provider_registry.go new file mode 100644 index 000000000..3a68ed2dc --- /dev/null +++ b/x/btcstkconsumer/keeper/finality_provider_registry.go @@ -0,0 +1,99 @@ +package keeper + +import ( + "context" + errorsmod "cosmossdk.io/errors" + "github.com/babylonchain/babylon/types" + "github.com/cosmos/cosmos-sdk/runtime" + + "cosmossdk.io/store/prefix" + bbn "github.com/babylonchain/babylon/types" + btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" + btcstktypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +// SetFinalityProvider adds the given finality provider to CZ chains KVStore +func (k Keeper) SetFinalityProvider(ctx context.Context, fp *btcstaking.FinalityProvider) { + store := k.finalityProviderStore(ctx, fp.ChainId) + fpBytes := k.cdc.MustMarshal(fp) + store.Set(fp.BtcPk.MustMarshal(), fpBytes) +} + +// GetFinalityProvider gets the finality provider in the chain id with the given finality provider Bitcoin PK +func (k Keeper) GetFinalityProvider(ctx context.Context, chainID string, fpBTCPK *types.BIP340PubKey) (*btcstaking.FinalityProvider, error) { + if !k.HasFinalityProvider(ctx, chainID, fpBTCPK) { + return nil, btcstaking.ErrFpNotFound + } + store := k.finalityProviderStore(ctx, chainID) + fpBytes := store.Get(*fpBTCPK) + var fp btcstaking.FinalityProvider + k.cdc.MustUnmarshal(fpBytes, &fp) + return &fp, nil +} + +// HasFinalityProvider checks whether the finality provider exists and is registered for a given (registered) chain ID +func (k Keeper) HasFinalityProvider(ctx context.Context, chainID string, fpBTCPK *types.BIP340PubKey) bool { + store := k.finalityProviderStore(ctx, chainID) + return store.Has(*fpBTCPK) +} + +// IterateFPs iterates over all finality providers for a given chain +func (k Keeper) IterateFPs(ctx context.Context, chainId string, handler func(fp *btcstaking.FinalityProvider) bool) { + // filter out all finality providers with positive voting power + fpIter := k.finalityProviderStore(ctx, chainId).Iterator(nil, nil) + defer fpIter.Close() + for ; fpIter.Valid(); fpIter.Next() { + var fp btcstaking.FinalityProvider + k.cdc.MustUnmarshal(fpIter.Value(), &fp) + + shouldContinue := handler(&fp) + if !shouldContinue { + return + } + } +} + +// HasFPs checks if the FPs list exists for a given chain id +func (k Keeper) HasFPs(ctx context.Context, chainID string) bool { + store := k.finalityProviderStore(ctx, chainID) + iter := store.Iterator(nil, nil) + defer iter.Close() + return iter.Valid() +} + +// GetFPs gets the list of FPs, i.e., the finality provider set for a given chain id +func (k Keeper) GetFPs(ctx context.Context, chainID string) map[string]btcstaking.FinalityProvider { + store := k.finalityProviderStore(ctx, chainID) + iter := store.Iterator(nil, nil) + defer iter.Close() + + // if no finality provider for this chain id, return nil + if !iter.Valid() { + return nil + } + + // get all finality providers for this chain id + fpSet := map[string]btcstaking.FinalityProvider{} + for ; iter.Valid(); iter.Next() { + fpBTCPK, err := bbn.NewBIP340PubKey(iter.Key()) + if err != nil { + // failing to unmarshal finality provider BTC PK in KVStore is a programming error + panic(errorsmod.Wrapf(bbn.ErrUnmarshal, "Failed to unmarshall FP BTC PK %s: %v", iter.Key(), err)) + } + var fp btcstaking.FinalityProvider + k.cdc.MustUnmarshal(iter.Value(), &fp) + fpSet[fpBTCPK.MarshalHex()] = fp + } + + return fpSet +} + +// finalityProviderStore returns the KVStore of the finality provider set per chain +// prefix: FinalityProviderKey || chain id +// key: Bitcoin PubKey +// value: FinalityProvider +func (k Keeper) finalityProviderStore(ctx context.Context, chainID string) prefix.Store { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + fpStore := prefix.NewStore(storeAdapter, btcstktypes.FinalityProviderKey) + return prefix.NewStore(fpStore, []byte(chainID)) +} diff --git a/x/btcstkconsumer/keeper/finality_provider_registry_test.go b/x/btcstkconsumer/keeper/finality_provider_registry_test.go new file mode 100644 index 000000000..1b905a8cc --- /dev/null +++ b/x/btcstkconsumer/keeper/finality_provider_registry_test.go @@ -0,0 +1,61 @@ +package keeper_test + +import ( + btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" + "math/rand" + "testing" + + "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/testutil/datagen" + "github.com/stretchr/testify/require" +) + +func FuzzFPRegistry(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + bscKeeper := babylonApp.BTCStkConsumerKeeper + ctx := babylonApp.NewContext(false) + // Create a random chain id that starts with "test-" + czChainID := "test-" + datagen.GenRandomHexStr(r, 10) + + // check that the chain is not registered + isRegistered := bscKeeper.IsChainRegistered(ctx, czChainID) + require.False(t, isRegistered) + + // Create a random finality provider public key + fpBtcPk, err := datagen.GenRandomBIP340PubKey(r) + require.NoError(t, err) + + // Create a random chain name + czChainName := datagen.GenRandomHexStr(r, 5) + // Create a random chain description + czChainDesc := "Chain description: " + datagen.GenRandomHexStr(r, 15) + + // Populate ChainRegister object + chainRegister := &types.ChainRegister{ + ChainId: czChainID, + ChainName: czChainName, + ChainDescription: czChainDesc, + } + + // Register the chain + bscKeeper.SetChainRegister(ctx, chainRegister) + + // Now add a finality provider for the chain to the registry + + fp := btcstaking.FinalityProvider{ + BtcPk: fpBtcPk, + ChainId: czChainID, + } + bscKeeper.SetFinalityProvider(ctx, &fp) + + // Check that the finality provider is being registered + hasFP := bscKeeper.HasFinalityProvider(ctx, czChainID, fpBtcPk) + require.True(t, hasFP) + }) +} diff --git a/x/btcstkconsumer/keeper/grpc_query.go b/x/btcstkconsumer/keeper/grpc_query.go index 9cf740596..5c0fca00c 100644 --- a/x/btcstkconsumer/keeper/grpc_query.go +++ b/x/btcstkconsumer/keeper/grpc_query.go @@ -2,8 +2,11 @@ package keeper import ( "context" + errorsmod "cosmossdk.io/errors" + btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - bbntypes "github.com/babylonchain/babylon/types" + bbn "github.com/babylonchain/babylon/types" "github.com/babylonchain/babylon/x/btcstkconsumer/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" @@ -57,7 +60,7 @@ func (k Keeper) ChainsRegistry(c context.Context, req *types.QueryChainsRegistry } // return if chain IDs contain duplicates or empty strings - if err := bbntypes.CheckForDuplicatesAndEmptyStrings(req.ChainIds); err != nil { + if err := bbn.CheckForDuplicatesAndEmptyStrings(req.ChainIds); err != nil { return nil, status.Error(codes.InvalidArgument, types.ErrInvalidChainIDs.Wrap(err.Error()).Error()) } @@ -75,3 +78,56 @@ func (k Keeper) ChainsRegistry(c context.Context, req *types.QueryChainsRegistry resp := &types.QueryChainsRegistryResponse{ChainsRegister: chainsRegister} return resp, nil } + +// FinalityProviders returns a paginated list of all registered finality providers for a given chain +func (k Keeper) FinalityProviders(c context.Context, req *types.QueryFinalityProvidersRequest) (*types.QueryFinalityProvidersResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + + ctx := sdk.UnwrapSDKContext(c) + store := k.finalityProviderStore(ctx, req.ChainId) + + var fpResp []*types.FinalityProviderResponse + pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { + var fp btcstaking.FinalityProvider + if err := fp.Unmarshal(value); err != nil { + return err + } + + resp := types.NewFinalityProviderResponse(&fp) + fpResp = append(fpResp, resp) + return nil + }) + if err != nil { + return nil, err + } + + return &types.QueryFinalityProvidersResponse{FinalityProviders: fpResp, Pagination: pageRes}, nil +} + +// FinalityProvider returns the finality provider with the specified finality provider BTC PK +func (k Keeper) FinalityProvider(c context.Context, req *types.QueryFinalityProviderRequest) (*types.QueryFinalityProviderResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + + if len(req.FpBtcPkHex) == 0 { + return nil, errorsmod.Wrapf( + sdkerrors.ErrInvalidRequest, "finality provider BTC public key cannot be empty") + } + + fpPK, err := bbn.NewBIP340PubKeyFromHex(req.FpBtcPkHex) + if err != nil { + return nil, err + } + + ctx := sdk.UnwrapSDKContext(c) + fp, err := k.GetFinalityProvider(ctx, req.ChainId, fpPK) + if err != nil { + return nil, err + } + + fpResp := types.NewFinalityProviderResponse(fp) + return &types.QueryFinalityProviderResponse{FinalityProvider: fpResp}, nil +} diff --git a/x/btcstkconsumer/keeper/grpc_query_test.go b/x/btcstkconsumer/keeper/grpc_query_test.go index 74327199f..8fb9b982e 100644 --- a/x/btcstkconsumer/keeper/grpc_query_test.go +++ b/x/btcstkconsumer/keeper/grpc_query_test.go @@ -1,15 +1,19 @@ package keeper_test import ( + "errors" "math/rand" "testing" - "github.com/babylonchain/babylon/app" "github.com/cosmos/cosmos-sdk/types/query" + "github.com/stretchr/testify/require" + "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/testutil/datagen" - zctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" + + btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" ) type chainRegister struct { @@ -23,7 +27,7 @@ func FuzzChainRegistryList(f *testing.F) { r := rand.New(rand.NewSource(seed)) babylonApp := app.Setup(t, false) - zcKeeper := babylonApp.BTCStkConsumerKeeper + bscKeeper := babylonApp.BTCStkConsumerKeeper ctx := babylonApp.NewContext(false) // invoke the chain registration a random number of times with random chain IDs @@ -33,7 +37,7 @@ func FuzzChainRegistryList(f *testing.F) { var chainID = datagen.GenRandomHexStr(r, 30) allChainIDs = append(allChainIDs, chainID) - zcKeeper.SetChainRegister(ctx, &zctypes.ChainRegister{ + bscKeeper.SetChainRegister(ctx, &types.ChainRegister{ ChainId: chainID, ChainName: datagen.GenRandomHexStr(r, 5), }) @@ -42,7 +46,7 @@ func FuzzChainRegistryList(f *testing.F) { limit := datagen.RandomInt(r, len(allChainIDs)) + 1 // Query to get actual chain IDs - resp, err := zcKeeper.ChainRegistryList(ctx, &zctypes.QueryChainRegistryListRequest{ + resp, err := bscKeeper.ChainRegistryList(ctx, &types.QueryChainRegistryListRequest{ Pagination: &query.PageRequest{ Limit: limit, }, @@ -64,7 +68,7 @@ func FuzzChainsRegistry(f *testing.F) { r := rand.New(rand.NewSource(seed)) babylonApp := app.Setup(t, false) - zcKeeper := babylonApp.BTCStkConsumerKeeper + bscKeeper := babylonApp.BTCStkConsumerKeeper ctx := babylonApp.NewContext(false) var ( @@ -81,14 +85,14 @@ func FuzzChainsRegistry(f *testing.F) { chainID: chainID, }) - zcKeeper.SetChainRegister(ctx, &zctypes.ChainRegister{ + bscKeeper.SetChainRegister(ctx, &types.ChainRegister{ ChainId: chainID, ChainName: datagen.GenRandomHexStr(r, 5), }) } - resp, err := zcKeeper.ChainsRegistry(ctx, &zctypes.QueryChainsRegistryRequest{ + resp, err := bscKeeper.ChainsRegistry(ctx, &types.QueryChainsRegistryRequest{ ChainIds: chainIDs, }) require.NoError(t, err) @@ -98,3 +102,152 @@ func FuzzChainsRegistry(f *testing.F) { } }) } + +func FuzzFinalityProviders(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + bscKeeper := babylonApp.BTCStkConsumerKeeper + ctx := babylonApp.NewContext(false) + + // Generate random finality providers and add them to kv store under a chain id + chainID := datagen.GenRandomHexStr(r, 30) + fpsMap := make(map[string]*btcstaking.FinalityProvider) + for i := 0; i < int(datagen.RandomInt(r, 10)+1); i++ { + fp, err := datagen.GenRandomFinalityProvider(r) + require.NoError(t, err) + fp.ChainId = chainID + + bscKeeper.SetFinalityProvider(ctx, fp) + fpsMap[fp.BtcPk.MarshalHex()] = fp + } + numOfFpsInStore := len(fpsMap) + + // Test nil request + resp, err := bscKeeper.FinalityProviders(ctx, nil) + if resp != nil { + t.Errorf("Nil input led to a non-nil response") + } + if err == nil { + t.Errorf("Nil input led to a nil error") + } + + // Generate a page request with a limit and a nil key + limit := datagen.RandomInt(r, numOfFpsInStore) + 1 + pagination := constructRequestWithLimit(r, limit) + // Generate the initial query + req := types.QueryFinalityProvidersRequest{ChainId: chainID, Pagination: pagination} + // Construct a mapping from the finality providers found to a boolean value + // Will be used later to evaluate whether all the finality providers were returned + fpsFound := make(map[string]bool) + + for i := uint64(0); i < uint64(numOfFpsInStore); i += limit { + resp, err = bscKeeper.FinalityProviders(ctx, &req) + if err != nil { + t.Errorf("Valid request led to an error %s", err) + } + if resp == nil { + t.Fatalf("Valid request led to a nil response") + } + + for _, fp := range resp.FinalityProviders { + // Check if the pk exists in the map + if _, ok := fpsMap[fp.BtcPk.MarshalHex()]; !ok { + t.Fatalf("rpc returned a finality provider that was not created") + } + fpsFound[fp.BtcPk.MarshalHex()] = true + } + + // Construct the next page request + pagination = constructRequestWithKeyAndLimit(r, resp.Pagination.NextKey, limit) + req = types.QueryFinalityProvidersRequest{ChainId: chainID, Pagination: pagination} + } + + if len(fpsFound) != len(fpsMap) { + t.Errorf("Some finality providers were missed. Got %d while %d were expected", len(fpsFound), len(fpsMap)) + } + }) +} + +func FuzzFinalityProvider(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + bscKeeper := babylonApp.BTCStkConsumerKeeper + ctx := babylonApp.NewContext(false) + + // Generate random finality providers and add them to kv store under a chain id + fpsMap := make(map[string]*btcstaking.FinalityProvider) + chainID := datagen.GenRandomHexStr(r, 30) + var existingFp string + for i := 0; i < int(datagen.RandomInt(r, 10)+1); i++ { + fp, err := datagen.GenRandomFinalityProvider(r) + require.NoError(t, err) + fp.ChainId = chainID + + bscKeeper.SetFinalityProvider(ctx, fp) + existingFp = fp.BtcPk.MarshalHex() + fpsMap[existingFp] = fp + } + + // Test nil request + resp, err := bscKeeper.FinalityProvider(ctx, nil) + require.Error(t, err) + require.Nil(t, resp) + + for k, v := range fpsMap { + // Generate a request with a valid key + req := types.QueryFinalityProviderRequest{ChainId: chainID, FpBtcPkHex: k} + resp, err := bscKeeper.FinalityProvider(ctx, &req) + if err != nil { + t.Errorf("Valid request led to an error %s", err) + } + if resp == nil { + t.Fatalf("Valid request led to a nil response") + } + + // check keys from map matches those in returned response + require.Equal(t, v.BtcPk.MarshalHex(), resp.FinalityProvider.BtcPk.MarshalHex()) + require.Equal(t, v.Addr, resp.FinalityProvider.Addr) + } + + // check some random non-existing guy + fp, err := datagen.GenRandomFinalityProvider(r) + require.NoError(t, err) + req := types.QueryFinalityProviderRequest{ChainId: chainID, FpBtcPkHex: fp.BtcPk.MarshalHex()} + respNonExists, err := bscKeeper.FinalityProvider(ctx, &req) + require.Error(t, err) + require.Nil(t, respNonExists) + require.True(t, errors.Is(err, btcstaking.ErrFpNotFound)) + + // check some existing fp over a random non-existing chain-id + req = types.QueryFinalityProviderRequest{ChainId: "nonexistent", FpBtcPkHex: existingFp} + respNonExists, err = bscKeeper.FinalityProvider(ctx, &req) + require.Error(t, err) + require.Nil(t, respNonExists) + require.True(t, errors.Is(err, btcstaking.ErrFpNotFound)) + }) +} + +// Constructors for PageRequest objects +func constructRequestWithKeyAndLimit(r *rand.Rand, key []byte, limit uint64) *query.PageRequest { + // If the limit is 0, set one randomly + if limit == 0 { + limit = uint64(r.Int63() + 1) // Use Int63 instead of Uint64 to avoid overflows + } + return &query.PageRequest{ + Key: key, + Offset: 0, // only offset or key is set + Limit: limit, + CountTotal: false, // only used when offset is used + Reverse: false, + } +} + +func constructRequestWithLimit(r *rand.Rand, limit uint64) *query.PageRequest { + return constructRequestWithKeyAndLimit(r, nil, limit) +} diff --git a/x/btcstkconsumer/types/keys.go b/x/btcstkconsumer/types/keys.go index 044fe59e0..0cf142410 100644 --- a/x/btcstkconsumer/types/keys.go +++ b/x/btcstkconsumer/types/keys.go @@ -15,8 +15,9 @@ const ( ) var ( - ParamsKey = []byte("p_btcstkconsumer") - ChainRegisterKey = []byte{0x01} // ChainRegisterKey defines the key to store the chain register for each CZ in store + ParamsKey = []byte("p_btcstkconsumer") + ChainRegisterKey = []byte{0x01} // ChainRegisterKey defines the key to store the chain register for each CZ in store + FinalityProviderKey = []byte{0x02} // FinalityProviderKey defines the key to store the CZ finality providers ) func KeyPrefix(p string) []byte { diff --git a/x/btcstkconsumer/types/query.go b/x/btcstkconsumer/types/query.go new file mode 100644 index 000000000..fa6dfab79 --- /dev/null +++ b/x/btcstkconsumer/types/query.go @@ -0,0 +1,18 @@ +package types + +import btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" + +// NewFinalityProviderResponse creates a new finality provider response for CZ registered FPs. +// Note that slashing info, voting power and height are zero, as these FPs are not active here +func NewFinalityProviderResponse(f *btcstaking.FinalityProvider) *FinalityProviderResponse { + return &FinalityProviderResponse{ + Addr: f.Addr, + Description: f.Description, + Commission: f.Commission, + BtcPk: f.BtcPk, + Pop: f.Pop, + SlashedBabylonHeight: f.SlashedBabylonHeight, + SlashedBtcHeight: f.SlashedBtcHeight, + ChainId: f.ChainId, + } +} diff --git a/x/btcstkconsumer/types/query.pb.go b/x/btcstkconsumer/types/query.pb.go index 0fb0e5423..bb15bae85 100644 --- a/x/btcstkconsumer/types/query.pb.go +++ b/x/btcstkconsumer/types/query.pb.go @@ -5,9 +5,15 @@ package types import ( context "context" + cosmossdk_io_math "cosmossdk.io/math" fmt "fmt" + github_com_babylonchain_babylon_types "github.com/babylonchain/babylon/types" + types1 "github.com/babylonchain/babylon/x/btcstaking/types" + _ "github.com/cosmos/cosmos-proto" + _ "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" query "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + types "github.com/cosmos/cosmos-sdk/x/staking/types" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" @@ -305,6 +311,336 @@ func (m *QueryChainsRegistryResponse) GetChainsRegister() []*ChainRegister { return nil } +// QueryFinalityProvidersRequest is the request type for the +// Query/FinalityProviders RPC method. +type QueryFinalityProvidersRequest struct { + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // pagination defines an optional pagination for the request. + Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryFinalityProvidersRequest) Reset() { *m = QueryFinalityProvidersRequest{} } +func (m *QueryFinalityProvidersRequest) String() string { return proto.CompactTextString(m) } +func (*QueryFinalityProvidersRequest) ProtoMessage() {} +func (*QueryFinalityProvidersRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{6} +} +func (m *QueryFinalityProvidersRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryFinalityProvidersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryFinalityProvidersRequest.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 *QueryFinalityProvidersRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalityProvidersRequest.Merge(m, src) +} +func (m *QueryFinalityProvidersRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryFinalityProvidersRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalityProvidersRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryFinalityProvidersRequest proto.InternalMessageInfo + +func (m *QueryFinalityProvidersRequest) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +func (m *QueryFinalityProvidersRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +// QueryFinalityProvidersResponse is the response type for the +// Query/FinalityProviders RPC method. +type QueryFinalityProvidersResponse struct { + // finality_providers contains all the finality providers + FinalityProviders []*FinalityProviderResponse `protobuf:"bytes,1,rep,name=finality_providers,json=finalityProviders,proto3" json:"finality_providers,omitempty"` + // pagination defines the pagination in the response. + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryFinalityProvidersResponse) Reset() { *m = QueryFinalityProvidersResponse{} } +func (m *QueryFinalityProvidersResponse) String() string { return proto.CompactTextString(m) } +func (*QueryFinalityProvidersResponse) ProtoMessage() {} +func (*QueryFinalityProvidersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{7} +} +func (m *QueryFinalityProvidersResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryFinalityProvidersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryFinalityProvidersResponse.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 *QueryFinalityProvidersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalityProvidersResponse.Merge(m, src) +} +func (m *QueryFinalityProvidersResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryFinalityProvidersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalityProvidersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryFinalityProvidersResponse proto.InternalMessageInfo + +func (m *QueryFinalityProvidersResponse) GetFinalityProviders() []*FinalityProviderResponse { + if m != nil { + return m.FinalityProviders + } + return nil +} + +func (m *QueryFinalityProvidersResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + +// QueryFinalityProviderRequest requests information about a finality provider +type QueryFinalityProviderRequest struct { + // chain id is the chain id this finality provider is registered to + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // fp_btc_pk_hex is the hex str of Bitcoin secp256k1 PK of the finality provider + FpBtcPkHex string `protobuf:"bytes,2,opt,name=fp_btc_pk_hex,json=fpBtcPkHex,proto3" json:"fp_btc_pk_hex,omitempty"` +} + +func (m *QueryFinalityProviderRequest) Reset() { *m = QueryFinalityProviderRequest{} } +func (m *QueryFinalityProviderRequest) String() string { return proto.CompactTextString(m) } +func (*QueryFinalityProviderRequest) ProtoMessage() {} +func (*QueryFinalityProviderRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{8} +} +func (m *QueryFinalityProviderRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryFinalityProviderRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryFinalityProviderRequest.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 *QueryFinalityProviderRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalityProviderRequest.Merge(m, src) +} +func (m *QueryFinalityProviderRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryFinalityProviderRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalityProviderRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryFinalityProviderRequest proto.InternalMessageInfo + +func (m *QueryFinalityProviderRequest) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +func (m *QueryFinalityProviderRequest) GetFpBtcPkHex() string { + if m != nil { + return m.FpBtcPkHex + } + return "" +} + +// QueryFinalityProviderResponse contains information about a finality provider +type QueryFinalityProviderResponse struct { + // finality_provider contains the FinalityProvider + FinalityProvider *FinalityProviderResponse `protobuf:"bytes,1,opt,name=finality_provider,json=finalityProvider,proto3" json:"finality_provider,omitempty"` +} + +func (m *QueryFinalityProviderResponse) Reset() { *m = QueryFinalityProviderResponse{} } +func (m *QueryFinalityProviderResponse) String() string { return proto.CompactTextString(m) } +func (*QueryFinalityProviderResponse) ProtoMessage() {} +func (*QueryFinalityProviderResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{9} +} +func (m *QueryFinalityProviderResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryFinalityProviderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryFinalityProviderResponse.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 *QueryFinalityProviderResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalityProviderResponse.Merge(m, src) +} +func (m *QueryFinalityProviderResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryFinalityProviderResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalityProviderResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryFinalityProviderResponse proto.InternalMessageInfo + +func (m *QueryFinalityProviderResponse) GetFinalityProvider() *FinalityProviderResponse { + if m != nil { + return m.FinalityProvider + } + return nil +} + +// FinalityProviderResponse defines a finality provider with voting power information. +type FinalityProviderResponse struct { + // description defines the description terms for the finality provider. + Description *types.Description `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // commission defines the commission rate of the finality provider. + Commission *cosmossdk_io_math.LegacyDec `protobuf:"bytes,2,opt,name=commission,proto3,customtype=cosmossdk.io/math.LegacyDec" json:"commission,omitempty"` + // babylon_pk is the Babylon secp256k1 PK of this finality provider + Addr string `protobuf:"bytes,3,opt,name=addr,proto3" json:"addr,omitempty"` + // btc_pk is the Bitcoin secp256k1 PK of this finality provider + // the PK follows encoding in BIP-340 spec + BtcPk *github_com_babylonchain_babylon_types.BIP340PubKey `protobuf:"bytes,4,opt,name=btc_pk,json=btcPk,proto3,customtype=github.com/babylonchain/babylon/types.BIP340PubKey" json:"btc_pk,omitempty"` + // pop is the proof of possession of babylon_pk and btc_pk + Pop *types1.ProofOfPossessionBTC `protobuf:"bytes,5,opt,name=pop,proto3" json:"pop,omitempty"` + // slashed_babylon_height indicates the Babylon height when + // the finality provider is slashed. + // if it's 0 then the finality provider is not slashed + SlashedBabylonHeight uint64 `protobuf:"varint,6,opt,name=slashed_babylon_height,json=slashedBabylonHeight,proto3" json:"slashed_babylon_height,omitempty"` + // slashed_btc_height indicates the BTC height when + // the finality provider is slashed. + // if it's 0 then the finality provider is not slashed + SlashedBtcHeight uint64 `protobuf:"varint,7,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` + // height is the queried Babylon height + Height uint64 `protobuf:"varint,8,opt,name=height,proto3" json:"height,omitempty"` + // voting_power is the voting power of this finality provider at the given height + VotingPower uint64 `protobuf:"varint,9,opt,name=voting_power,json=votingPower,proto3" json:"voting_power,omitempty"` + // chain_id is the chain id this finality provider is registered to + ChainId string `protobuf:"bytes,10,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (m *FinalityProviderResponse) Reset() { *m = FinalityProviderResponse{} } +func (m *FinalityProviderResponse) String() string { return proto.CompactTextString(m) } +func (*FinalityProviderResponse) ProtoMessage() {} +func (*FinalityProviderResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{10} +} +func (m *FinalityProviderResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FinalityProviderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_FinalityProviderResponse.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 *FinalityProviderResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_FinalityProviderResponse.Merge(m, src) +} +func (m *FinalityProviderResponse) XXX_Size() int { + return m.Size() +} +func (m *FinalityProviderResponse) XXX_DiscardUnknown() { + xxx_messageInfo_FinalityProviderResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_FinalityProviderResponse proto.InternalMessageInfo + +func (m *FinalityProviderResponse) GetDescription() *types.Description { + if m != nil { + return m.Description + } + return nil +} + +func (m *FinalityProviderResponse) GetAddr() string { + if m != nil { + return m.Addr + } + return "" +} + +func (m *FinalityProviderResponse) GetPop() *types1.ProofOfPossessionBTC { + if m != nil { + return m.Pop + } + return nil +} + +func (m *FinalityProviderResponse) GetSlashedBabylonHeight() uint64 { + if m != nil { + return m.SlashedBabylonHeight + } + return 0 +} + +func (m *FinalityProviderResponse) GetSlashedBtcHeight() uint64 { + if m != nil { + return m.SlashedBtcHeight + } + return 0 +} + +func (m *FinalityProviderResponse) GetHeight() uint64 { + if m != nil { + return m.Height + } + return 0 +} + +func (m *FinalityProviderResponse) GetVotingPower() uint64 { + if m != nil { + return m.VotingPower + } + return 0 +} + +func (m *FinalityProviderResponse) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + func init() { proto.RegisterType((*QueryParamsRequest)(nil), "babylon.btcstkconsumer.v1.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "babylon.btcstkconsumer.v1.QueryParamsResponse") @@ -312,6 +648,11 @@ func init() { proto.RegisterType((*QueryChainRegistryListResponse)(nil), "babylon.btcstkconsumer.v1.QueryChainRegistryListResponse") proto.RegisterType((*QueryChainsRegistryRequest)(nil), "babylon.btcstkconsumer.v1.QueryChainsRegistryRequest") proto.RegisterType((*QueryChainsRegistryResponse)(nil), "babylon.btcstkconsumer.v1.QueryChainsRegistryResponse") + proto.RegisterType((*QueryFinalityProvidersRequest)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProvidersRequest") + proto.RegisterType((*QueryFinalityProvidersResponse)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProvidersResponse") + proto.RegisterType((*QueryFinalityProviderRequest)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderRequest") + proto.RegisterType((*QueryFinalityProviderResponse)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderResponse") + proto.RegisterType((*FinalityProviderResponse)(nil), "babylon.btcstkconsumer.v1.FinalityProviderResponse") } func init() { @@ -319,41 +660,74 @@ func init() { } var fileDescriptor_4e6c48e60b6a8bd8 = []byte{ - // 545 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x4f, 0x6b, 0x13, 0x41, - 0x18, 0xc6, 0x33, 0x55, 0x83, 0x99, 0x42, 0xa5, 0x63, 0x0f, 0xba, 0xd5, 0x55, 0x17, 0xac, 0x21, - 0xe8, 0x8c, 0x89, 0x18, 0xec, 0xb5, 0x8a, 0x22, 0x78, 0x48, 0xf7, 0xa8, 0x87, 0x30, 0xbb, 0x1d, - 0xb6, 0x8b, 0xd9, 0x9d, 0xed, 0xcc, 0x24, 0x98, 0xab, 0x07, 0xcf, 0x82, 0x1f, 0x40, 0xf0, 0xe4, - 0x51, 0xf0, 0x0b, 0x78, 0xec, 0xb1, 0xe0, 0xc5, 0x93, 0x48, 0x22, 0xf8, 0x35, 0x64, 0x67, 0xa6, - 0x36, 0x9b, 0x66, 0x93, 0xd8, 0x4b, 0x58, 0xde, 0x79, 0x9e, 0xf7, 0xfd, 0xbd, 0x7f, 0x08, 0xbc, - 0x1d, 0xd0, 0x60, 0xd8, 0xe3, 0x29, 0x09, 0x54, 0x28, 0xd5, 0xeb, 0x90, 0xa7, 0xb2, 0x9f, 0x30, - 0x41, 0x06, 0x4d, 0x72, 0xd0, 0x67, 0x62, 0x88, 0x33, 0xc1, 0x15, 0x47, 0x57, 0xad, 0x0c, 0x17, - 0x65, 0x78, 0xd0, 0x74, 0xd6, 0x69, 0x12, 0xa7, 0x9c, 0xe8, 0x5f, 0xa3, 0x76, 0x36, 0x22, 0x1e, - 0x71, 0xfd, 0x49, 0xf2, 0x2f, 0x1b, 0xbd, 0x16, 0x71, 0x1e, 0xf5, 0x18, 0xa1, 0x59, 0x4c, 0x68, - 0x9a, 0x72, 0x45, 0x55, 0xcc, 0x53, 0x69, 0x5f, 0x1b, 0x21, 0x97, 0x09, 0x97, 0x24, 0xa0, 0x92, - 0x99, 0xd2, 0x64, 0xd0, 0x0c, 0x98, 0xa2, 0x4d, 0x92, 0xd1, 0x28, 0x4e, 0xb5, 0xd8, 0x6a, 0x71, - 0x39, 0xf4, 0x14, 0x9f, 0xd1, 0x6f, 0x95, 0xeb, 0x33, 0x2a, 0x68, 0x62, 0x19, 0xbc, 0x0d, 0x88, - 0x76, 0xf3, 0xca, 0x1d, 0x1d, 0xf4, 0xd9, 0x41, 0x9f, 0x49, 0xe5, 0xbd, 0x82, 0x97, 0x0b, 0x51, - 0x99, 0xf1, 0x54, 0x32, 0xf4, 0x04, 0x56, 0x8d, 0xf9, 0x0a, 0xb8, 0x09, 0xea, 0xab, 0xad, 0x5b, - 0xb8, 0x74, 0x46, 0xd8, 0x58, 0x77, 0x6a, 0x87, 0x3f, 0x6f, 0x54, 0x3e, 0xff, 0xf9, 0xd2, 0x00, - 0xbe, 0xf5, 0x7a, 0x11, 0xbc, 0xae, 0x93, 0x3f, 0xde, 0xa7, 0x71, 0xea, 0xb3, 0x28, 0x96, 0x4a, - 0x0c, 0x5f, 0xc4, 0x52, 0xd9, 0xea, 0xe8, 0x29, 0x84, 0x27, 0xfd, 0xdb, 0x52, 0x5b, 0xd8, 0x0c, - 0x0b, 0xe7, 0xc3, 0xc2, 0x66, 0x4f, 0x76, 0x58, 0xb8, 0x43, 0x23, 0x66, 0xbd, 0xfe, 0x84, 0xd3, - 0x7b, 0x07, 0xa0, 0x5b, 0x56, 0xc9, 0x76, 0xb4, 0x09, 0x6b, 0x61, 0xfe, 0xd8, 0x8d, 0xf7, 0xf2, - 0xa6, 0xce, 0xd5, 0x6b, 0xfe, 0x45, 0x1d, 0x78, 0xbe, 0x27, 0xd1, 0xb3, 0x02, 0xc7, 0x8a, 0xe6, - 0xb8, 0xb3, 0x90, 0xc3, 0x64, 0x2e, 0x80, 0x6c, 0x43, 0xe7, 0x84, 0x43, 0x1e, 0x83, 0x1c, 0xb7, - 0x3b, 0x8f, 0xc1, 0xcb, 0xe0, 0xe6, 0x4c, 0xab, 0xe5, 0xdf, 0x85, 0x97, 0xb4, 0x54, 0x76, 0x85, - 0x7e, 0x62, 0x42, 0x67, 0x58, 0x6d, 0xd5, 0xe7, 0xac, 0x66, 0x62, 0x1c, 0x4c, 0xf8, 0x6b, 0xe1, - 0x44, 0x6a, 0x26, 0x5a, 0x9f, 0xce, 0xc3, 0x0b, 0xba, 0x24, 0xfa, 0x08, 0x60, 0xd5, 0xac, 0x11, - 0xdd, 0x9b, 0x93, 0xee, 0xf4, 0xfd, 0x38, 0x78, 0x59, 0xb9, 0x69, 0xc3, 0x6b, 0xbf, 0xfd, 0xfe, - 0xfb, 0xc3, 0xca, 0x7d, 0x84, 0x89, 0xf5, 0x69, 0x26, 0xb2, 0xe8, 0x86, 0xd1, 0x37, 0x00, 0xd7, - 0x4f, 0x2d, 0x17, 0x3d, 0x5a, 0x54, 0xbd, 0xec, 0xf2, 0x9c, 0xed, 0x33, 0x38, 0xcb, 0x5a, 0x98, - 0x41, 0x6d, 0xd6, 0x2c, 0xac, 0xbd, 0xdb, 0xcb, 0x61, 0xbf, 0x02, 0xb8, 0x56, 0x5c, 0x2e, 0x7a, - 0xb8, 0x14, 0xc5, 0xf4, 0x1d, 0x39, 0xed, 0xff, 0xb5, 0x59, 0xf2, 0x96, 0x26, 0xbf, 0x8b, 0x1a, - 0x8b, 0xc8, 0xe5, 0x3f, 0xf4, 0x9d, 0xce, 0xe1, 0xc8, 0x05, 0x47, 0x23, 0x17, 0xfc, 0x1a, 0xb9, - 0xe0, 0xfd, 0xd8, 0xad, 0x1c, 0x8d, 0xdd, 0xca, 0x8f, 0xb1, 0x5b, 0x79, 0xd9, 0x8e, 0x62, 0xb5, - 0xdf, 0x0f, 0x70, 0xc8, 0x93, 0xd9, 0xcb, 0x7c, 0x33, 0x9d, 0x5e, 0x0d, 0x33, 0x26, 0x83, 0xaa, - 0xfe, 0x3f, 0x7a, 0xf0, 0x37, 0x00, 0x00, 0xff, 0xff, 0x83, 0x96, 0xd6, 0xf2, 0x9e, 0x05, 0x00, + // 1073 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcf, 0x6f, 0x1b, 0x45, + 0x14, 0xce, 0xe6, 0x87, 0x13, 0x4f, 0x4a, 0x49, 0x86, 0xa8, 0x72, 0x9c, 0xe2, 0x24, 0x0b, 0x94, + 0x28, 0xc4, 0xbb, 0xb5, 0xd3, 0x98, 0xf6, 0xc0, 0x01, 0x37, 0x94, 0x56, 0xb4, 0xea, 0x66, 0x41, + 0x42, 0x02, 0xa4, 0x65, 0x7f, 0x8c, 0xd7, 0x2b, 0xdb, 0x3b, 0xdb, 0x99, 0xb1, 0x89, 0x85, 0x38, + 0xd0, 0x03, 0x67, 0x24, 0xfe, 0x00, 0x6e, 0x88, 0x23, 0x12, 0xbd, 0xc3, 0x05, 0xa9, 0x17, 0xa4, + 0xaa, 0x5c, 0x50, 0x0f, 0x11, 0x4a, 0x90, 0xf8, 0x37, 0xd0, 0xce, 0xce, 0x3a, 0x5e, 0xdb, 0x6b, + 0x27, 0x51, 0x2f, 0x91, 0x67, 0xde, 0xf7, 0xbd, 0xf9, 0xde, 0xf7, 0x66, 0xe7, 0x05, 0xbc, 0x65, + 0x99, 0x56, 0xb7, 0x89, 0x7d, 0xd5, 0x62, 0x36, 0x65, 0x0d, 0x1b, 0xfb, 0xb4, 0xdd, 0x42, 0x44, + 0xed, 0x94, 0xd4, 0x47, 0x6d, 0x44, 0xba, 0x4a, 0x40, 0x30, 0xc3, 0x70, 0x55, 0xc0, 0x94, 0x24, + 0x4c, 0xe9, 0x94, 0xf2, 0xcb, 0x66, 0xcb, 0xf3, 0xb1, 0xca, 0xff, 0x46, 0xe8, 0xfc, 0x8a, 0x8b, + 0x5d, 0xcc, 0x7f, 0xaa, 0xe1, 0x2f, 0xb1, 0x7b, 0xd5, 0xc5, 0xd8, 0x6d, 0x22, 0xd5, 0x0c, 0x3c, + 0xd5, 0xf4, 0x7d, 0xcc, 0x4c, 0xe6, 0x61, 0x9f, 0x8a, 0xe8, 0xaa, 0x8d, 0x69, 0x0b, 0x53, 0x23, + 0xa2, 0x45, 0x0b, 0x11, 0x92, 0xa3, 0x95, 0x6a, 0x93, 0x6e, 0xc0, 0xb0, 0x4a, 0x91, 0x1d, 0x94, + 0xf7, 0x2a, 0x8d, 0x92, 0xda, 0x40, 0xdd, 0x18, 0xf3, 0xa6, 0xc0, 0x50, 0x66, 0x36, 0x3c, 0xdf, + 0x55, 0x3b, 0x25, 0x0b, 0x31, 0xb3, 0x14, 0xaf, 0x05, 0x6a, 0x5b, 0xa0, 0x2c, 0x93, 0xa2, 0xa8, + 0xbe, 0x1e, 0x30, 0x30, 0x5d, 0xcf, 0xe7, 0x8a, 0x04, 0xf6, 0x5a, 0xc2, 0x99, 0x38, 0x6b, 0xdf, + 0x4a, 0xe0, 0xd6, 0x47, 0xe3, 0x02, 0x1c, 0x08, 0x80, 0x92, 0x6e, 0xf1, 0x80, 0x9b, 0xa3, 0x0e, + 0x4e, 0xe0, 0x03, 0x93, 0x98, 0x2d, 0x51, 0xb2, 0xbc, 0x02, 0xe0, 0x41, 0x58, 0x82, 0xc6, 0x37, + 0x75, 0xf4, 0xa8, 0x8d, 0x28, 0x93, 0x3f, 0x07, 0xaf, 0x25, 0x76, 0x69, 0x80, 0x7d, 0x8a, 0xe0, + 0x3e, 0xc8, 0x44, 0xe4, 0x9c, 0xb4, 0x21, 0x6d, 0x2d, 0x96, 0x37, 0x95, 0xd4, 0x8e, 0x2a, 0x11, + 0xb5, 0x9a, 0x7d, 0x7a, 0xb4, 0x3e, 0xf5, 0xf3, 0x7f, 0xbf, 0x6c, 0x4b, 0xba, 0xe0, 0xca, 0x2e, + 0x78, 0x9d, 0x27, 0xbf, 0x5d, 0x37, 0x3d, 0x5f, 0x47, 0xae, 0x47, 0x19, 0xe9, 0xde, 0xf7, 0x28, + 0x13, 0xa7, 0xc3, 0x3b, 0x00, 0x9c, 0x1a, 0x29, 0x8e, 0xba, 0xa6, 0x88, 0x6e, 0x86, 0xae, 0x2b, + 0xd1, 0xad, 0x12, 0xae, 0x2b, 0x9a, 0xe9, 0x22, 0xc1, 0xd5, 0xfb, 0x98, 0xf2, 0x77, 0x12, 0x28, + 0xa4, 0x9d, 0x24, 0x2a, 0x5a, 0x03, 0x59, 0x3b, 0x0c, 0x1a, 0x9e, 0x13, 0x16, 0x35, 0xb3, 0x95, + 0xd5, 0x17, 0xf8, 0xc6, 0x3d, 0x87, 0xc2, 0x0f, 0x13, 0x3a, 0xa6, 0xb9, 0x8e, 0xb7, 0x27, 0xea, + 0x88, 0x32, 0x27, 0x84, 0xdc, 0x02, 0xf9, 0x53, 0x1d, 0x34, 0x16, 0x12, 0x97, 0x3b, 0x4e, 0x83, + 0x1c, 0x80, 0xb5, 0x91, 0x54, 0xa1, 0xff, 0x00, 0xbc, 0xca, 0xa1, 0xd4, 0x20, 0x3c, 0x84, 0x08, + 0xcf, 0xb0, 0x58, 0xde, 0x1a, 0xd3, 0x9a, 0x3e, 0x3b, 0x10, 0xd1, 0x2f, 0xdb, 0x7d, 0xa9, 0x11, + 0x91, 0x1f, 0x4b, 0xa2, 0x3f, 0x77, 0x3c, 0xdf, 0x6c, 0x7a, 0xac, 0xab, 0x11, 0xdc, 0xf1, 0x1c, + 0x44, 0xe2, 0xdb, 0x01, 0x57, 0xc1, 0x42, 0x2c, 0x98, 0x77, 0x27, 0xab, 0xcf, 0x0b, 0xbd, 0x03, + 0xad, 0x9b, 0xbe, 0x70, 0xeb, 0xfe, 0x8c, 0x5b, 0x37, 0x42, 0x84, 0x28, 0xdd, 0x02, 0xb0, 0x26, + 0x82, 0xe1, 0xf7, 0x1e, 0x45, 0x45, 0xf5, 0xbb, 0x63, 0xaa, 0x1f, 0xcc, 0xd8, 0xeb, 0xd8, 0x72, + 0x6d, 0xf0, 0xac, 0x97, 0x77, 0x03, 0xbe, 0x00, 0x57, 0x47, 0x96, 0x73, 0x06, 0x4b, 0x37, 0xc1, + 0x2b, 0xb5, 0xc0, 0xb0, 0x98, 0x6d, 0x04, 0x0d, 0xa3, 0x8e, 0x0e, 0xb9, 0x8c, 0xac, 0x0e, 0x6a, + 0x41, 0x95, 0xd9, 0x5a, 0xe3, 0x2e, 0x3a, 0x94, 0xbf, 0x4d, 0x6b, 0x59, 0xcf, 0xac, 0x2f, 0xc1, + 0xf2, 0x90, 0x59, 0xe2, 0xcb, 0xba, 0x90, 0x57, 0x4b, 0x83, 0x5e, 0xc9, 0x3f, 0xcd, 0x82, 0x5c, + 0xea, 0xf1, 0x1f, 0x80, 0x45, 0x07, 0x51, 0x9b, 0x78, 0x41, 0xdf, 0x27, 0xfd, 0x46, 0x6c, 0x64, + 0xfc, 0x14, 0xc6, 0x2e, 0xee, 0x9f, 0x42, 0xf5, 0x7e, 0x1e, 0x7c, 0x00, 0x80, 0x8d, 0x5b, 0x2d, + 0x8f, 0xd2, 0xb8, 0x1d, 0xd9, 0x6a, 0xf1, 0xc5, 0xd1, 0xfa, 0x5a, 0x94, 0x88, 0x3a, 0x0d, 0xc5, + 0xc3, 0x6a, 0xcb, 0x64, 0x75, 0xe5, 0x3e, 0x72, 0x4d, 0xbb, 0xbb, 0x8f, 0xec, 0xe7, 0x4f, 0x8a, + 0x40, 0x9c, 0xb3, 0x8f, 0x6c, 0xbd, 0x2f, 0x01, 0xdc, 0x01, 0xb3, 0xa6, 0xe3, 0x90, 0xdc, 0x0c, + 0x4f, 0x94, 0x7b, 0xfe, 0xa4, 0xb8, 0x22, 0x90, 0xef, 0x3b, 0x0e, 0x41, 0x94, 0x7e, 0xcc, 0x88, + 0xe7, 0xbb, 0x3a, 0x47, 0xc1, 0x07, 0x20, 0x13, 0x35, 0x21, 0x37, 0xbb, 0x21, 0x6d, 0x5d, 0xaa, + 0x56, 0x5e, 0x1c, 0xad, 0x97, 0x5d, 0x8f, 0xd5, 0xdb, 0x96, 0x62, 0xe3, 0x96, 0x2a, 0x5c, 0xe4, + 0x6d, 0x8b, 0x17, 0x2a, 0xeb, 0x06, 0x88, 0x2a, 0xd5, 0x7b, 0xda, 0xee, 0x8d, 0xeb, 0x5a, 0xdb, + 0xfa, 0x08, 0x75, 0xf5, 0x39, 0x2b, 0x6c, 0x1b, 0x7c, 0x0f, 0xcc, 0x04, 0x38, 0xc8, 0xcd, 0x71, + 0x2b, 0xde, 0x49, 0xf6, 0x20, 0xb6, 0x43, 0xd1, 0x08, 0xc6, 0xb5, 0x87, 0x35, 0x0d, 0x53, 0x8a, + 0xb8, 0xe6, 0xea, 0x27, 0xb7, 0xf5, 0x90, 0x07, 0x6f, 0x80, 0x2b, 0xb4, 0x69, 0xd2, 0x3a, 0x72, + 0x0c, 0x41, 0x35, 0xea, 0xc8, 0x73, 0xeb, 0x2c, 0x97, 0xd9, 0x90, 0xb6, 0x66, 0xf5, 0x15, 0x11, + 0xad, 0x46, 0xc1, 0xbb, 0x3c, 0x06, 0x77, 0x00, 0xec, 0xb1, 0x98, 0x1d, 0x33, 0xe6, 0x39, 0x63, + 0x29, 0x66, 0x30, 0x5b, 0xa0, 0xaf, 0x80, 0x8c, 0x40, 0x2c, 0x70, 0x84, 0x58, 0xc1, 0x4d, 0x70, + 0xa9, 0x83, 0x99, 0xe7, 0xbb, 0x46, 0x80, 0xbf, 0x42, 0x24, 0x97, 0xe5, 0xd1, 0xc5, 0x68, 0x4f, + 0x0b, 0xb7, 0x12, 0xf7, 0x19, 0x24, 0xee, 0x73, 0xf9, 0x8f, 0x79, 0x30, 0xc7, 0x2f, 0x2b, 0xfc, + 0x51, 0x02, 0x99, 0x68, 0x4c, 0xc0, 0xe2, 0x98, 0x4b, 0x38, 0x3c, 0x9f, 0xf2, 0xca, 0x59, 0xe1, + 0xd1, 0xfd, 0x93, 0x2b, 0x8f, 0xff, 0xfa, 0xf7, 0x87, 0xe9, 0xeb, 0x50, 0x19, 0xdd, 0xa5, 0xb4, + 0x19, 0x09, 0x7f, 0x97, 0xc0, 0xf2, 0xd0, 0xf0, 0x80, 0x37, 0x27, 0x9d, 0x9e, 0x36, 0xd9, 0xf2, + 0xb7, 0x2e, 0xc0, 0x4c, 0x2b, 0x61, 0x84, 0xea, 0xc8, 0x72, 0x22, 0xe8, 0x46, 0x33, 0x14, 0xfb, + 0xab, 0x04, 0x2e, 0x27, 0x87, 0x07, 0xdc, 0x3b, 0x93, 0x8a, 0xc1, 0x39, 0x95, 0xaf, 0x9c, 0x97, + 0x26, 0x94, 0x97, 0xb9, 0xf2, 0x1d, 0xb8, 0x3d, 0x49, 0x39, 0xed, 0x49, 0x87, 0xbf, 0x49, 0x60, + 0x79, 0xe8, 0xe9, 0x9f, 0x6c, 0x7c, 0xda, 0xc8, 0x9a, 0x6c, 0x7c, 0xea, 0x9c, 0x91, 0xf7, 0xb8, + 0x7c, 0x15, 0x16, 0xc7, 0xc8, 0x1f, 0x1e, 0x44, 0xf0, 0x48, 0x02, 0x4b, 0x83, 0x49, 0xe1, 0xbb, + 0xe7, 0x95, 0x11, 0xeb, 0xbf, 0x79, 0x7e, 0xa2, 0x90, 0xff, 0x29, 0x97, 0x7f, 0x00, 0x1f, 0x9e, + 0x4b, 0xbe, 0xfa, 0x75, 0x62, 0xe6, 0x7c, 0x33, 0x0c, 0xa9, 0x6a, 0x4f, 0x8f, 0x0b, 0xd2, 0xb3, + 0xe3, 0x82, 0xf4, 0xcf, 0x71, 0x41, 0xfa, 0xfe, 0xa4, 0x30, 0xf5, 0xec, 0xa4, 0x30, 0xf5, 0xf7, + 0x49, 0x61, 0xea, 0xb3, 0xca, 0xa4, 0x57, 0xf1, 0x70, 0x50, 0x03, 0x7f, 0x26, 0xad, 0x0c, 0xff, + 0x97, 0x74, 0xf7, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x25, 0xbb, 0xa4, 0x6b, 0x4f, 0x0c, 0x00, 0x00, } @@ -375,6 +749,10 @@ type QueryClient interface { ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) // ChainsRegistry queries the latest info for a given list of chains in Babylon's view ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) + // FinalityProviders queries all finality providers for a given chain + FinalityProviders(ctx context.Context, in *QueryFinalityProvidersRequest, opts ...grpc.CallOption) (*QueryFinalityProvidersResponse, error) + // FinalityProvider info about one finality provider + FinalityProvider(ctx context.Context, in *QueryFinalityProviderRequest, opts ...grpc.CallOption) (*QueryFinalityProviderResponse, error) } type queryClient struct { @@ -412,6 +790,24 @@ func (c *queryClient) ChainsRegistry(ctx context.Context, in *QueryChainsRegistr return out, nil } +func (c *queryClient) FinalityProviders(ctx context.Context, in *QueryFinalityProvidersRequest, opts ...grpc.CallOption) (*QueryFinalityProvidersResponse, error) { + out := new(QueryFinalityProvidersResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/FinalityProviders", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) FinalityProvider(ctx context.Context, in *QueryFinalityProviderRequest, opts ...grpc.CallOption) (*QueryFinalityProviderResponse, error) { + out := new(QueryFinalityProviderResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/FinalityProvider", 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. @@ -420,6 +816,10 @@ type QueryServer interface { ChainRegistryList(context.Context, *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) // ChainsRegistry queries the latest info for a given list of chains in Babylon's view ChainsRegistry(context.Context, *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) + // FinalityProviders queries all finality providers for a given chain + FinalityProviders(context.Context, *QueryFinalityProvidersRequest) (*QueryFinalityProvidersResponse, error) + // FinalityProvider info about one finality provider + FinalityProvider(context.Context, *QueryFinalityProviderRequest) (*QueryFinalityProviderResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -435,6 +835,12 @@ func (*UnimplementedQueryServer) ChainRegistryList(ctx context.Context, req *Que func (*UnimplementedQueryServer) ChainsRegistry(ctx context.Context, req *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ChainsRegistry not implemented") } +func (*UnimplementedQueryServer) FinalityProviders(ctx context.Context, req *QueryFinalityProvidersRequest) (*QueryFinalityProvidersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FinalityProviders not implemented") +} +func (*UnimplementedQueryServer) FinalityProvider(ctx context.Context, req *QueryFinalityProviderRequest) (*QueryFinalityProviderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FinalityProvider not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -494,6 +900,42 @@ func _Query_ChainsRegistry_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _Query_FinalityProviders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryFinalityProvidersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).FinalityProviders(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.btcstkconsumer.v1.Query/FinalityProviders", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).FinalityProviders(ctx, req.(*QueryFinalityProvidersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_FinalityProvider_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryFinalityProviderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).FinalityProvider(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.btcstkconsumer.v1.Query/FinalityProvider", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).FinalityProvider(ctx, req.(*QueryFinalityProviderRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "babylon.btcstkconsumer.v1.Query", HandlerType: (*QueryServer)(nil), @@ -510,6 +952,14 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "ChainsRegistry", Handler: _Query_ChainsRegistry_Handler, }, + { + MethodName: "FinalityProviders", + Handler: _Query_FinalityProviders_Handler, + }, + { + MethodName: "FinalityProvider", + Handler: _Query_FinalityProvider_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "babylon/btcstkconsumer/v1/query.proto", @@ -719,45 +1169,313 @@ func (m *QueryChainsRegistryResponse) MarshalToSizedBuffer(dAtA []byte) (int, er return len(dAtA) - i, nil } -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 +func (m *QueryFinalityProvidersRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - var l int - _ = l - return n + return dAtA[:n], nil } -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n +func (m *QueryFinalityProvidersRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryChainRegistryListRequest) Size() (n int) { - if m == nil { - return 0 - } +func (m *QueryFinalityProvidersRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l if m.Pagination != nil { - l = m.Pagination.Size() + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryFinalityProvidersResponse) 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 *QueryFinalityProvidersResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryFinalityProvidersResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.FinalityProviders) > 0 { + for iNdEx := len(m.FinalityProviders) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FinalityProviders[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 *QueryFinalityProviderRequest) 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 *QueryFinalityProviderRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryFinalityProviderRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.FpBtcPkHex) > 0 { + i -= len(m.FpBtcPkHex) + copy(dAtA[i:], m.FpBtcPkHex) + i = encodeVarintQuery(dAtA, i, uint64(len(m.FpBtcPkHex))) + i-- + dAtA[i] = 0x12 + } + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryFinalityProviderResponse) 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 *QueryFinalityProviderResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryFinalityProviderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.FinalityProvider != nil { + { + size, err := m.FinalityProvider.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 *FinalityProviderResponse) 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 *FinalityProviderResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *FinalityProviderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0x52 + } + if m.VotingPower != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.VotingPower)) + i-- + dAtA[i] = 0x48 + } + if m.Height != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.Height)) + i-- + dAtA[i] = 0x40 + } + if m.SlashedBtcHeight != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.SlashedBtcHeight)) + i-- + dAtA[i] = 0x38 + } + if m.SlashedBabylonHeight != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.SlashedBabylonHeight)) + i-- + dAtA[i] = 0x30 + } + if m.Pop != nil { + { + size, err := m.Pop.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.BtcPk != nil { + { + size := m.BtcPk.Size() + i -= size + if _, err := m.BtcPk.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if len(m.Addr) > 0 { + i -= len(m.Addr) + copy(dAtA[i:], m.Addr) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Addr))) + i-- + dAtA[i] = 0x1a + } + if m.Commission != nil { + { + size := m.Commission.Size() + i -= size + if _, err := m.Commission.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Description != nil { + { + size, err := m.Description.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 encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryChainRegistryListRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() n += 1 + l + sovQuery(uint64(l)) } return n @@ -775,50 +1493,580 @@ func (m *QueryChainRegistryListResponse) Size() (n int) { n += 1 + l + sovQuery(uint64(l)) } } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryChainsRegistryRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChainIds) > 0 { + for _, s := range m.ChainIds { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryChainsRegistryResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChainsRegister) > 0 { + for _, e := range m.ChainsRegister { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryFinalityProvidersRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryFinalityProvidersResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.FinalityProviders) > 0 { + for _, e := range m.FinalityProviders { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryFinalityProviderRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.FpBtcPkHex) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryFinalityProviderResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FinalityProvider != nil { + l = m.FinalityProvider.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *FinalityProviderResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Description != nil { + l = m.Description.Size() + n += 1 + l + sovQuery(uint64(l)) + } + if m.Commission != nil { + l = m.Commission.Size() + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.Addr) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.BtcPk != nil { + l = m.BtcPk.Size() + n += 1 + l + sovQuery(uint64(l)) + } + if m.Pop != nil { + l = m.Pop.Size() + n += 1 + l + sovQuery(uint64(l)) + } + if m.SlashedBabylonHeight != 0 { + n += 1 + sovQuery(uint64(m.SlashedBabylonHeight)) + } + if m.SlashedBtcHeight != 0 { + n += 1 + sovQuery(uint64(m.SlashedBtcHeight)) + } + if m.Height != 0 { + n += 1 + sovQuery(uint64(m.Height)) + } + if m.VotingPower != 0 { + n += 1 + sovQuery(uint64(m.VotingPower)) + } + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryParamsRequest) 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: QueryParamsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + 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 *QueryParamsResponse) 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: QueryParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", 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 + } + if err := m.Params.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 *QueryChainRegistryListRequest) 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: QueryChainRegistryListRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainRegistryListRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", 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 + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.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 *QueryChainRegistryListResponse) 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: QueryChainRegistryListResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainRegistryListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", 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 + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.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 + } + } -func (m *QueryChainsRegistryRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ChainIds) > 0 { - for _, s := range m.ChainIds { - l = len(s) - n += 1 + l + sovQuery(uint64(l)) - } + if iNdEx > l { + return io.ErrUnexpectedEOF } - return n + return nil } - -func (m *QueryChainsRegistryResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ChainsRegister) > 0 { - for _, e := range m.ChainsRegister { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) +func (m *QueryChainsRegistryRequest) 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: QueryChainsRegistryRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryChainsRegistryRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + 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 } } - return n -} -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil } -func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { +func (m *QueryChainsRegistryResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -841,12 +2089,46 @@ func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryChainsRegistryResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryChainsRegistryResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainsRegister", 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.ChainsRegister = append(m.ChainsRegister, &ChainRegister{}) + if err := m.ChainsRegister[len(m.ChainsRegister)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) @@ -868,7 +2150,7 @@ func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { +func (m *QueryFinalityProvidersRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -891,15 +2173,47 @@ func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryFinalityProvidersRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryFinalityProvidersRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -926,7 +2240,10 @@ func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -951,7 +2268,7 @@ func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainRegistryListRequest) Unmarshal(dAtA []byte) error { +func (m *QueryFinalityProvidersResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -974,13 +2291,47 @@ func (m *QueryChainRegistryListRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainRegistryListRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryFinalityProvidersResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainRegistryListRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryFinalityProvidersResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FinalityProviders", 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.FinalityProviders = append(m.FinalityProviders, &FinalityProviderResponse{}) + if err := m.FinalityProviders[len(m.FinalityProviders)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) } @@ -1010,7 +2361,7 @@ func (m *QueryChainRegistryListRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Pagination == nil { - m.Pagination = &query.PageRequest{} + m.Pagination = &query.PageResponse{} } if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -1037,7 +2388,7 @@ func (m *QueryChainRegistryListRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainRegistryListResponse) Unmarshal(dAtA []byte) error { +func (m *QueryFinalityProviderRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1060,15 +2411,15 @@ func (m *QueryChainRegistryListResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainRegistryListResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryFinalityProviderRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainRegistryListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryFinalityProviderRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -1096,13 +2447,13 @@ func (m *QueryChainRegistryListResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + m.ChainId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FpBtcPkHex", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowQuery @@ -1112,27 +2463,23 @@ func (m *QueryChainRegistryListResponse) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthQuery } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthQuery } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Pagination == nil { - m.Pagination = &query.PageResponse{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.FpBtcPkHex = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -1155,7 +2502,7 @@ func (m *QueryChainRegistryListResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainsRegistryRequest) Unmarshal(dAtA []byte) error { +func (m *QueryFinalityProviderResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1178,17 +2525,17 @@ func (m *QueryChainsRegistryRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainsRegistryRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryFinalityProviderResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainsRegistryRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryFinalityProviderResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FinalityProvider", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowQuery @@ -1198,23 +2545,27 @@ func (m *QueryChainsRegistryRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthQuery } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthQuery } if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + if m.FinalityProvider == nil { + m.FinalityProvider = &FinalityProviderResponse{} + } + if err := m.FinalityProvider.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -1237,7 +2588,7 @@ func (m *QueryChainsRegistryRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainsRegistryResponse) Unmarshal(dAtA []byte) error { +func (m *FinalityProviderResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1260,15 +2611,15 @@ func (m *QueryChainsRegistryResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainsRegistryResponse: wiretype end group for non-group") + return fmt.Errorf("proto: FinalityProviderResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainsRegistryResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: FinalityProviderResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainsRegister", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1295,11 +2646,260 @@ func (m *QueryChainsRegistryResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainsRegister = append(m.ChainsRegister, &ChainRegister{}) - if err := m.ChainsRegister[len(m.ChainsRegister)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Description == nil { + m.Description = &types.Description{} + } + if err := m.Description.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Commission", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v cosmossdk_io_math.LegacyDec + m.Commission = &v + if err := m.Commission.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BtcPk", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_babylonchain_babylon_types.BIP340PubKey + m.BtcPk = &v + if err := m.BtcPk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pop", 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 + } + if m.Pop == nil { + m.Pop = &types1.ProofOfPossessionBTC{} + } + if err := m.Pop.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashedBabylonHeight", wireType) + } + m.SlashedBabylonHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SlashedBabylonHeight |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashedBtcHeight", wireType) + } + m.SlashedBtcHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SlashedBtcHeight |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Height", wireType) + } + m.Height = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Height |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field VotingPower", wireType) + } + m.VotingPower = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.VotingPower |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) diff --git a/x/btcstkconsumer/types/query.pb.gw.go b/x/btcstkconsumer/types/query.pb.gw.go index 6513c1d92..9e5282ed6 100644 --- a/x/btcstkconsumer/types/query.pb.gw.go +++ b/x/btcstkconsumer/types/query.pb.gw.go @@ -123,6 +123,114 @@ func local_request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime } +var ( + filter_Query_FinalityProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_FinalityProviders_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalityProvidersRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalityProviders_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.FinalityProviders(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_FinalityProviders_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalityProvidersRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalityProviders_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.FinalityProviders(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_FinalityProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"fp_btc_pk_hex": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_FinalityProvider_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalityProviderRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["fp_btc_pk_hex"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "fp_btc_pk_hex") + } + + protoReq.FpBtcPkHex, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fp_btc_pk_hex", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalityProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.FinalityProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_FinalityProvider_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalityProviderRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["fp_btc_pk_hex"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "fp_btc_pk_hex") + } + + protoReq.FpBtcPkHex, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fp_btc_pk_hex", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalityProvider_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.FinalityProvider(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. @@ -198,6 +306,52 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_FinalityProviders_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_FinalityProviders_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_FinalityProviders_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_FinalityProvider_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_FinalityProvider_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_FinalityProvider_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -299,6 +453,46 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_FinalityProviders_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_FinalityProviders_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_FinalityProviders_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_FinalityProvider_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_FinalityProvider_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_FinalityProvider_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -308,6 +502,10 @@ var ( pattern_Query_ChainRegistryList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "chain_registry_list"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_ChainsRegistry_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "chains_registry"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_FinalityProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "finality_providers"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_FinalityProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"babylon", "btcstkconsumer", "v1", "finality_providers", "fp_btc_pk_hex", "finality_provider"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -316,4 +514,8 @@ var ( forward_Query_ChainRegistryList_0 = runtime.ForwardResponseMessage forward_Query_ChainsRegistry_0 = runtime.ForwardResponseMessage + + forward_Query_FinalityProviders_0 = runtime.ForwardResponseMessage + + forward_Query_FinalityProvider_0 = runtime.ForwardResponseMessage ) From a4d244cd3215e99844c9ff2ef1420de10bdd4493 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 20 Mar 2024 13:44:49 +0100 Subject: [PATCH 06/85] F/consumer fp registry 2 (#220) * Add chains per FP BTC PubKey store * Ensure CZ chains FP does not already exist * Fix: Return err explicitly instead of nil --- x/btcstaking/types/expected_keepers.go | 1 + .../keeper/finality_provider_registry.go | 31 ++++++++++++++----- .../keeper/finality_provider_registry_test.go | 3 +- x/btcstkconsumer/types/keys.go | 7 +++-- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/x/btcstaking/types/expected_keepers.go b/x/btcstaking/types/expected_keepers.go index a7e24a7aa..3782a9a75 100644 --- a/x/btcstaking/types/expected_keepers.go +++ b/x/btcstaking/types/expected_keepers.go @@ -28,5 +28,6 @@ type CheckpointingKeeper interface { type BTCStkConsumerKeeper interface { IsChainRegistered(ctx context.Context, chainID string) bool + HasFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) bool SetFinalityProvider(ctx context.Context, fp *FinalityProvider) } diff --git a/x/btcstkconsumer/keeper/finality_provider_registry.go b/x/btcstkconsumer/keeper/finality_provider_registry.go index 3a68ed2dc..0abcacde4 100644 --- a/x/btcstkconsumer/keeper/finality_provider_registry.go +++ b/x/btcstkconsumer/keeper/finality_provider_registry.go @@ -2,11 +2,12 @@ package keeper import ( "context" - errorsmod "cosmossdk.io/errors" - "github.com/babylonchain/babylon/types" + "github.com/cosmos/cosmos-sdk/runtime" + errorsmod "cosmossdk.io/errors" "cosmossdk.io/store/prefix" + bbn "github.com/babylonchain/babylon/types" btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" btcstktypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" @@ -17,23 +18,30 @@ func (k Keeper) SetFinalityProvider(ctx context.Context, fp *btcstaking.Finality store := k.finalityProviderStore(ctx, fp.ChainId) fpBytes := k.cdc.MustMarshal(fp) store.Set(fp.BtcPk.MustMarshal(), fpBytes) + // Update the finality provider chain store + fpChainStore := k.finalityProviderChainStore(ctx) + fpChainStore.Set(fp.BtcPk.MustMarshal(), []byte(fp.ChainId)) } // GetFinalityProvider gets the finality provider in the chain id with the given finality provider Bitcoin PK -func (k Keeper) GetFinalityProvider(ctx context.Context, chainID string, fpBTCPK *types.BIP340PubKey) (*btcstaking.FinalityProvider, error) { - if !k.HasFinalityProvider(ctx, chainID, fpBTCPK) { +func (k Keeper) GetFinalityProvider(ctx context.Context, chainID string, fpBTCPK *bbn.BIP340PubKey) (*btcstaking.FinalityProvider, error) { + if !k.HasFinalityProvider(ctx, fpBTCPK) { return nil, btcstaking.ErrFpNotFound } store := k.finalityProviderStore(ctx, chainID) fpBytes := store.Get(*fpBTCPK) + if fpBytes == nil { + // FP exists, but not for this chain id + return nil, btcstaking.ErrFpNotFound + } var fp btcstaking.FinalityProvider k.cdc.MustUnmarshal(fpBytes, &fp) return &fp, nil } -// HasFinalityProvider checks whether the finality provider exists and is registered for a given (registered) chain ID -func (k Keeper) HasFinalityProvider(ctx context.Context, chainID string, fpBTCPK *types.BIP340PubKey) bool { - store := k.finalityProviderStore(ctx, chainID) +// HasFinalityProvider checks if the finality provider already exists, across / independently of all chain ids +func (k Keeper) HasFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) bool { + store := k.finalityProviderChainStore(ctx) return store.Has(*fpBTCPK) } @@ -97,3 +105,12 @@ func (k Keeper) finalityProviderStore(ctx context.Context, chainID string) prefi fpStore := prefix.NewStore(storeAdapter, btcstktypes.FinalityProviderKey) return prefix.NewStore(fpStore, []byte(chainID)) } + +// finalityProviderChainStore returns the KVStore of the finality provider chain per FP BTC PubKey +// prefix: FinalityProviderChainKey +// key: Bitcoin PubKey +// value: chain id +func (k Keeper) finalityProviderChainStore(ctx context.Context) prefix.Store { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + return prefix.NewStore(storeAdapter, btcstktypes.FinalityProviderChainKey) +} diff --git a/x/btcstkconsumer/keeper/finality_provider_registry_test.go b/x/btcstkconsumer/keeper/finality_provider_registry_test.go index 1b905a8cc..23cbc4fa9 100644 --- a/x/btcstkconsumer/keeper/finality_provider_registry_test.go +++ b/x/btcstkconsumer/keeper/finality_provider_registry_test.go @@ -47,7 +47,6 @@ func FuzzFPRegistry(f *testing.F) { bscKeeper.SetChainRegister(ctx, chainRegister) // Now add a finality provider for the chain to the registry - fp := btcstaking.FinalityProvider{ BtcPk: fpBtcPk, ChainId: czChainID, @@ -55,7 +54,7 @@ func FuzzFPRegistry(f *testing.F) { bscKeeper.SetFinalityProvider(ctx, &fp) // Check that the finality provider is being registered - hasFP := bscKeeper.HasFinalityProvider(ctx, czChainID, fpBtcPk) + hasFP := bscKeeper.HasFinalityProvider(ctx, fpBtcPk) require.True(t, hasFP) }) } diff --git a/x/btcstkconsumer/types/keys.go b/x/btcstkconsumer/types/keys.go index 0cf142410..9ec97f404 100644 --- a/x/btcstkconsumer/types/keys.go +++ b/x/btcstkconsumer/types/keys.go @@ -15,9 +15,10 @@ const ( ) var ( - ParamsKey = []byte("p_btcstkconsumer") - ChainRegisterKey = []byte{0x01} // ChainRegisterKey defines the key to store the chain register for each CZ in store - FinalityProviderKey = []byte{0x02} // FinalityProviderKey defines the key to store the CZ finality providers + ParamsKey = []byte("p_btcstkconsumer") + ChainRegisterKey = []byte{0x01} // ChainRegisterKey defines the key to the chain register for each CZ in store + FinalityProviderKey = []byte{0x02} // FinalityProviderKey defines the key to the CZ finality providers store + FinalityProviderChainKey = []byte{0x03} // FinalityProviderChainKey defines the key to the CZ chains per FP BTC PK store ) func KeyPrefix(p string) []byte { From 65657d13876a73eb0493d6e5a361cbba16a66746 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Fri, 22 Mar 2024 11:00:16 +1100 Subject: [PATCH 07/85] handling restaked BTC delegations to consumer FPs (#222) --- test/e2e/btc_staking_e2e_test.go | 14 +- .../configurer/chain/commands_btcstaking.go | 15 +- testutil/datagen/btcstkconsumer.go | 15 ++ x/btcstaking/client/cli/tx.go | 18 +- x/btcstaking/keeper/bench_test.go | 6 +- x/btcstaking/keeper/btc_delegations.go | 37 +++ x/btcstaking/keeper/grpc_query.go | 71 +++--- x/btcstaking/keeper/incentive_test.go | 6 +- x/btcstaking/keeper/keeper_test.go | 65 ++++-- x/btcstaking/keeper/msg_server.go | 34 ++- x/btcstaking/keeper/msg_server_test.go | 36 +-- x/btcstaking/keeper/power_dist_change_test.go | 14 +- x/btcstaking/keeper/restaking_test.go | 212 ++++++++++++++++++ .../keeper/voting_power_table_test.go | 26 ++- x/btcstaking/types/errors.go | 1 + x/btcstaking/types/expected_keepers.go | 5 + x/btcstkconsumer/keeper/btc_delegations.go | 184 +++++++++++++++ .../keeper/consumer_chain_registry_test.go | 31 +-- x/btcstkconsumer/types/keys.go | 2 + 19 files changed, 673 insertions(+), 119 deletions(-) create mode 100644 testutil/datagen/btcstkconsumer.go create mode 100644 x/btcstaking/keeper/restaking_test.go create mode 100644 x/btcstkconsumer/keeper/btc_delegations.go diff --git a/test/e2e/btc_staking_e2e_test.go b/test/e2e/btc_staking_e2e_test.go index 538c58c01..9c63c69d6 100644 --- a/test/e2e/btc_staking_e2e_test.go +++ b/test/e2e/btc_staking_e2e_test.go @@ -104,8 +104,9 @@ func (s *BTCStakingTestSuite) Test1CreateFinalityProviderAndDelegation() { s.NoError(err) // submit the message for creating BTC delegation + delBTCPKs := []bbn.BIP340PubKey{*bbn.NewBIP340PubKeyFromBTCPK(delBTCPK)} nonValidatorNode.CreateBTCDelegation( - bbn.NewBIP340PubKeyFromBTCPK(delBTCPK), + delBTCPKs, pop, stakingTxInfo, cacheFP.BtcPk, @@ -495,8 +496,9 @@ func (s *BTCStakingTestSuite) Test6MultisigBTCDelegation() { s.NoError(err) // submit the message for only generate the Tx to create BTC delegation + delBTCPKs := []bbn.BIP340PubKey{*bbn.NewBIP340PubKeyFromBTCPK(delBTCPK)} jsonTx := nonValidatorNode.CreateBTCDelegation( - bbn.NewBIP340PubKeyFromBTCPK(delBTCPK), + delBTCPKs, pop, stakingTxInfo, cacheFP.BtcPk, @@ -575,8 +577,9 @@ func (s *BTCStakingTestSuite) Test7BTCDelegationFeeGrant() { s.True(stakerBalances.IsZero()) // submit the message to create BTC delegation + delBTCPKs := []bbn.BIP340PubKey{*bbn.NewBIP340PubKeyFromBTCPK(delBTCPK)} nonValidatorNode.CreateBTCDelegation( - bbn.NewBIP340PubKeyFromBTCPK(delBTCPK), + delBTCPKs, pop, stakingTxInfo, cacheFP.BtcPk, @@ -684,8 +687,9 @@ func (s *BTCStakingTestSuite) Test8BTCDelegationFeeGrantTyped() { // submit the message to create BTC delegation using the fee grant // but putting as fee more than the spend limit // it should fail by exceeding the fee limit. + delBTCPKs := []bbn.BIP340PubKey{*bbn.NewBIP340PubKeyFromBTCPK(delBTCPK)} output := node.CreateBTCDelegation( - bbn.NewBIP340PubKeyFromBTCPK(delBTCPK), + delBTCPKs, pop, stakingTxInfo, cacheFP.BtcPk, @@ -708,7 +712,7 @@ func (s *BTCStakingTestSuite) Test8BTCDelegationFeeGrantTyped() { // submit the message to create BTC delegation using the fee grant at the max of spend limit node.CreateBTCDelegation( - bbn.NewBIP340PubKeyFromBTCPK(delBTCPK), + delBTCPKs, pop, stakingTxInfo, cacheFP.BtcPk, diff --git a/test/e2e/configurer/chain/commands_btcstaking.go b/test/e2e/configurer/chain/commands_btcstaking.go index f42041b7e..9dcdae99b 100644 --- a/test/e2e/configurer/chain/commands_btcstaking.go +++ b/test/e2e/configurer/chain/commands_btcstaking.go @@ -43,7 +43,7 @@ func (n *NodeConfig) CreateFinalityProvider(walletAddrOrName string, btcPK *bbn. } func (n *NodeConfig) CreateBTCDelegation( - btcPk *bbn.BIP340PubKey, + btcPKs []bbn.BIP340PubKey, pop *bstypes.ProofOfPossessionBTC, stakingTxInfo *btcctypes.TransactionInfo, fpPK *bbn.BIP340PubKey, @@ -62,7 +62,12 @@ func (n *NodeConfig) CreateBTCDelegation( ) (outStr string) { n.LogActionF("creating BTC delegation") - btcPkHex := btcPk.MarshalHex() + var btcPKHexList []string + for _, btcPK := range btcPKs { + btcPKHex := btcPK.MarshalHex() + btcPKHexList = append(btcPKHexList, btcPKHex) + } + btcPKHexListStr := strings.Join(btcPKHexList, ",") // get pop hex popHex, err := pop.ToHexStr() @@ -93,18 +98,16 @@ func (n *NodeConfig) CreateBTCDelegation( cmd := []string{ "babylond", "tx", "btcstaking", "create-btc-delegation", - btcPkHex, popHex, stakingTxInfoHex, fpPKHex, stakingTimeString, stakingValueString, slashingTxHex, delegatorSigHex, unbondingTxHex, unbondingSlashingTxHex, unbondingTimeStr, unbondingValueStr, delUnbondingSlashingSigHex, + btcPKHexListStr, popHex, stakingTxInfoHex, fpPKHex, stakingTimeString, stakingValueString, slashingTxHex, delegatorSigHex, unbondingTxHex, unbondingSlashingTxHex, unbondingTimeStr, unbondingValueStr, delUnbondingSlashingSigHex, fmt.Sprintf("--from=%s", fromWalletName), containers.FlagHome, flagKeyringTest, n.FlagChainID(), "--log_format=json", } if generateOnly { cmd = append(cmd, "--generate-only") - } else { - cmd = append(cmd, "-b=sync", "--yes") } - outBuff, _, err := n.containerManager.ExecCmd(n.t, n.Name, append(cmd, overallFlags...), "") + outBuff, _, err := n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, append(cmd, overallFlags...)) require.NoError(n.t, err) n.LogActionF("successfully created BTC delegation") return outBuff.String() diff --git a/testutil/datagen/btcstkconsumer.go b/testutil/datagen/btcstkconsumer.go new file mode 100644 index 000000000..a2f5508d3 --- /dev/null +++ b/testutil/datagen/btcstkconsumer.go @@ -0,0 +1,15 @@ +package datagen + +import ( + "math/rand" + + bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func GenRandomChainRegister(r *rand.Rand) *bsctypes.ChainRegister { + return &bsctypes.ChainRegister{ + ChainId: "test-" + GenRandomHexStr(r, 10), + ChainName: GenRandomHexStr(r, 5), + ChainDescription: "Chain description: " + GenRandomHexStr(r, 15), + } +} diff --git a/x/btcstaking/client/cli/tx.go b/x/btcstaking/client/cli/tx.go index 813e70a50..96a3de643 100644 --- a/x/btcstaking/client/cli/tx.go +++ b/x/btcstaking/client/cli/tx.go @@ -190,7 +190,7 @@ func NewEditFinalityProviderCmd() *cobra.Command { func NewCreateBTCDelegationCmd() *cobra.Command { cmd := &cobra.Command{ - Use: "create-btc-delegation [btc_pk] [pop_hex] [staking_tx_info] [fp_pk] [staking_time] [staking_value] [slashing_tx] [delegator_slashing_sig] [unbonding_tx] [unbonding_slashing_tx] [unbonding_time] [unbonding_value] [delegator_unbonding_slashing_sig]", + Use: "create-btc-delegation [btc_pk] [pop_hex] [staking_tx_info] [fp_pk1],[fp_pk2],... [staking_time] [staking_value] [slashing_tx] [delegator_slashing_sig] [unbonding_tx] [unbonding_slashing_tx] [unbonding_time] [unbonding_value] [delegator_unbonding_slashing_sig]", Args: cobra.ExactArgs(13), Short: "Create a BTC delegation", Long: strings.TrimSpace( @@ -221,11 +221,15 @@ func NewCreateBTCDelegationCmd() *cobra.Command { return err } - // TODO: Support multiple finality providers - // get finality provider PK - fpPK, err := bbn.NewBIP340PubKeyFromHex(args[3]) - if err != nil { - return err + // get finality provider PKs + fpPKStrs := strings.Split(args[3], ",") + fpPKs := make([]bbn.BIP340PubKey, len(fpPKStrs)) + for i := range fpPKStrs { + fpPK, err := bbn.NewBIP340PubKeyFromHex(fpPKStrs[i]) + if err != nil { + return err + } + fpPKs[i] = *fpPK } // get staking time @@ -283,7 +287,7 @@ func NewCreateBTCDelegationCmd() *cobra.Command { msg := types.MsgCreateBTCDelegation{ StakerAddr: clientCtx.FromAddress.String(), BtcPk: btcPK, - FpBtcPkList: []bbn.BIP340PubKey{*fpPK}, + FpBtcPkList: fpPKs, Pop: pop, StakingTime: uint32(stakingTime), StakingValue: int64(stakingValue), diff --git a/x/btcstaking/keeper/bench_test.go b/x/btcstaking/keeper/bench_test.go index 9e217a7aa..2aea5b2ad 100644 --- a/x/btcstaking/keeper/bench_test.go +++ b/x/btcstaking/keeper/bench_test.go @@ -12,6 +12,7 @@ import ( btclctypes "github.com/babylonchain/babylon/x/btclightclient/types" bsmodule "github.com/babylonchain/babylon/x/btcstaking" "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/btcsuite/btcd/btcec/v2" "github.com/golang/mock/gomock" ) @@ -53,13 +54,14 @@ func benchBeginBlock(b *testing.B, numFPs int, numDelsUnderFP int) { for i := 0; i < numDelsUnderFP; i++ { // generate and insert new BTC delegation stakingValue := int64(2 * 10e8) - stakingTxHash, _, _, msgCreateBTCDel, actualDel := h.CreateDelegation( + stakingTxHash, _, _, msgCreateBTCDel, actualDel, err := h.CreateDelegation( r, - fp.BtcPk.MustToBTCPK(), + []*btcec.PublicKey{fp.BtcPk.MustToBTCPK()}, changeAddress.EncodeAddress(), stakingValue, 1000, ) + h.NoError(err) // retrieve BTC delegation in DB btcDelMap[stakingTxHash] = append(btcDelMap[stakingTxHash], actualDel) // generate and insert new covenant signatures diff --git a/x/btcstaking/keeper/btc_delegations.go b/x/btcstaking/keeper/btc_delegations.go index 9ebcb6bea..33688b5ed 100644 --- a/x/btcstaking/keeper/btc_delegations.go +++ b/x/btcstaking/keeper/btc_delegations.go @@ -80,6 +80,7 @@ func (k Keeper) addCovenantSigsToBTCDelegation( unbondingTxSig *bbn.BIP340Signature, parsedUnbondingSlashingAdaptorSignatures []asig.AdaptorSignature, params *types.Params, + restakedToConsumers bool, ) { // All is fine add received signatures to the BTC delegation and BtcUndelegation btcDel.AddCovenantSigs( @@ -89,7 +90,12 @@ func (k Keeper) addCovenantSigsToBTCDelegation( parsedUnbondingSlashingAdaptorSignatures, ) + // set BTC delegation back to KV store (and consumer's KV store if restaked to + // consumer finality providers) k.setBTCDelegation(ctx, btcDel) + if restakedToConsumers { + k.bscKeeper.SetBTCDelegation(ctx, btcDel) + } // If reaching the covenant quorum after this msg, the BTC delegation becomes // active. Then, record and emit this event @@ -116,9 +122,16 @@ func (k Keeper) btcUndelegate( ctx sdk.Context, btcDel *types.BTCDelegation, unbondingTxSig *bbn.BIP340Signature, + restakedToConsumers bool, ) { btcDel.BtcUndelegation.DelegatorUnbondingSig = unbondingTxSig + + // set BTC delegation back to KV store (and consumer's KV store if restaked to + // consumer finality providers) k.setBTCDelegation(ctx, btcDel) + if restakedToConsumers { + k.bscKeeper.SetBTCDelegation(ctx, btcDel) + } // notify subscriber about this unbonded BTC delegation event := &types.EventBTCDelegationStateUpdate{ @@ -143,6 +156,30 @@ func (k Keeper) setBTCDelegation(ctx context.Context, btcDel *types.BTCDelegatio store.Set(stakingTxHash[:], btcDelBytes) } +// validateRestakedFPs ensures all finality providers are known to Babylon and at least +// 1 one of them is a Babylon finality provider. It also checks whether the BTC stake is +// restaked to FPs of consumer chains +func (k Keeper) validateRestakedFPs(ctx context.Context, fpBTCPKs []bbn.BIP340PubKey) (bool, error) { + restakedToBabylon := false + restakedToConsumers := false + for _, fpBTCPK := range fpBTCPKs { + if k.HasFinalityProvider(ctx, fpBTCPK) { + restakedToBabylon = true + continue + } else if k.bscKeeper.HasFinalityProvider(ctx, &fpBTCPK) { + restakedToConsumers = true + continue + } else { + return false, types.ErrFpNotFound.Wrapf("finality provider pk %s is not found", fpBTCPK.MarshalHex()) + } + } + if !restakedToBabylon { + // a BTC delegation has to stake to at least 1 Babylon finality provider + return false, types.ErrNoBabylonFPRestaked + } + return restakedToConsumers, nil +} + // GetBTCDelegation gets the BTC delegation with a given staking tx hash func (k Keeper) GetBTCDelegation(ctx context.Context, stakingTxHashStr string) (*types.BTCDelegation, error) { // decode staking tx hash string diff --git a/x/btcstaking/keeper/grpc_query.go b/x/btcstaking/keeper/grpc_query.go index f687cdb36..d6227fb6c 100644 --- a/x/btcstaking/keeper/grpc_query.go +++ b/x/btcstaking/keeper/grpc_query.go @@ -230,44 +230,59 @@ func (k Keeper) FinalityProviderDelegations(ctx context.Context, req *types.Quer sdkerrors.ErrInvalidRequest, "finality provider BTC public key cannot be empty") } + sdkCtx := sdk.UnwrapSDKContext(ctx) + currentWValue := k.btccKeeper.GetParams(ctx).CheckpointFinalizationTimeout + btcHeight := k.btclcKeeper.GetTipInfo(ctx).Height + covenantQuorum := k.GetParams(ctx).CovenantQuorum + fpPK, err := bbn.NewBIP340PubKeyFromHex(req.FpBtcPkHex) if err != nil { return nil, err } - sdkCtx := sdk.UnwrapSDKContext(ctx) - btcDelStore := k.btcDelegatorFpStore(sdkCtx, fpPK) - - currentWValue := k.btccKeeper.GetParams(ctx).CheckpointFinalizationTimeout - btcHeight := k.btclcKeeper.GetTipInfo(ctx).Height - covenantQuorum := k.GetParams(ctx).CovenantQuorum + var ( + btcDels []*types.BTCDelegatorDelegationsResponse + pageRes *query.PageResponse + ) - btcDels := []*types.BTCDelegatorDelegationsResponse{} - pageRes, err := query.Paginate(btcDelStore, req.Pagination, func(key, value []byte) error { - delBTCPK, err := bbn.NewBIP340PubKey(key) - if err != nil { - return err - } + if k.HasFinalityProvider(ctx, *fpPK) { + // this is a Babylon finality provider + btcDelStore := k.btcDelegatorFpStore(sdkCtx, fpPK) + pageRes, err = query.Paginate(btcDelStore, req.Pagination, func(key, value []byte) error { + delBTCPK, err := bbn.NewBIP340PubKey(key) + if err != nil { + return err + } - curBTCDels := k.getBTCDelegatorDelegations(sdkCtx, fpPK, delBTCPK) + curBTCDels := k.getBTCDelegatorDelegations(sdkCtx, fpPK, delBTCPK) - btcDelsResp := make([]*types.BTCDelegationResponse, len(curBTCDels.Dels)) - for i, btcDel := range curBTCDels.Dels { - status := btcDel.GetStatus( - btcHeight, - currentWValue, - covenantQuorum, - ) - btcDelsResp[i] = types.NewBTCDelegationResponse(btcDel, status) - } + btcDelsResp := make([]*types.BTCDelegationResponse, len(curBTCDels.Dels)) + for i, btcDel := range curBTCDels.Dels { + status := btcDel.GetStatus( + btcHeight, + currentWValue, + covenantQuorum, + ) + btcDelsResp[i] = types.NewBTCDelegationResponse(btcDel, status) + } - btcDels = append(btcDels, &types.BTCDelegatorDelegationsResponse{ - Dels: btcDelsResp, + btcDels = append(btcDels, &types.BTCDelegatorDelegationsResponse{ + Dels: btcDelsResp, + }) + return nil }) - return nil - }) - if err != nil { - return nil, err + if err != nil { + return nil, err + } + } else if k.bscKeeper.HasFinalityProvider(ctx, fpPK) { + // this is a consumer chain finality provider + btcDels, pageRes, err = k.bscKeeper.GetBTCDelegatorDelegationsResponses(sdkCtx, fpPK, req.Pagination, currentWValue, btcHeight, covenantQuorum) + if err != nil { + return nil, err + } + } else { + // the given finality provider is not found + return nil, types.ErrFpNotFound } return &types.QueryFinalityProviderDelegationsResponse{BtcDelegatorDelegations: btcDels, Pagination: pageRes}, nil diff --git a/x/btcstaking/keeper/incentive_test.go b/x/btcstaking/keeper/incentive_test.go index d6d3999ac..19d633df8 100644 --- a/x/btcstaking/keeper/incentive_test.go +++ b/x/btcstaking/keeper/incentive_test.go @@ -7,6 +7,7 @@ import ( "github.com/babylonchain/babylon/testutil/datagen" btclctypes "github.com/babylonchain/babylon/x/btclightclient/types" "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/btcsuite/btcd/btcec/v2" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) @@ -47,13 +48,14 @@ func FuzzRecordVotingPowerDistCache(f *testing.F) { stakingValue := datagen.RandomInt(r, 100000) + 100000 for _, fp := range fpsWithVotingPowerMap { for j := uint64(0); j < numBTCDels; j++ { - _, _, _, delMsg, del := h.CreateDelegation( + _, _, _, delMsg, del, err := h.CreateDelegation( r, - fp.BtcPk.MustToBTCPK(), + []*btcec.PublicKey{fp.BtcPk.MustToBTCPK()}, changeAddress.EncodeAddress(), int64(stakingValue), 1000, ) + h.NoError(err) h.CreateCovenantSigs(r, covenantSKs, delMsg, del) } } diff --git a/x/btcstaking/keeper/keeper_test.go b/x/btcstaking/keeper/keeper_test.go index 9a577a346..862332deb 100644 --- a/x/btcstaking/keeper/keeper_test.go +++ b/x/btcstaking/keeper/keeper_test.go @@ -27,14 +27,17 @@ var ( net = &chaincfg.SimNetParams ) +// TODO: move this to keeper package rather than keeper_test so that +// it can be inherited to test other modules? type Helper struct { t testing.TB Ctx sdk.Context BTCStakingKeeper *keeper.Keeper + BTCStkConsumerKeeper *bsckeeper.Keeper BTCLightClientKeeper *types.MockBTCLightClientKeeper - BTCCheckpointKeeper *types.MockBtcCheckpointKeeper CheckpointingKeeper *types.MockCheckpointingKeeper + BTCCheckpointKeeper *types.MockBtcCheckpointKeeper MsgServer types.MsgServer BtcStkConsumerMsgServer bsctypes.MsgServer Net *chaincfg.Params @@ -50,9 +53,10 @@ func NewHelper(t testing.TB, btclcKeeper *types.MockBTCLightClientKeeper, btccKe t: t, Ctx: ctx, BTCStakingKeeper: k, + BTCStkConsumerKeeper: bscKeeper, BTCLightClientKeeper: btclcKeeper, - BTCCheckpointKeeper: btccKeeper, CheckpointingKeeper: ckptKeeper, + BTCCheckpointKeeper: btccKeeper, MsgServer: msgSrvr, BtcStkConsumerMsgServer: btcStkConsumerMsgServer, Net: &chaincfg.SimNetParams, @@ -146,9 +150,33 @@ func (h *Helper) CreateFinalityProvider(r *rand.Rand) (*btcec.PrivateKey, *btcec return fpSK, fpPK, fp } +func (h *Helper) CreateConsumerChainFinalityProvider(r *rand.Rand, chainID string) (*btcec.PrivateKey, *btcec.PublicKey, *types.FinalityProvider, error) { + fpSK, fpPK, err := datagen.GenRandomBTCKeyPair(r) + if err != nil { + return nil, nil, nil, err + } + fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, fpSK) + if err != nil { + return nil, nil, nil, err + } + fp.ChainId = chainID + msgNewFp := types.MsgCreateFinalityProvider{ + Description: fp.Description, + Commission: fp.Commission, + BtcPk: fp.BtcPk, + Pop: fp.Pop, + ChainId: fp.ChainId, + } + _, err = h.MsgServer.CreateFinalityProvider(h.Ctx, &msgNewFp) + if err != nil { + return nil, nil, nil, err + } + return fpSK, fpPK, fp, nil +} + func (h *Helper) CreateDelegationCustom( r *rand.Rand, - fpPK *btcec.PublicKey, + fpPKs []*btcec.PublicKey, changeAddress string, stakingValue int64, stakingTime uint16, @@ -167,7 +195,7 @@ func (h *Helper) CreateDelegationCustom( h.t, h.Net, delSK, - []*btcec.PublicKey{fpPK}, + fpPKs, covPKs, bsParams.CovenantQuorum, stakingTimeBlocks, @@ -224,7 +252,7 @@ func (h *Helper) CreateDelegationCustom( h.t, h.Net, delSK, - []*btcec.PublicKey{fpPK}, + fpPKs, covPKs, bsParams.CovenantQuorum, wire.NewOutPoint(&stkTxHash, stkOutputIdx), @@ -243,11 +271,10 @@ func (h *Helper) CreateDelegationCustom( h.NoError(err) // all good, construct and send MsgCreateBTCDelegation message - fpBTCPK := bbn.NewBIP340PubKeyFromBTCPK(fpPK) msgCreateBTCDel := &types.MsgCreateBTCDelegation{ StakerAddr: staker.String(), BtcPk: stPk, - FpBtcPkList: []bbn.BIP340PubKey{*fpBTCPK}, + FpBtcPkList: bbn.NewBIP340PKsFromBTCPKs(fpPKs), Pop: pop, StakingTime: uint32(stakingTimeBlocks), StakingValue: stakingValue, @@ -271,11 +298,11 @@ func (h *Helper) CreateDelegationCustom( func (h *Helper) CreateDelegation( r *rand.Rand, - fpPK *btcec.PublicKey, + fpPKs []*btcec.PublicKey, changeAddress string, stakingValue int64, stakingTime uint16, -) (string, *btcec.PrivateKey, *btcec.PublicKey, *types.MsgCreateBTCDelegation, *types.BTCDelegation) { +) (string, *btcec.PrivateKey, *btcec.PublicKey, *types.MsgCreateBTCDelegation, *types.BTCDelegation, error) { bsParams := h.BTCStakingKeeper.GetParams(h.Ctx) bcParams := h.BTCCheckpointKeeper.GetParams(h.Ctx) @@ -286,22 +313,27 @@ func (h *Helper) CreateDelegation( stakingTxHash, delSK, delPK, msgCreateBTCDel, err := h.CreateDelegationCustom( r, - fpPK, + fpPKs, changeAddress, stakingValue, stakingTime, stakingValue-1000, uint16(minUnbondingTime)+1, ) - - h.NoError(err) + if err != nil { + return "", nil, nil, nil, nil, err + } stakingMsgTx, err := bbn.NewBTCTxFromBytes(msgCreateBTCDel.StakingTx.Transaction) - h.NoError(err) + if err != nil { + return "", nil, nil, nil, nil, err + } btcDel, err := h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingMsgTx.TxHash().String()) - h.NoError(err) + if err != nil { + return "", nil, nil, nil, nil, err + } - return stakingTxHash, delSK, delPK, msgCreateBTCDel, btcDel + return stakingTxHash, delSK, delPK, msgCreateBTCDel, btcDel, nil } func (h *Helper) GenerateCovenantSignaturesMessages( @@ -410,8 +442,7 @@ func (h *Helper) CreateCovenantSigs( require.NotNil(h.t, actualDelWithCovenantSigs.BtcUndelegation.CovenantUnbondingSigList) require.Len(h.t, actualDelWithCovenantSigs.BtcUndelegation.CovenantUnbondingSigList, int(bsParams.CovenantQuorum)) require.Len(h.t, actualDelWithCovenantSigs.BtcUndelegation.CovenantSlashingSigs, int(bsParams.CovenantQuorum)) - require.Len(h.t, actualDelWithCovenantSigs.BtcUndelegation.CovenantSlashingSigs[0].AdaptorSigs, 1) - + require.Len(h.t, actualDelWithCovenantSigs.BtcUndelegation.CovenantSlashingSigs[0].AdaptorSigs, len(del.FpBtcPkList)) } func (h *Helper) GetDelegationAndCheckValues( diff --git a/x/btcstaking/keeper/msg_server.go b/x/btcstaking/keeper/msg_server.go index 10067748c..87b497fba 100644 --- a/x/btcstaking/keeper/msg_server.go +++ b/x/btcstaking/keeper/msg_server.go @@ -221,6 +221,16 @@ func (ms msgServer) CreateBTCDelegation(goCtx context.Context, req *types.MsgCre } } + // Ensure all finality providers are known to Babylon and at least 1 one of them + // is a Babylon finality provider, and then check whether the BTC stake is + // restaked to FPs of consumer chains + // TODO: ensure the BTC delegation does not restake to too many finality providers + // (pending concrete design) + restakedToConsumers, err := ms.validateRestakedFPs(ctx, req.FpBtcPkList) + if err != nil { + return nil, err + } + // Parse staking tx stakingMsgTx, err := bbn.NewBTCTxFromBytes(req.StakingTx.Transaction) if err != nil { @@ -463,6 +473,15 @@ func (ms msgServer) CreateBTCDelegation(goCtx context.Context, req *types.MsgCre if err := ms.AddBTCDelegation(ctx, newBTCDel); err != nil { panic(fmt.Errorf("failed to add BTC delegation that has passed verification: %w", err)) } + // if this BTC delegation restaked to consumer chains' FPs, add it to + // btcstkconsumer module's storage as well + // TODO: revisit the relationship between BTC staking module and BTC staking consumer + // module and consolidating the storage of BTC delegations. + if restakedToConsumers { + if err := ms.bscKeeper.AddBTCDelegation(ctx, newBTCDel); err != nil { + panic(fmt.Errorf("failed to add BTC delegation restaked to consumer chains' finality providers despite it has passed verification: %w", err)) + } + } return &types.MsgCreateBTCDelegationResponse{}, nil } @@ -500,6 +519,12 @@ func (ms msgServer) AddCovenantSigs(goCtx context.Context, req *types.MsgAddCove return nil, err } + // check whether the BTC stake is restaked to FPs of consumer chains + restakedToConsumers, err := ms.validateRestakedFPs(ctx, btcDel.FpBtcPkList) + if err != nil { + panic(err) // btcDel has passed verification and this can only be programming error + } + // ensure that the given covenant PK is in the parameter if !params.HasCovenantPK(req.Pk) { return nil, types.ErrInvalidCovenantPK.Wrapf("covenant pk: %s", req.Pk.MarshalHex()) @@ -622,6 +647,7 @@ func (ms msgServer) AddCovenantSigs(goCtx context.Context, req *types.MsgAddCove req.UnbondingTxSig, parsedUnbondingSlashingAdaptorSignatures, params, + restakedToConsumers, ) return &types.MsgAddCovenantSigsResponse{}, nil @@ -645,6 +671,12 @@ func (ms msgServer) BTCUndelegate(goCtx context.Context, req *types.MsgBTCUndele return nil, err } + // check whether the BTC stake is restaked to FPs of consumer chains + restakedToConsumers, err := ms.validateRestakedFPs(ctx, btcDel.FpBtcPkList) + if err != nil { + panic(err) // btcDel has passed verification and this can only be programming error + } + // ensure the BTC delegation with the given staking tx hash is active btcTip := ms.btclcKeeper.GetTipInfo(ctx) wValue := ms.btccKeeper.GetParams(ctx).CheckpointFinalizationTimeout @@ -679,7 +711,7 @@ func (ms msgServer) BTCUndelegate(goCtx context.Context, req *types.MsgBTCUndele // all good, add the signature to BTC delegation's undelegation // and set back - ms.btcUndelegate(ctx, btcDel, req.UnbondingTxSig) + ms.btcUndelegate(ctx, btcDel, req.UnbondingTxSig, restakedToConsumers) return &types.MsgBTCUndelegateResponse{}, nil } diff --git a/x/btcstaking/keeper/msg_server_test.go b/x/btcstaking/keeper/msg_server_test.go index 5038d7d58..d286c107a 100644 --- a/x/btcstaking/keeper/msg_server_test.go +++ b/x/btcstaking/keeper/msg_server_test.go @@ -158,13 +158,14 @@ func FuzzCreateBTCDelegation(f *testing.F) { // generate and insert new BTC delegation stakingValue := int64(2 * 10e8) - stakingTxHash, _, _, msgCreateBTCDel, _ := h.CreateDelegation( + stakingTxHash, _, _, msgCreateBTCDel, _, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, ) + h.NoError(err) // ensure consistency between the msg and the BTC delegation in DB actualDel, err := h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingTxHash) @@ -203,13 +204,14 @@ func TestProperVersionInDelegation(t *testing.T) { // generate and insert new BTC delegation stakingValue := int64(2 * 10e8) - stakingTxHash, _, _, _, _ := h.CreateDelegation( + stakingTxHash, _, _, _, _, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, ) + require.NoError(t, err) // ensure consistency between the msg and the BTC delegation in DB actualDel, err := h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingTxHash) @@ -230,7 +232,7 @@ func TestProperVersionInDelegation(t *testing.T) { // create new delegation stakingTxHash1, _, _, _, err := h.CreateDelegationCustom( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, @@ -271,13 +273,14 @@ func FuzzAddCovenantSigs(f *testing.F) { // generate and insert new BTC delegation stakingValue := int64(2 * 10e8) - stakingTxHash, _, _, msgCreateBTCDel, _ := h.CreateDelegation( + stakingTxHash, _, _, msgCreateBTCDel, _, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, ) + h.NoError(err) // ensure consistency between the msg and the BTC delegation in DB actualDel, err := h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingTxHash) @@ -339,13 +342,14 @@ func FuzzBTCUndelegate(f *testing.F) { // generate and insert new BTC delegation stakingValue := int64(2 * 10e8) - stakingTxHash, delSK, _, msgCreateBTCDel, actualDel := h.CreateDelegation( + stakingTxHash, delSK, _, msgCreateBTCDel, actualDel, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, ) + h.NoError(err) // add covenant signatures to this BTC delegation h.CreateCovenantSigs(r, covenantSKs, msgCreateBTCDel, actualDel) @@ -411,13 +415,14 @@ func FuzzSelectiveSlashing(f *testing.F) { // generate and insert new BTC delegation stakingValue := int64(2 * 10e8) - stakingTxHash, _, _, msgCreateBTCDel, actualDel := h.CreateDelegation( + stakingTxHash, _, _, msgCreateBTCDel, actualDel, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, ) + h.NoError(err) // add covenant signatures to this BTC delegation // so that the BTC delegation becomes bonded @@ -478,13 +483,14 @@ func FuzzSelectiveSlashing_StakingTx(f *testing.F) { // generate and insert new BTC delegation stakingValue := int64(2 * 10e8) - stakingTxHash, _, _, msgCreateBTCDel, actualDel := h.CreateDelegation( + stakingTxHash, _, _, msgCreateBTCDel, actualDel, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, ) + h.NoError(err) // add covenant signatures to this BTC delegation // so that the BTC delegation becomes bonded @@ -723,7 +729,7 @@ func TestCorrectUnbondingTimeInDelegation(t *testing.T) { stakingValue := int64(2 * 10e8) stakingTxHash, _, _, _, err := h.CreateDelegationCustom( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, @@ -795,7 +801,7 @@ func TestMinimalUnbondingRate(t *testing.T) { // generate and insert new BTC delegation stakingTxHash, _, _, _, err := h.CreateDelegationCustom( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), tt.stakingValue, 1000, diff --git a/x/btcstaking/keeper/power_dist_change_test.go b/x/btcstaking/keeper/power_dist_change_test.go index da4ec9502..01f2db213 100644 --- a/x/btcstaking/keeper/power_dist_change_test.go +++ b/x/btcstaking/keeper/power_dist_change_test.go @@ -47,7 +47,8 @@ func FuzzProcessAllPowerDistUpdateEvents_Determinism(f *testing.F) { events := []*types.EventPowerDistUpdate{} for _, fpPK := range fpPKs { for i := 0; i < 5; i++ { - _, _, _, _, del := h.CreateDelegation(r, fpPK, changeAddress.EncodeAddress(), stakingValue, 1000) + _, _, _, _, del, err := h.CreateDelegation(r, []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000) + require.NoError(t, err) event := types.NewEventPowerDistUpdateWithBTCDel(&types.EventBTCDelegationStateUpdate{ StakingTxHash: del.MustGetStakingTxHash().String(), NewState: types.BTCDelegationStatus_ACTIVE, @@ -91,13 +92,15 @@ func FuzzFinalityProviderEvents(f *testing.F) { ensure that it has voting power */ stakingValue := int64(2 * 10e8) - _, _, _, msgCreateBTCDel, actualDel := h.CreateDelegation( + _, _, _, msgCreateBTCDel, actualDel, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, ) + h.NoError(err) + // give it a quorum number of covenant signatures msgs := h.GenerateCovenantSignaturesMessages(r, covenantSKs, msgCreateBTCDel, actualDel) for i := 0; i < int(h.BTCStakingKeeper.GetParams(h.Ctx).CovenantQuorum); i++ { @@ -166,13 +169,14 @@ func FuzzBTCDelegationEvents(f *testing.F) { // generate and insert new BTC delegation stakingValue := int64(2 * 10e8) - expectedStakingTxHash, _, _, msgCreateBTCDel, actualDel := h.CreateDelegation( + expectedStakingTxHash, _, _, msgCreateBTCDel, actualDel, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), stakingValue, 1000, ) + h.NoError(err) /* at this point, there should be 1 event that BTC delegation diff --git a/x/btcstaking/keeper/restaking_test.go b/x/btcstaking/keeper/restaking_test.go new file mode 100644 index 000000000..a36a71a20 --- /dev/null +++ b/x/btcstaking/keeper/restaking_test.go @@ -0,0 +1,212 @@ +package keeper_test + +import ( + "errors" + "math/rand" + "testing" + + "github.com/babylonchain/babylon/testutil/datagen" + bbn "github.com/babylonchain/babylon/types" + "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" +) + +func FuzzRestaking_RestakedBTCDelegation(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // mock BTC light client and BTC checkpoint modules + btclcKeeper := types.NewMockBTCLightClientKeeper(ctrl) + btccKeeper := types.NewMockBtcCheckpointKeeper(ctrl) + ckptKeeper := types.NewMockCheckpointingKeeper(ctrl) + h := NewHelper(t, btclcKeeper, btccKeeper, ckptKeeper) + + // set all parameters + covenantSKs, _ := h.GenAndApplyParams(r) + changeAddress, err := datagen.GenRandomBTCAddress(r, h.Net) + h.NoError(err) + + bsParams := h.BTCStakingKeeper.GetParams(h.Ctx) + wValue := h.BTCCheckpointKeeper.GetParams(h.Ctx).CheckpointFinalizationTimeout + + // generate and insert new Babylon finality provider + _, fpPK, fp := h.CreateFinalityProvider(r) + t.Log(changeAddress, fpPK, fp) + /* + ensure that registering a consumer chain finality provider with non-existing + chain ID will fail + */ + _, _, _, err = h.CreateConsumerChainFinalityProvider(r, "non-existing chain ID") + h.Error(err) + + /* + register a new consumer chain and create a new finality provider under it + ensure it's correctly generated + */ + chainRegister := datagen.GenRandomChainRegister(r) + h.BTCStkConsumerKeeper.SetChainRegister(h.Ctx, chainRegister) + _, czFPPK, czFP, err := h.CreateConsumerChainFinalityProvider(r, chainRegister.ChainId) + h.NoError(err) + czFPBTCPK := bbn.NewBIP340PubKeyFromBTCPK(czFPPK) + czFP2, err := h.BTCStkConsumerKeeper.GetFinalityProvider(h.Ctx, chainRegister.ChainId, czFPBTCPK) + h.NoError(err) + require.Equal(t, czFP, czFP2) + + /* + ensure BTC delegation request will fail if some fp PK does not exist + */ + stakingValue := int64(2 * 10e8) + _, randomFPPK, err := datagen.GenRandomBTCKeyPair(r) + h.NoError(err) + _, _, _, _, _, err = h.CreateDelegation( + r, + []*btcec.PublicKey{fpPK, randomFPPK}, + changeAddress.EncodeAddress(), + stakingValue, + 1000, + ) + h.Error(err) + require.True(t, errors.Is(err, types.ErrFpNotFound)) + + /* + ensure BTC delegation request will fail if no PK corresponds to a Babylon fp + */ + _, _, _, _, _, err = h.CreateDelegation( + r, + []*btcec.PublicKey{czFPPK}, + changeAddress.EncodeAddress(), + stakingValue, + 1000, + ) + h.Error(err) + require.True(t, errors.Is(err, types.ErrNoBabylonFPRestaked)) + + /* + happy case -- restaking to a Babylon fp and a consumer chain fp + */ + _, _, _, msgBTCDel, actualDel, err := h.CreateDelegation( + r, + []*btcec.PublicKey{fpPK, czFPPK}, + changeAddress.EncodeAddress(), + stakingValue, + 1000, + ) + h.NoError(err) + + // add covenant signatures to this restaked BTC delegation + h.CreateCovenantSigs(r, covenantSKs, msgBTCDel, actualDel) + + // ensure the restaked BTC delegation is bonded right now + stakingTxHash := actualDel.MustGetStakingTxHash() + actualDel, err = h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingTxHash.String()) + h.NoError(err) + btcTip := h.BTCLightClientKeeper.GetTipInfo(h.Ctx).Height + status := actualDel.GetStatus(btcTip, wValue, bsParams.CovenantQuorum) + require.Equal(t, types.BTCDelegationStatus_ACTIVE, status) + }) +} + +func FuzzFinalityProviderDelegations_RestakingConsumerChains(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // mock BTC light client and BTC checkpoint modules + btclcKeeper := types.NewMockBTCLightClientKeeper(ctrl) + btccKeeper := types.NewMockBtcCheckpointKeeper(ctrl) + ckptKeeper := types.NewMockCheckpointingKeeper(ctrl) + h := NewHelper(t, btclcKeeper, btccKeeper, ckptKeeper) + + // set all parameters + h.GenAndApplyParams(r) + changeAddress, err := datagen.GenRandomBTCAddress(r, h.Net) + h.NoError(err) + + // register a new consumer chain + chainRegister := datagen.GenRandomChainRegister(r) + h.BTCStkConsumerKeeper.SetChainRegister(h.Ctx, chainRegister) + + // generate and insert new Babylon finality provider + _, fpPK, fp := h.CreateFinalityProvider(r) + + // generate and insert new consumer chain finality provider + _, czFPPK, czFP, err := h.CreateConsumerChainFinalityProvider(r, chainRegister.ChainId) + h.NoError(err) + + // Generate a random number of BTC delegations under this finality provider + numBTCDels := datagen.RandomInt(r, 10) + 1 + expectedBtcDelsMap := make(map[string]*types.BTCDelegation) + stakingValue := int64(2 * 10e8) + for j := uint64(0); j < numBTCDels; j++ { + _, _, _, _, btcDel, err := h.CreateDelegation( + r, + []*btcec.PublicKey{fpPK, czFPPK}, + changeAddress.EncodeAddress(), + stakingValue, + 1000, + ) + h.NoError(err) + expectedBtcDelsMap[btcDel.BtcPk.MarshalHex()] = btcDel + } + + // Test nil request + resp, err := h.BTCStakingKeeper.FinalityProviderDelegations(h.Ctx, nil) + require.Nil(t, resp) + require.Error(t, err) + + /* + Test BTC delegator delegations under the Babylon finality provider + or the consumer chain finality provider + */ + + // Generate a page request with a limit and a nil key + // query a page of BTC delegations and assert consistency + limit := datagen.RandomInt(r, len(expectedBtcDelsMap)) + 1 + pagination := constructRequestWithLimit(r, limit) + + // the tested finality provider is under Babylon or consumer chain + testedFP := fp + if datagen.OneInN(r, 2) { + testedFP = czFP + } + + // Generate the initial query + req := types.QueryFinalityProviderDelegationsRequest{ + FpBtcPkHex: testedFP.BtcPk.MarshalHex(), + Pagination: pagination, + } + // Construct a mapping from the finality providers found to a boolean value + // Will be used later to evaluate whether all the finality providers were returned + btcDelsFound := make(map[string]bool, 0) + for i := uint64(0); i < numBTCDels; i += limit { + resp, err = h.BTCStakingKeeper.FinalityProviderDelegations(h.Ctx, &req) + require.NoError(t, err) + require.NotNil(t, resp) + for _, btcDels := range resp.BtcDelegatorDelegations { + require.Len(t, btcDels.Dels, 1) + btcDel := btcDels.Dels[0] + require.Len(t, btcDel.FpBtcPkList, 2) + require.Equal(t, fp.BtcPk, &btcDel.FpBtcPkList[0]) // Babylon finality provider + require.Equal(t, czFP.BtcPk, &btcDel.FpBtcPkList[1]) // consumer chain finality provider + // Check if the pk exists in the map + _, ok := expectedBtcDelsMap[btcDel.BtcPk.MarshalHex()] + require.True(t, ok) + btcDelsFound[btcDel.BtcPk.MarshalHex()] = true + } + // Construct the next page request + pagination = constructRequestWithKeyAndLimit(r, resp.Pagination.NextKey, limit) + req = types.QueryFinalityProviderDelegationsRequest{ + FpBtcPkHex: testedFP.BtcPk.MarshalHex(), + Pagination: pagination, + } + } + require.Equal(t, len(btcDelsFound), len(expectedBtcDelsMap)) + }) +} diff --git a/x/btcstaking/keeper/voting_power_table_test.go b/x/btcstaking/keeper/voting_power_table_test.go index 82ac32e6d..7d11a6974 100644 --- a/x/btcstaking/keeper/voting_power_table_test.go +++ b/x/btcstaking/keeper/voting_power_table_test.go @@ -8,6 +8,7 @@ import ( "github.com/babylonchain/babylon/testutil/datagen" btclctypes "github.com/babylonchain/babylon/x/btclightclient/types" "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/btcsuite/btcd/btcec/v2" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) @@ -45,13 +46,14 @@ func FuzzVotingPowerTable(f *testing.F) { stakingValue := datagen.RandomInt(r, 100000) + 100000 for i := uint64(0); i < numFpsWithVotingPower; i++ { for j := uint64(0); j < numBTCDels; j++ { - _, _, _, delMsg, del := h.CreateDelegation( + _, _, _, delMsg, del, err := h.CreateDelegation( r, - fps[i].BtcPk.MustToBTCPK(), + []*btcec.PublicKey{fps[i].BtcPk.MustToBTCPK()}, changeAddress.EncodeAddress(), int64(stakingValue), 1000, ) + h.NoError(err) h.CreateCovenantSigs(r, covenantSKs, delMsg, del) } } @@ -179,13 +181,14 @@ func FuzzVotingPowerTable_ActiveFinalityProviders(f *testing.F) { // delegate to this finality provider stakingValue := datagen.RandomInt(r, 100000) + 100000 - _, _, _, delMsg, del := h.CreateDelegation( + _, _, _, delMsg, del, err := h.CreateDelegation( r, - fp.BtcPk.MustToBTCPK(), + []*btcec.PublicKey{fp.BtcPk.MustToBTCPK()}, changeAddress.EncodeAddress(), int64(stakingValue), 1000, ) + h.NoError(err) h.CreateCovenantSigs(r, covenantSKs, delMsg, del) // record voting power @@ -279,13 +282,14 @@ func FuzzVotingPowerTable_ActiveFinalityProviderRotation(f *testing.F) { // create BTC delegation and add covenant signatures to activate it stakingValue := datagen.RandomInt(r, 100000) + 100000 - _, _, _, delMsg, del := h.CreateDelegation( + _, _, _, delMsg, del, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), int64(stakingValue), 1000, ) + h.NoError(err) h.CreateCovenantSigs(r, covenantSKs, delMsg, del) // record voting power @@ -328,13 +332,14 @@ func FuzzVotingPowerTable_ActiveFinalityProviderRotation(f *testing.F) { stakingValue := datagen.RandomInt(r, 100000) + 100000 fpBTCPK := fpsWithMeta[i].BtcPk - _, _, _, delMsg, del := h.CreateDelegation( + _, _, _, delMsg, del, err := h.CreateDelegation( r, - fpBTCPK.MustToBTCPK(), + []*btcec.PublicKey{fpBTCPK.MustToBTCPK()}, changeAddress.EncodeAddress(), int64(stakingValue), 1000, ) + h.NoError(err) h.CreateCovenantSigs(r, covenantSKs, delMsg, del) // accumulate voting power for this finality provider @@ -353,13 +358,14 @@ func FuzzVotingPowerTable_ActiveFinalityProviderRotation(f *testing.F) { // create BTC delegation and add covenant signatures to activate it stakingValue := datagen.RandomInt(r, 100000) + 100000 - _, _, _, delMsg, del := h.CreateDelegation( + _, _, _, delMsg, del, err := h.CreateDelegation( r, - fpPK, + []*btcec.PublicKey{fpPK}, changeAddress.EncodeAddress(), int64(stakingValue), 1000, ) + h.NoError(err) h.CreateCovenantSigs(r, covenantSKs, delMsg, del) // record voting power diff --git a/x/btcstaking/types/errors.go b/x/btcstaking/types/errors.go index 0e17eeb47..32e4eba69 100644 --- a/x/btcstaking/types/errors.go +++ b/x/btcstaking/types/errors.go @@ -32,4 +32,5 @@ var ( ErrVotingPowerDistCacheNotFound = errorsmod.Register(ModuleName, 1123, "the voting power distribution cache is not found") ErrParamsNotFound = errorsmod.Register(ModuleName, 1124, "the parameters are not found") ErrChainIDNotRegistered = errorsmod.Register(ModuleName, 1125, "CZ chain not registered") + ErrNoBabylonFPRestaked = errorsmod.Register(ModuleName, 1126, "the BTC delegation request does not restake to any Babylon finality provider") ) diff --git a/x/btcstaking/types/expected_keepers.go b/x/btcstaking/types/expected_keepers.go index 3782a9a75..30369eac2 100644 --- a/x/btcstaking/types/expected_keepers.go +++ b/x/btcstaking/types/expected_keepers.go @@ -8,6 +8,8 @@ import ( btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" btclctypes "github.com/babylonchain/babylon/x/btclightclient/types" etypes "github.com/babylonchain/babylon/x/epoching/types" + sdk "github.com/cosmos/cosmos-sdk/types" + query "github.com/cosmos/cosmos-sdk/types/query" ) type BTCLightClientKeeper interface { @@ -30,4 +32,7 @@ type BTCStkConsumerKeeper interface { IsChainRegistered(ctx context.Context, chainID string) bool HasFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) bool SetFinalityProvider(ctx context.Context, fp *FinalityProvider) + AddBTCDelegation(ctx sdk.Context, btcDel *BTCDelegation) error + SetBTCDelegation(ctx context.Context, btcDel *BTCDelegation) + GetBTCDelegatorDelegationsResponses(ctx sdk.Context, fpBTCPK *bbn.BIP340PubKey, pagination *query.PageRequest, wValue uint64, btcHeight uint64, covenantQuorum uint32) ([]*BTCDelegatorDelegationsResponse, *query.PageResponse, error) } diff --git a/x/btcstkconsumer/keeper/btc_delegations.go b/x/btcstkconsumer/keeper/btc_delegations.go new file mode 100644 index 000000000..1669f9c38 --- /dev/null +++ b/x/btcstkconsumer/keeper/btc_delegations.go @@ -0,0 +1,184 @@ +package keeper + +import ( + "context" + + "cosmossdk.io/store/prefix" + bbn "github.com/babylonchain/babylon/types" + bstypes "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/cosmos/cosmos-sdk/runtime" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" +) + +// AddBTCDelegation adds a BTC delegation post verification to the system, including +// - indexing the given BTC delegation in the BTC delegator store, and +// - saving it under BTC delegation store +// CONTRACT: this function only takes BTC delegations that have passed verifications +// imposed in `x/btcstaking/msg_server.go` +// TODO: is it possible to not replicate the storage of restaked BTC delegation? +func (k Keeper) AddBTCDelegation(ctx sdk.Context, btcDel *bstypes.BTCDelegation) error { + if err := btcDel.ValidateBasic(); err != nil { + return err + } + + // get staking tx hash + stakingTxHash, err := btcDel.GetStakingTxHash() + if err != nil { + return err + } + + // for each finality provider the delegation restakes to, update its index + for _, fpBTCPK := range btcDel.FpBtcPkList { + // skip Babylon finality providers + if !k.HasFinalityProvider(ctx, &fpBTCPK) { + continue + } + + // get BTC delegation index under this finality provider + btcDelIndex := k.getBTCDelegatorDelegationIndex(ctx, &fpBTCPK, btcDel.BtcPk) + if btcDelIndex == nil { + btcDelIndex = bstypes.NewBTCDelegatorDelegationIndex() + } + // index staking tx hash of this BTC delegation + if err := btcDelIndex.Add(stakingTxHash); err != nil { + return bstypes.ErrInvalidStakingTx.Wrapf(err.Error()) + } + // save the index + k.setBTCDelegatorDelegationIndex(ctx, &fpBTCPK, btcDel.BtcPk, btcDelIndex) + } + + // save this BTC delegation + k.SetBTCDelegation(ctx, btcDel) + + return nil +} + +// GetBTCDelegatorDelegationsResponses gets BTC delegations of BTC delegators under +// the given finality provider. The BTC delegators are paginated. This function is +// used by the `FinalityProviderDelegations` query in BTC staking module +func (k Keeper) GetBTCDelegatorDelegationsResponses( + ctx sdk.Context, + fpBTCPK *bbn.BIP340PubKey, + pagination *query.PageRequest, + wValue uint64, + btcHeight uint64, + covenantQuorum uint32, +) ([]*bstypes.BTCDelegatorDelegationsResponse, *query.PageResponse, error) { + btcDelStore := k.btcDelegatorStore(ctx, fpBTCPK) + + btcDels := []*bstypes.BTCDelegatorDelegationsResponse{} + pageRes, err := query.Paginate(btcDelStore, pagination, func(key, value []byte) error { + delBTCPK, err := bbn.NewBIP340PubKey(key) + if err != nil { + return err + } + + curBTCDels := k.getBTCDelegatorDelegations(ctx, fpBTCPK, delBTCPK) + + btcDelsResp := make([]*bstypes.BTCDelegationResponse, len(curBTCDels.Dels)) + for i, btcDel := range curBTCDels.Dels { + status := btcDel.GetStatus( + btcHeight, + wValue, + covenantQuorum, + ) + btcDelsResp[i] = bstypes.NewBTCDelegationResponse(btcDel, status) + } + + btcDels = append(btcDels, &bstypes.BTCDelegatorDelegationsResponse{ + Dels: btcDelsResp, + }) + return nil + }) + if err != nil { + return nil, nil, err + } + return btcDels, pageRes, nil +} + +func (k Keeper) SetBTCDelegation(ctx context.Context, btcDel *bstypes.BTCDelegation) { + store := k.btcDelegationStore(ctx) + stakingTxHash := btcDel.MustGetStakingTxHash() + btcDelBytes := k.cdc.MustMarshal(btcDel) + store.Set(stakingTxHash[:], btcDelBytes) +} + +func (k Keeper) getBTCDelegation(ctx context.Context, stakingTxHash chainhash.Hash) *bstypes.BTCDelegation { + store := k.btcDelegationStore(ctx) + btcDelBytes := store.Get(stakingTxHash[:]) + if len(btcDelBytes) == 0 { + return nil + } + var btcDel bstypes.BTCDelegation + k.cdc.MustUnmarshal(btcDelBytes, &btcDel) + return &btcDel +} + +// btcDelegationStore returns the KVStore of the BTC delegations +// prefix: BTCDelegationKey +// key: BTC delegation's staking tx hash +// value: BTCDelegation +func (k Keeper) btcDelegationStore(ctx context.Context) prefix.Store { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + return prefix.NewStore(storeAdapter, types.BTCDelegationKey) +} + +// getBTCDelegatorDelegationIndex gets the BTC delegation index with a given BTC PK under a given finality provider +func (k Keeper) getBTCDelegatorDelegationIndex(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey) *bstypes.BTCDelegatorDelegationIndex { + // ensure the finality provider exists + if !k.HasFinalityProvider(ctx, fpBTCPK) { + return nil + } + + delBTCPKBytes := delBTCPK.MustMarshal() + store := k.btcDelegatorStore(ctx, fpBTCPK) + + // ensure BTC delegator exists + if !store.Has(delBTCPKBytes) { + return nil + } + // get and unmarshal + var btcDelIndex bstypes.BTCDelegatorDelegationIndex + btcDelIndexBytes := store.Get(delBTCPKBytes) + k.cdc.MustUnmarshal(btcDelIndexBytes, &btcDelIndex) + return &btcDelIndex +} + +func (k Keeper) setBTCDelegatorDelegationIndex(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey, btcDelIndex *bstypes.BTCDelegatorDelegationIndex) { + store := k.btcDelegatorStore(ctx, fpBTCPK) + btcDelIndexBytes := k.cdc.MustMarshal(btcDelIndex) + store.Set(*delBTCPK, btcDelIndexBytes) +} + +// getBTCDelegatorDelegations gets the BTC delegations with a given BTC PK under a given finality provider +func (k Keeper) getBTCDelegatorDelegations(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey) *bstypes.BTCDelegatorDelegations { + btcDelIndex := k.getBTCDelegatorDelegationIndex(ctx, fpBTCPK, delBTCPK) + if btcDelIndex == nil { + return nil + } + // get BTC delegation from each staking tx hash + btcDels := []*bstypes.BTCDelegation{} + for _, stakingTxHashBytes := range btcDelIndex.StakingTxHashList { + stakingTxHash, err := chainhash.NewHash(stakingTxHashBytes) + if err != nil { + // failing to unmarshal hash bytes in DB's BTC delegation index is a programming error + panic(err) + } + btcDel := k.getBTCDelegation(ctx, *stakingTxHash) + btcDels = append(btcDels, btcDel) + } + return &bstypes.BTCDelegatorDelegations{Dels: btcDels} +} + +// btcDelegatorStore returns the KVStore of the BTC delegators +// prefix: BTCDelegatorKey || finality provider's Bitcoin secp256k1 PK +// key: delegator's Bitcoin secp256k1 PK +// value: BTCDelegatorDelegationIndex (a list of BTCDelegations' staking tx hashes) +func (k Keeper) btcDelegatorStore(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) prefix.Store { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + delegationStore := prefix.NewStore(storeAdapter, types.BTCDelegatorKey) + return prefix.NewStore(delegationStore, fpBTCPK.MustMarshal()) +} diff --git a/x/btcstkconsumer/keeper/consumer_chain_registry_test.go b/x/btcstkconsumer/keeper/consumer_chain_registry_test.go index c0f753667..0a4298615 100644 --- a/x/btcstkconsumer/keeper/consumer_chain_registry_test.go +++ b/x/btcstkconsumer/keeper/consumer_chain_registry_test.go @@ -1,7 +1,6 @@ package keeper_test import ( - "github.com/babylonchain/babylon/x/btcstkconsumer/types" "math/rand" "testing" @@ -19,37 +18,27 @@ func FuzzChainRegistry(f *testing.F) { babylonApp := app.Setup(t, false) zcKeeper := babylonApp.BTCStkConsumerKeeper ctx := babylonApp.NewContext(false) - // Create a random chain id that starts with "test-" - czChainID := "test-" + datagen.GenRandomHexStr(r, 10) + + // generate a random chain register + chainRegister := datagen.GenRandomChainRegister(r) // check that the chain is not registered - isRegistered := zcKeeper.IsChainRegistered(ctx, czChainID) + isRegistered := zcKeeper.IsChainRegistered(ctx, chainRegister.ChainId) require.False(t, isRegistered) - // Create a random chain name - czChainName := datagen.GenRandomHexStr(r, 5) - // Create a random chain description - czChainDesc := "Chain description: " + datagen.GenRandomHexStr(r, 15) // Check that the chain is not registered - chainRegister, err := zcKeeper.GetChainRegister(ctx, czChainID) + chainRegister2, err := zcKeeper.GetChainRegister(ctx, chainRegister.ChainId) require.Error(t, err) - require.Nil(t, chainRegister) - - // Populate ChainRegister object - chainRegister = &types.ChainRegister{ - ChainId: czChainID, - ChainName: czChainName, - ChainDescription: czChainDesc, - } + require.Nil(t, chainRegister2) // Register the chain zcKeeper.SetChainRegister(ctx, chainRegister) // check that the chain is registered - chainRegister, err = zcKeeper.GetChainRegister(ctx, czChainID) + chainRegister2, err = zcKeeper.GetChainRegister(ctx, chainRegister.ChainId) require.NoError(t, err) - require.Equal(t, czChainID, chainRegister.ChainId) - require.Equal(t, czChainName, chainRegister.ChainName) - require.Equal(t, czChainDesc, chainRegister.ChainDescription) + require.Equal(t, chainRegister.ChainId, chainRegister2.ChainId) + require.Equal(t, chainRegister.ChainName, chainRegister2.ChainName) + require.Equal(t, chainRegister.ChainDescription, chainRegister2.ChainDescription) }) } diff --git a/x/btcstkconsumer/types/keys.go b/x/btcstkconsumer/types/keys.go index 9ec97f404..309d6f627 100644 --- a/x/btcstkconsumer/types/keys.go +++ b/x/btcstkconsumer/types/keys.go @@ -19,6 +19,8 @@ var ( ChainRegisterKey = []byte{0x01} // ChainRegisterKey defines the key to the chain register for each CZ in store FinalityProviderKey = []byte{0x02} // FinalityProviderKey defines the key to the CZ finality providers store FinalityProviderChainKey = []byte{0x03} // FinalityProviderChainKey defines the key to the CZ chains per FP BTC PK store + BTCDelegatorKey = []byte{0x04} // key prefix for the BTC delegators + BTCDelegationKey = []byte{0x05} // key prefix for the BTC delegations ) func KeyPrefix(p string) []byte { From 0c5d6aa048007e265169185aeb13a751fc97afe1 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Fri, 22 Mar 2024 10:28:54 +0100 Subject: [PATCH 08/85] F/consumer chain cli (#221) * Fix typos * Add register chain cli tx * Add chain id to btcstaking create-finality-provider * Add get finality provider by chain queries * Add registered chains cli queries * Add FZ FP chain id query type * Add get CZ FP chain getter / query * Add grpc query. Adjust grpc query paths * Add CZ FP registered chain cli query cmd * Fix: Add tx flags for register chain cmd * Turn consumer chain id into a flag instead of a param * Fix params module import * Add hook to query consumer fps through btcstaking --- go.mod | 2 +- proto/babylon/btcstkconsumer/v1/query.proto | 24 +- proto/buf.lock | 4 +- x/btcstaking/client/cli/tx.go | 6 +- x/btcstaking/keeper/grpc_query.go | 14 + x/btcstaking/types/expected_keepers.go | 2 + x/btcstkconsumer/client/cli/query.go | 179 ++++++ x/btcstkconsumer/client/cli/query_params.go | 36 ++ x/btcstkconsumer/client/cli/tx.go | 74 +++ .../keeper/finality_provider_registry.go | 10 + x/btcstkconsumer/keeper/grpc_query.go | 25 + x/btcstkconsumer/keeper/grpc_query_test.go | 53 ++ x/btcstkconsumer/module.go | 2 +- x/btcstkconsumer/types/query.pb.go | 523 +++++++++++++++--- x/btcstkconsumer/types/query.pb.gw.go | 229 ++++++-- 15 files changed, 1070 insertions(+), 113 deletions(-) create mode 100644 x/btcstkconsumer/client/cli/query.go create mode 100644 x/btcstkconsumer/client/cli/query_params.go create mode 100644 x/btcstkconsumer/client/cli/tx.go diff --git a/go.mod b/go.mod index bc6932357..095367732 100644 --- a/go.mod +++ b/go.mod @@ -62,6 +62,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/vulpine-io/io-test v1.0.0 go.uber.org/zap v1.26.0 + golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 golang.org/x/tools v0.20.0 google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 @@ -265,7 +266,6 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.20.0 // indirect diff --git a/proto/babylon/btcstkconsumer/v1/query.proto b/proto/babylon/btcstkconsumer/v1/query.proto index 1b0f276c4..3b2f9af0e 100644 --- a/proto/babylon/btcstkconsumer/v1/query.proto +++ b/proto/babylon/btcstkconsumer/v1/query.proto @@ -19,7 +19,7 @@ option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; service Query { // Parameters queries the parameters of the module. rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/babylonchain/babylon/btcstkconsumer/v1/params"; + option (google.api.http).get = "/babylon/btcstkconsumer/v1/params"; } // ChainRegistryList queries the list of chains that are registered to Babylon rpc ChainRegistryList(QueryChainRegistryListRequest) returns (QueryChainRegistryListResponse) { @@ -27,17 +27,22 @@ service Query { } // ChainsRegistry queries the latest info for a given list of chains in Babylon's view rpc ChainsRegistry(QueryChainsRegistryRequest) returns (QueryChainsRegistryResponse) { - option (google.api.http).get = "/babylon/btcstkconsumer/v1/chains_registry"; + option (google.api.http).get = "/babylon/btcstkconsumer/v1/chains_registry/{chain_ids}"; + } + + // FinalityProviderChain info about one finality provider's chain id + rpc FinalityProviderChain(QueryFinalityProviderChainRequest) returns (QueryFinalityProviderChainResponse) { + option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_provider_chain/{fp_btc_pk_hex}"; } // FinalityProviders queries all finality providers for a given chain rpc FinalityProviders(QueryFinalityProvidersRequest) returns (QueryFinalityProvidersResponse) { - option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_providers"; + option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_providers/{chain_id}"; } // FinalityProvider info about one finality provider rpc FinalityProvider(QueryFinalityProviderRequest) returns (QueryFinalityProviderResponse) { - option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_providers/{fp_btc_pk_hex}/finality_provider"; + option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_provider/{chain_id}/{fp_btc_pk_hex}"; } } @@ -138,3 +143,14 @@ message FinalityProviderResponse { // chain_id is the chain id this finality provider is registered to string chain_id = 10; } + +// QueryFinalityProviderChainRequest requests the chain a CZ finality provider belongs to +message QueryFinalityProviderChainRequest { + // fp_btc_pk_hex is the hex str of Bitcoin secp256k1 PK of the finality provider + string fp_btc_pk_hex = 1; +} + +// QueryFinalityProviderChainResponse returns the CZ finality provier chain id +message QueryFinalityProviderChainResponse { + string chain_id = 1; +} diff --git a/proto/buf.lock b/proto/buf.lock index 10bb32ad9..334f15efe 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -19,8 +19,8 @@ deps: - remote: buf.build owner: cosmos repository: ibc - commit: 266dbe8e0fc54582bc1b2cb572b4c9b8 - digest: shake256:1e6f8437985795b6244bc81e468af19a68140a5930ccda2cc592929e38ebbe3467f5462b8e896defe30baf74b3b7883d1e38a7b437c5e07db4fe40d0fcf437cf + commit: d7191877c70143938cf411467cebf39a + digest: shake256:b397f418dc751326dd35100c5200c56e1fd7fd24746e39f3ae4d6c86b175e48fe12207867f0912eb31e98f695e9a8afdec7cb4076502d3998026501a88641a9d - remote: buf.build owner: cosmos repository: ics23 diff --git a/x/btcstaking/client/cli/tx.go b/x/btcstaking/client/cli/tx.go index 96a3de643..7ccb5aad2 100644 --- a/x/btcstaking/client/cli/tx.go +++ b/x/btcstaking/client/cli/tx.go @@ -19,6 +19,7 @@ import ( ) const ( + FlagConsumerChainId = "consumer-chain-id" FlagMoniker = "moniker" FlagIdentity = "identity" FlagWebsite = "website" @@ -55,7 +56,7 @@ func NewCreateFinalityProviderCmd() *cobra.Command { Args: cobra.ExactArgs(2), Short: "Create a finality provider", Long: strings.TrimSpace( - `Create a finality provider.`, // TODO: example + `Creates a finality provider for Babylon or a Consumer chain.`, // TODO: example ), RunE: func(cmd *cobra.Command, args []string) error { clientCtx, err := client.GetClientTxContext(cmd) @@ -66,6 +67,7 @@ func NewCreateFinalityProviderCmd() *cobra.Command { fs := cmd.Flags() // get description + chainID, _ := fs.GetString(FlagConsumerChainId) moniker, _ := fs.GetString(FlagMoniker) identity, _ := fs.GetString(FlagIdentity) website, _ := fs.GetString(FlagWebsite) @@ -103,6 +105,7 @@ func NewCreateFinalityProviderCmd() *cobra.Command { Commission: &rate, BtcPk: btcPK, Pop: pop, + ChainId: chainID, } return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) @@ -110,6 +113,7 @@ func NewCreateFinalityProviderCmd() *cobra.Command { } fs := cmd.Flags() + fs.String(FlagConsumerChainId, "", "The finality provider's Consumer chain id, if any") fs.String(FlagMoniker, "", "The finality provider's (optional) moniker") fs.String(FlagWebsite, "", "The finality provider's (optional) website") fs.String(FlagSecurityContact, "", "The finality provider's (optional) security contact email") diff --git a/x/btcstaking/keeper/grpc_query.go b/x/btcstaking/keeper/grpc_query.go index d6227fb6c..68187f98b 100644 --- a/x/btcstaking/keeper/grpc_query.go +++ b/x/btcstaking/keeper/grpc_query.go @@ -70,6 +70,20 @@ func (k Keeper) FinalityProvider(c context.Context, req *types.QueryFinalityProv ctx := sdk.UnwrapSDKContext(c) fp, err := k.GetFinalityProvider(ctx, key) if err != nil { + // Try in the btcstkconsumer module + if k.bscKeeper.HasFinalityProvider(ctx, fpPK) { + fpChain, err := k.bscKeeper.GetFinalityProviderChain(ctx, fpPK) + if err != nil { + return nil, err + } + fp, err := k.bscKeeper.GetFinalityProvider(ctx, fpChain, fpPK) + if err != nil { + return nil, err + } + // FPs for consumer chains are not stored in the voting power table + fpResp := types.NewFinalityProviderResponse(fp, 0, 0) + return &types.QueryFinalityProviderResponse{FinalityProvider: fpResp}, nil + } return nil, err } diff --git a/x/btcstaking/types/expected_keepers.go b/x/btcstaking/types/expected_keepers.go index 30369eac2..67909d5a1 100644 --- a/x/btcstaking/types/expected_keepers.go +++ b/x/btcstaking/types/expected_keepers.go @@ -31,6 +31,8 @@ type CheckpointingKeeper interface { type BTCStkConsumerKeeper interface { IsChainRegistered(ctx context.Context, chainID string) bool HasFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) bool + GetFinalityProviderChain(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) + GetFinalityProvider(ctx context.Context, chainID string, fpBTCPK *bbn.BIP340PubKey) (*FinalityProvider, error) SetFinalityProvider(ctx context.Context, fp *FinalityProvider) AddBTCDelegation(ctx sdk.Context, btcDel *BTCDelegation) error SetBTCDelegation(ctx context.Context, btcDel *BTCDelegation) diff --git a/x/btcstkconsumer/client/cli/query.go b/x/btcstkconsumer/client/cli/query.go new file mode 100644 index 000000000..54057e1b0 --- /dev/null +++ b/x/btcstkconsumer/client/cli/query.go @@ -0,0 +1,179 @@ +package cli + +import ( + "fmt" + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +// GetQueryCmd returns the cli query commands for this module +func GetQueryCmd(queryRoute string) *cobra.Command { + // Group btcstaking queries under a subcommand + cmd := &cobra.Command{ + Use: types.ModuleName, + Short: fmt.Sprintf("Querying commands for the %s module", types.ModuleName), + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand(CmdQueryParams()) + cmd.AddCommand(CmdRegisteredChain()) + cmd.AddCommand(CmdRegisteredChains()) + cmd.AddCommand(CmdFinalityProviderChain()) + cmd.AddCommand(CmdFinalityProvider()) + cmd.AddCommand(CmdFinalityProviders()) + + return cmd +} + +func CmdRegisteredChains() *cobra.Command { + cmd := &cobra.Command{ + Use: "registered-chains", + Short: "retrieve list of registered chains", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + + queryClient := types.NewQueryClient(clientCtx) + + pageReq, err := client.ReadPageRequest(cmd.Flags()) + if err != nil { + return err + } + + res, err := queryClient.ChainRegistryList(cmd.Context(), &types.QueryChainRegistryListRequest{ + Pagination: pageReq, + }) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + flags.AddPaginationFlagsToCmd(cmd, "registered-chains") + + return cmd +} + +func CmdRegisteredChain() *cobra.Command { + cmd := &cobra.Command{ + Use: "registered-chain ", + Short: "retrieve a given registered chain's info", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + queryClient := types.NewQueryClient(clientCtx) + res, err := queryClient.ChainsRegistry( + cmd.Context(), + &types.QueryChainsRegistryRequest{ + ChainIds: []string{args[0]}, + }, + ) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +func CmdFinalityProviderChain() *cobra.Command { + cmd := &cobra.Command{ + Use: "finality-provider-chain ", + Short: "retrieve a given CZ finality provider's registered chain id", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + queryClient := types.NewQueryClient(clientCtx) + res, err := queryClient.FinalityProviderChain( + cmd.Context(), + &types.QueryFinalityProviderChainRequest{ + FpBtcPkHex: args[0], + }, + ) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +func CmdFinalityProvider() *cobra.Command { + cmd := &cobra.Command{ + Use: "finality-provider ", + Short: "retrieve a given chain's finality provider", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + queryClient := types.NewQueryClient(clientCtx) + res, err := queryClient.FinalityProvider( + cmd.Context(), + &types.QueryFinalityProviderRequest{ + FpBtcPkHex: args[1], + ChainId: args[0], + }, + ) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +func CmdFinalityProviders() *cobra.Command { + cmd := &cobra.Command{ + Use: "finality-providers ", + Short: "retrieve a given chain's all finality providers", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + + queryClient := types.NewQueryClient(clientCtx) + + pageReq, err := client.ReadPageRequest(cmd.Flags()) + if err != nil { + return err + } + + res, err := queryClient.FinalityProviders(cmd.Context(), &types.QueryFinalityProvidersRequest{ + ChainId: args[0], + Pagination: pageReq, + }) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + flags.AddPaginationFlagsToCmd(cmd, "finality-providers") + + return cmd +} diff --git a/x/btcstkconsumer/client/cli/query_params.go b/x/btcstkconsumer/client/cli/query_params.go new file mode 100644 index 000000000..ed02f3752 --- /dev/null +++ b/x/btcstkconsumer/client/cli/query_params.go @@ -0,0 +1,36 @@ +package cli + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/spf13/cobra" + + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func CmdQueryParams() *cobra.Command { + cmd := &cobra.Command{ + Use: "params", + Short: "shows the parameters of the module", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + res, err := queryClient.Params(cmd.Context(), &types.QueryParamsRequest{}) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/btcstkconsumer/client/cli/tx.go b/x/btcstkconsumer/client/cli/tx.go new file mode 100644 index 000000000..15de14cab --- /dev/null +++ b/x/btcstkconsumer/client/cli/tx.go @@ -0,0 +1,74 @@ +package cli + +import ( + "fmt" + "github.com/cosmos/cosmos-sdk/client/flags" + "strings" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/spf13/cobra" + + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +// GetTxCmd returns the transaction commands for this module +func GetTxCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: types.ModuleName, + Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand( + NewRegisterChainCmd(), + ) + + return cmd +} + +func NewRegisterChainCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "register-chain [description]", + Args: cobra.RangeArgs(2, 3), + Short: "Registers a CZ chain", + Long: strings.TrimSpace( + `Registers a CZ chain.`, + ), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + // get description + chainId := args[0] + if chainId == "" { + return fmt.Errorf("chain's id cannot be empty") + } + name := args[1] + if name == "" { + return fmt.Errorf("chain's name cannot be empty") + } + description := "" + if len(args) == 3 { + description = args[2] + } + + msg := types.MsgRegisterChain{ + Signer: clientCtx.FromAddress.String(), + ChainId: chainId, + ChainName: name, + ChainDescription: description, + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/btcstkconsumer/keeper/finality_provider_registry.go b/x/btcstkconsumer/keeper/finality_provider_registry.go index 0abcacde4..fab3488e8 100644 --- a/x/btcstkconsumer/keeper/finality_provider_registry.go +++ b/x/btcstkconsumer/keeper/finality_provider_registry.go @@ -45,6 +45,16 @@ func (k Keeper) HasFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubK return store.Has(*fpBTCPK) } +// GetFinalityProviderChain gets the finality provider chain id for the given finality provider Bitcoin PK +func (k Keeper) GetFinalityProviderChain(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) { + if !k.HasFinalityProvider(ctx, fpBTCPK) { + return "", btcstaking.ErrFpNotFound + } + store := k.finalityProviderChainStore(ctx) + chainID := store.Get(*fpBTCPK) + return string(chainID), nil +} + // IterateFPs iterates over all finality providers for a given chain func (k Keeper) IterateFPs(ctx context.Context, chainId string, handler func(fp *btcstaking.FinalityProvider) bool) { // filter out all finality providers with positive voting power diff --git a/x/btcstkconsumer/keeper/grpc_query.go b/x/btcstkconsumer/keeper/grpc_query.go index 5c0fca00c..d4e21676e 100644 --- a/x/btcstkconsumer/keeper/grpc_query.go +++ b/x/btcstkconsumer/keeper/grpc_query.go @@ -131,3 +131,28 @@ func (k Keeper) FinalityProvider(c context.Context, req *types.QueryFinalityProv fpResp := types.NewFinalityProviderResponse(fp) return &types.QueryFinalityProviderResponse{FinalityProvider: fpResp}, nil } + +// FinalityProviderChain returns the chain ID for the finality provider with the specified finality provider BTC PK +func (k Keeper) FinalityProviderChain(c context.Context, req *types.QueryFinalityProviderChainRequest) (*types.QueryFinalityProviderChainResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + + if len(req.FpBtcPkHex) == 0 { + return nil, errorsmod.Wrapf( + sdkerrors.ErrInvalidRequest, "finality provider BTC public key cannot be empty") + } + + fpPK, err := bbn.NewBIP340PubKeyFromHex(req.FpBtcPkHex) + if err != nil { + return nil, err + } + + ctx := sdk.UnwrapSDKContext(c) + chainID, err := k.GetFinalityProviderChain(ctx, fpPK) + if err != nil { + return nil, err + } + + return &types.QueryFinalityProviderChainResponse{ChainId: chainID}, nil +} diff --git a/x/btcstkconsumer/keeper/grpc_query_test.go b/x/btcstkconsumer/keeper/grpc_query_test.go index 8fb9b982e..e8409b65c 100644 --- a/x/btcstkconsumer/keeper/grpc_query_test.go +++ b/x/btcstkconsumer/keeper/grpc_query_test.go @@ -233,6 +233,59 @@ func FuzzFinalityProvider(f *testing.F) { }) } +// FuzzFinalityProviderChain tests the FinalityProviderChain gRPC query endpoint +func FuzzFinalityProviderChain(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + bscKeeper := babylonApp.BTCStkConsumerKeeper + ctx := babylonApp.NewContext(false) + + // Generate random finality providers and add them to kv store under a chain id + fpsMap := make(map[string]*btcstaking.FinalityProvider) + chainID := datagen.GenRandomHexStr(r, 30) + var existingFp string + for i := 0; i < int(datagen.RandomInt(r, 10)+1); i++ { + fp, err := datagen.GenRandomFinalityProvider(r) + require.NoError(t, err) + fp.ChainId = chainID + + bscKeeper.SetFinalityProvider(ctx, fp) + existingFp = fp.BtcPk.MarshalHex() + fpsMap[existingFp] = fp + } + + // Test nil request + resp, err := bscKeeper.FinalityProviderChain(ctx, nil) + require.Error(t, err) + require.Nil(t, resp) + + // Generate a request with a valid key + req := types.QueryFinalityProviderChainRequest{FpBtcPkHex: existingFp} + resp, err = bscKeeper.FinalityProviderChain(ctx, &req) + if err != nil { + t.Errorf("Valid request led to an error %s", err) + } + if resp == nil { + t.Fatalf("Valid request led to a nil response") + } + + // check keys from map matches those in returned response + require.Equal(t, chainID, resp.ChainId) + + // check some random non-existing guy + fp, err := datagen.GenRandomFinalityProvider(r) + require.NoError(t, err) + req = types.QueryFinalityProviderChainRequest{FpBtcPkHex: fp.BtcPk.MarshalHex()} + respNonExists, err := bscKeeper.FinalityProviderChain(ctx, &req) + require.Error(t, err) + require.Nil(t, respNonExists) + require.True(t, errors.Is(err, btcstaking.ErrFpNotFound)) + }) +} + // Constructors for PageRequest objects func constructRequestWithKeyAndLimit(r *rand.Rand, key []byte, limit uint64) *query.PageRequest { // If the limit is 0, set one randomly diff --git a/x/btcstkconsumer/module.go b/x/btcstkconsumer/module.go index 355022b63..fd0ed6eab 100644 --- a/x/btcstkconsumer/module.go +++ b/x/btcstkconsumer/module.go @@ -16,9 +16,9 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" + "github.com/babylonchain/babylon/x/btcstkconsumer/client/cli" "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" "github.com/babylonchain/babylon/x/btcstkconsumer/types" - "github.com/babylonchain/babylon/x/monitor/client/cli" ) var ( diff --git a/x/btcstkconsumer/types/query.pb.go b/x/btcstkconsumer/types/query.pb.go index bb15bae85..71a1761f1 100644 --- a/x/btcstkconsumer/types/query.pb.go +++ b/x/btcstkconsumer/types/query.pb.go @@ -641,6 +641,97 @@ func (m *FinalityProviderResponse) GetChainId() string { return "" } +// QueryFinalityProviderChainRequest requests the chain a CZ finality provider belongs to +type QueryFinalityProviderChainRequest struct { + // fp_btc_pk_hex is the hex str of Bitcoin secp256k1 PK of the finality provider + FpBtcPkHex string `protobuf:"bytes,1,opt,name=fp_btc_pk_hex,json=fpBtcPkHex,proto3" json:"fp_btc_pk_hex,omitempty"` +} + +func (m *QueryFinalityProviderChainRequest) Reset() { *m = QueryFinalityProviderChainRequest{} } +func (m *QueryFinalityProviderChainRequest) String() string { return proto.CompactTextString(m) } +func (*QueryFinalityProviderChainRequest) ProtoMessage() {} +func (*QueryFinalityProviderChainRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{11} +} +func (m *QueryFinalityProviderChainRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryFinalityProviderChainRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryFinalityProviderChainRequest.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 *QueryFinalityProviderChainRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalityProviderChainRequest.Merge(m, src) +} +func (m *QueryFinalityProviderChainRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryFinalityProviderChainRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalityProviderChainRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryFinalityProviderChainRequest proto.InternalMessageInfo + +func (m *QueryFinalityProviderChainRequest) GetFpBtcPkHex() string { + if m != nil { + return m.FpBtcPkHex + } + return "" +} + +// QueryFinalityProviderChainResponse returns the CZ finality provier chain id +type QueryFinalityProviderChainResponse struct { + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (m *QueryFinalityProviderChainResponse) Reset() { *m = QueryFinalityProviderChainResponse{} } +func (m *QueryFinalityProviderChainResponse) String() string { return proto.CompactTextString(m) } +func (*QueryFinalityProviderChainResponse) ProtoMessage() {} +func (*QueryFinalityProviderChainResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4e6c48e60b6a8bd8, []int{12} +} +func (m *QueryFinalityProviderChainResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryFinalityProviderChainResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryFinalityProviderChainResponse.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 *QueryFinalityProviderChainResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalityProviderChainResponse.Merge(m, src) +} +func (m *QueryFinalityProviderChainResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryFinalityProviderChainResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalityProviderChainResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryFinalityProviderChainResponse proto.InternalMessageInfo + +func (m *QueryFinalityProviderChainResponse) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + func init() { proto.RegisterType((*QueryParamsRequest)(nil), "babylon.btcstkconsumer.v1.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "babylon.btcstkconsumer.v1.QueryParamsResponse") @@ -653,6 +744,8 @@ func init() { proto.RegisterType((*QueryFinalityProviderRequest)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderRequest") proto.RegisterType((*QueryFinalityProviderResponse)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderResponse") proto.RegisterType((*FinalityProviderResponse)(nil), "babylon.btcstkconsumer.v1.FinalityProviderResponse") + proto.RegisterType((*QueryFinalityProviderChainRequest)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderChainRequest") + proto.RegisterType((*QueryFinalityProviderChainResponse)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderChainResponse") } func init() { @@ -660,75 +753,79 @@ func init() { } var fileDescriptor_4e6c48e60b6a8bd8 = []byte{ - // 1073 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xce, 0xe6, 0x87, 0x13, 0x4f, 0x4a, 0x49, 0x86, 0xa8, 0x72, 0x9c, 0xe2, 0x24, 0x0b, 0x94, - 0x28, 0xc4, 0xbb, 0xb5, 0xd3, 0x98, 0xf6, 0xc0, 0x01, 0x37, 0x94, 0x56, 0xb4, 0xea, 0x66, 0x41, - 0x42, 0x02, 0xa4, 0x65, 0x7f, 0x8c, 0xd7, 0x2b, 0xdb, 0x3b, 0xdb, 0x99, 0xb1, 0x89, 0x85, 0x38, - 0xd0, 0x03, 0x67, 0x24, 0xfe, 0x00, 0x6e, 0x88, 0x23, 0x12, 0xbd, 0xc3, 0x05, 0xa9, 0x17, 0xa4, - 0xaa, 0x5c, 0x50, 0x0f, 0x11, 0x4a, 0x90, 0xf8, 0x37, 0xd0, 0xce, 0xce, 0x3a, 0x5e, 0xdb, 0x6b, - 0x27, 0x51, 0x2f, 0x91, 0x67, 0xde, 0xf7, 0xbd, 0xf9, 0xde, 0xf7, 0x66, 0xe7, 0x05, 0xbc, 0x65, - 0x99, 0x56, 0xb7, 0x89, 0x7d, 0xd5, 0x62, 0x36, 0x65, 0x0d, 0x1b, 0xfb, 0xb4, 0xdd, 0x42, 0x44, - 0xed, 0x94, 0xd4, 0x47, 0x6d, 0x44, 0xba, 0x4a, 0x40, 0x30, 0xc3, 0x70, 0x55, 0xc0, 0x94, 0x24, - 0x4c, 0xe9, 0x94, 0xf2, 0xcb, 0x66, 0xcb, 0xf3, 0xb1, 0xca, 0xff, 0x46, 0xe8, 0xfc, 0x8a, 0x8b, - 0x5d, 0xcc, 0x7f, 0xaa, 0xe1, 0x2f, 0xb1, 0x7b, 0xd5, 0xc5, 0xd8, 0x6d, 0x22, 0xd5, 0x0c, 0x3c, - 0xd5, 0xf4, 0x7d, 0xcc, 0x4c, 0xe6, 0x61, 0x9f, 0x8a, 0xe8, 0xaa, 0x8d, 0x69, 0x0b, 0x53, 0x23, - 0xa2, 0x45, 0x0b, 0x11, 0x92, 0xa3, 0x95, 0x6a, 0x93, 0x6e, 0xc0, 0xb0, 0x4a, 0x91, 0x1d, 0x94, - 0xf7, 0x2a, 0x8d, 0x92, 0xda, 0x40, 0xdd, 0x18, 0xf3, 0xa6, 0xc0, 0x50, 0x66, 0x36, 0x3c, 0xdf, - 0x55, 0x3b, 0x25, 0x0b, 0x31, 0xb3, 0x14, 0xaf, 0x05, 0x6a, 0x5b, 0xa0, 0x2c, 0x93, 0xa2, 0xa8, - 0xbe, 0x1e, 0x30, 0x30, 0x5d, 0xcf, 0xe7, 0x8a, 0x04, 0xf6, 0x5a, 0xc2, 0x99, 0x38, 0x6b, 0xdf, - 0x4a, 0xe0, 0xd6, 0x47, 0xe3, 0x02, 0x1c, 0x08, 0x80, 0x92, 0x6e, 0xf1, 0x80, 0x9b, 0xa3, 0x0e, - 0x4e, 0xe0, 0x03, 0x93, 0x98, 0x2d, 0x51, 0xb2, 0xbc, 0x02, 0xe0, 0x41, 0x58, 0x82, 0xc6, 0x37, - 0x75, 0xf4, 0xa8, 0x8d, 0x28, 0x93, 0x3f, 0x07, 0xaf, 0x25, 0x76, 0x69, 0x80, 0x7d, 0x8a, 0xe0, - 0x3e, 0xc8, 0x44, 0xe4, 0x9c, 0xb4, 0x21, 0x6d, 0x2d, 0x96, 0x37, 0x95, 0xd4, 0x8e, 0x2a, 0x11, - 0xb5, 0x9a, 0x7d, 0x7a, 0xb4, 0x3e, 0xf5, 0xf3, 0x7f, 0xbf, 0x6c, 0x4b, 0xba, 0xe0, 0xca, 0x2e, - 0x78, 0x9d, 0x27, 0xbf, 0x5d, 0x37, 0x3d, 0x5f, 0x47, 0xae, 0x47, 0x19, 0xe9, 0xde, 0xf7, 0x28, - 0x13, 0xa7, 0xc3, 0x3b, 0x00, 0x9c, 0x1a, 0x29, 0x8e, 0xba, 0xa6, 0x88, 0x6e, 0x86, 0xae, 0x2b, - 0xd1, 0xad, 0x12, 0xae, 0x2b, 0x9a, 0xe9, 0x22, 0xc1, 0xd5, 0xfb, 0x98, 0xf2, 0x77, 0x12, 0x28, - 0xa4, 0x9d, 0x24, 0x2a, 0x5a, 0x03, 0x59, 0x3b, 0x0c, 0x1a, 0x9e, 0x13, 0x16, 0x35, 0xb3, 0x95, - 0xd5, 0x17, 0xf8, 0xc6, 0x3d, 0x87, 0xc2, 0x0f, 0x13, 0x3a, 0xa6, 0xb9, 0x8e, 0xb7, 0x27, 0xea, - 0x88, 0x32, 0x27, 0x84, 0xdc, 0x02, 0xf9, 0x53, 0x1d, 0x34, 0x16, 0x12, 0x97, 0x3b, 0x4e, 0x83, - 0x1c, 0x80, 0xb5, 0x91, 0x54, 0xa1, 0xff, 0x00, 0xbc, 0xca, 0xa1, 0xd4, 0x20, 0x3c, 0x84, 0x08, - 0xcf, 0xb0, 0x58, 0xde, 0x1a, 0xd3, 0x9a, 0x3e, 0x3b, 0x10, 0xd1, 0x2f, 0xdb, 0x7d, 0xa9, 0x11, - 0x91, 0x1f, 0x4b, 0xa2, 0x3f, 0x77, 0x3c, 0xdf, 0x6c, 0x7a, 0xac, 0xab, 0x11, 0xdc, 0xf1, 0x1c, - 0x44, 0xe2, 0xdb, 0x01, 0x57, 0xc1, 0x42, 0x2c, 0x98, 0x77, 0x27, 0xab, 0xcf, 0x0b, 0xbd, 0x03, - 0xad, 0x9b, 0xbe, 0x70, 0xeb, 0xfe, 0x8c, 0x5b, 0x37, 0x42, 0x84, 0x28, 0xdd, 0x02, 0xb0, 0x26, - 0x82, 0xe1, 0xf7, 0x1e, 0x45, 0x45, 0xf5, 0xbb, 0x63, 0xaa, 0x1f, 0xcc, 0xd8, 0xeb, 0xd8, 0x72, - 0x6d, 0xf0, 0xac, 0x97, 0x77, 0x03, 0xbe, 0x00, 0x57, 0x47, 0x96, 0x73, 0x06, 0x4b, 0x37, 0xc1, - 0x2b, 0xb5, 0xc0, 0xb0, 0x98, 0x6d, 0x04, 0x0d, 0xa3, 0x8e, 0x0e, 0xb9, 0x8c, 0xac, 0x0e, 0x6a, - 0x41, 0x95, 0xd9, 0x5a, 0xe3, 0x2e, 0x3a, 0x94, 0xbf, 0x4d, 0x6b, 0x59, 0xcf, 0xac, 0x2f, 0xc1, - 0xf2, 0x90, 0x59, 0xe2, 0xcb, 0xba, 0x90, 0x57, 0x4b, 0x83, 0x5e, 0xc9, 0x3f, 0xcd, 0x82, 0x5c, - 0xea, 0xf1, 0x1f, 0x80, 0x45, 0x07, 0x51, 0x9b, 0x78, 0x41, 0xdf, 0x27, 0xfd, 0x46, 0x6c, 0x64, - 0xfc, 0x14, 0xc6, 0x2e, 0xee, 0x9f, 0x42, 0xf5, 0x7e, 0x1e, 0x7c, 0x00, 0x80, 0x8d, 0x5b, 0x2d, - 0x8f, 0xd2, 0xb8, 0x1d, 0xd9, 0x6a, 0xf1, 0xc5, 0xd1, 0xfa, 0x5a, 0x94, 0x88, 0x3a, 0x0d, 0xc5, - 0xc3, 0x6a, 0xcb, 0x64, 0x75, 0xe5, 0x3e, 0x72, 0x4d, 0xbb, 0xbb, 0x8f, 0xec, 0xe7, 0x4f, 0x8a, - 0x40, 0x9c, 0xb3, 0x8f, 0x6c, 0xbd, 0x2f, 0x01, 0xdc, 0x01, 0xb3, 0xa6, 0xe3, 0x90, 0xdc, 0x0c, - 0x4f, 0x94, 0x7b, 0xfe, 0xa4, 0xb8, 0x22, 0x90, 0xef, 0x3b, 0x0e, 0x41, 0x94, 0x7e, 0xcc, 0x88, - 0xe7, 0xbb, 0x3a, 0x47, 0xc1, 0x07, 0x20, 0x13, 0x35, 0x21, 0x37, 0xbb, 0x21, 0x6d, 0x5d, 0xaa, - 0x56, 0x5e, 0x1c, 0xad, 0x97, 0x5d, 0x8f, 0xd5, 0xdb, 0x96, 0x62, 0xe3, 0x96, 0x2a, 0x5c, 0xe4, - 0x6d, 0x8b, 0x17, 0x2a, 0xeb, 0x06, 0x88, 0x2a, 0xd5, 0x7b, 0xda, 0xee, 0x8d, 0xeb, 0x5a, 0xdb, - 0xfa, 0x08, 0x75, 0xf5, 0x39, 0x2b, 0x6c, 0x1b, 0x7c, 0x0f, 0xcc, 0x04, 0x38, 0xc8, 0xcd, 0x71, - 0x2b, 0xde, 0x49, 0xf6, 0x20, 0xb6, 0x43, 0xd1, 0x08, 0xc6, 0xb5, 0x87, 0x35, 0x0d, 0x53, 0x8a, - 0xb8, 0xe6, 0xea, 0x27, 0xb7, 0xf5, 0x90, 0x07, 0x6f, 0x80, 0x2b, 0xb4, 0x69, 0xd2, 0x3a, 0x72, - 0x0c, 0x41, 0x35, 0xea, 0xc8, 0x73, 0xeb, 0x2c, 0x97, 0xd9, 0x90, 0xb6, 0x66, 0xf5, 0x15, 0x11, - 0xad, 0x46, 0xc1, 0xbb, 0x3c, 0x06, 0x77, 0x00, 0xec, 0xb1, 0x98, 0x1d, 0x33, 0xe6, 0x39, 0x63, - 0x29, 0x66, 0x30, 0x5b, 0xa0, 0xaf, 0x80, 0x8c, 0x40, 0x2c, 0x70, 0x84, 0x58, 0xc1, 0x4d, 0x70, - 0xa9, 0x83, 0x99, 0xe7, 0xbb, 0x46, 0x80, 0xbf, 0x42, 0x24, 0x97, 0xe5, 0xd1, 0xc5, 0x68, 0x4f, - 0x0b, 0xb7, 0x12, 0xf7, 0x19, 0x24, 0xee, 0x73, 0xf9, 0x8f, 0x79, 0x30, 0xc7, 0x2f, 0x2b, 0xfc, - 0x51, 0x02, 0x99, 0x68, 0x4c, 0xc0, 0xe2, 0x98, 0x4b, 0x38, 0x3c, 0x9f, 0xf2, 0xca, 0x59, 0xe1, - 0xd1, 0xfd, 0x93, 0x2b, 0x8f, 0xff, 0xfa, 0xf7, 0x87, 0xe9, 0xeb, 0x50, 0x19, 0xdd, 0xa5, 0xb4, - 0x19, 0x09, 0x7f, 0x97, 0xc0, 0xf2, 0xd0, 0xf0, 0x80, 0x37, 0x27, 0x9d, 0x9e, 0x36, 0xd9, 0xf2, - 0xb7, 0x2e, 0xc0, 0x4c, 0x2b, 0x61, 0x84, 0xea, 0xc8, 0x72, 0x22, 0xe8, 0x46, 0x33, 0x14, 0xfb, - 0xab, 0x04, 0x2e, 0x27, 0x87, 0x07, 0xdc, 0x3b, 0x93, 0x8a, 0xc1, 0x39, 0x95, 0xaf, 0x9c, 0x97, - 0x26, 0x94, 0x97, 0xb9, 0xf2, 0x1d, 0xb8, 0x3d, 0x49, 0x39, 0xed, 0x49, 0x87, 0xbf, 0x49, 0x60, - 0x79, 0xe8, 0xe9, 0x9f, 0x6c, 0x7c, 0xda, 0xc8, 0x9a, 0x6c, 0x7c, 0xea, 0x9c, 0x91, 0xf7, 0xb8, - 0x7c, 0x15, 0x16, 0xc7, 0xc8, 0x1f, 0x1e, 0x44, 0xf0, 0x48, 0x02, 0x4b, 0x83, 0x49, 0xe1, 0xbb, - 0xe7, 0x95, 0x11, 0xeb, 0xbf, 0x79, 0x7e, 0xa2, 0x90, 0xff, 0x29, 0x97, 0x7f, 0x00, 0x1f, 0x9e, - 0x4b, 0xbe, 0xfa, 0x75, 0x62, 0xe6, 0x7c, 0x33, 0x0c, 0xa9, 0x6a, 0x4f, 0x8f, 0x0b, 0xd2, 0xb3, - 0xe3, 0x82, 0xf4, 0xcf, 0x71, 0x41, 0xfa, 0xfe, 0xa4, 0x30, 0xf5, 0xec, 0xa4, 0x30, 0xf5, 0xf7, - 0x49, 0x61, 0xea, 0xb3, 0xca, 0xa4, 0x57, 0xf1, 0x70, 0x50, 0x03, 0x7f, 0x26, 0xad, 0x0c, 0xff, - 0x97, 0x74, 0xf7, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x25, 0xbb, 0xa4, 0x6b, 0x4f, 0x0c, 0x00, - 0x00, + // 1147 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6f, 0xdc, 0x44, + 0x14, 0x8f, 0xf3, 0xb1, 0xcd, 0x4e, 0x4a, 0x49, 0x86, 0x50, 0x6d, 0x36, 0x65, 0x93, 0xb8, 0x50, + 0x42, 0x69, 0xec, 0x26, 0x69, 0x97, 0x14, 0x51, 0x3e, 0xb6, 0x21, 0x6d, 0xa0, 0x55, 0x5d, 0xc3, + 0x09, 0x90, 0x8c, 0x3f, 0x66, 0xbd, 0xd6, 0x66, 0x3d, 0xae, 0x67, 0x12, 0xb2, 0xaa, 0x72, 0xa0, + 0x07, 0xce, 0x08, 0xfe, 0x07, 0x84, 0x38, 0x71, 0xe8, 0x1d, 0x8e, 0x15, 0x12, 0x52, 0x55, 0x24, + 0x84, 0x7a, 0x88, 0xaa, 0x04, 0x89, 0x7f, 0x03, 0x79, 0xfc, 0xbc, 0x59, 0xef, 0x67, 0x36, 0xea, + 0xa5, 0xda, 0x99, 0xf9, 0xfd, 0xde, 0xfc, 0x7e, 0xef, 0xbd, 0xf1, 0x6b, 0xd0, 0x1b, 0x96, 0x69, + 0xd5, 0xb7, 0xa8, 0xaf, 0x5a, 0xdc, 0x66, 0xbc, 0x6a, 0x53, 0x9f, 0x6d, 0xd7, 0x48, 0xa8, 0xee, + 0x2c, 0xab, 0xf7, 0xb7, 0x49, 0x58, 0x57, 0x82, 0x90, 0x72, 0x8a, 0x67, 0x00, 0xa6, 0xa4, 0x61, + 0xca, 0xce, 0x72, 0x7e, 0xca, 0xac, 0x79, 0x3e, 0x55, 0xc5, 0xbf, 0x31, 0x3a, 0x3f, 0xed, 0x52, + 0x97, 0x8a, 0x9f, 0x6a, 0xf4, 0x0b, 0x76, 0xcf, 0xb9, 0x94, 0xba, 0x5b, 0x44, 0x35, 0x03, 0x4f, + 0x35, 0x7d, 0x9f, 0x72, 0x93, 0x7b, 0xd4, 0x67, 0x70, 0x3a, 0x63, 0x53, 0x56, 0xa3, 0xcc, 0x88, + 0x69, 0xf1, 0x02, 0x8e, 0xe4, 0x78, 0xa5, 0xda, 0x61, 0x3d, 0xe0, 0x54, 0x65, 0xc4, 0x0e, 0x56, + 0xae, 0x16, 0xab, 0xcb, 0x6a, 0x95, 0xd4, 0x13, 0xcc, 0xeb, 0x80, 0x61, 0xdc, 0xac, 0x7a, 0xbe, + 0xab, 0xee, 0x2c, 0x5b, 0x84, 0x9b, 0xcb, 0xc9, 0x1a, 0x50, 0x17, 0x01, 0x65, 0x99, 0x8c, 0xc4, + 0xfe, 0x1a, 0xc0, 0xc0, 0x74, 0x3d, 0x5f, 0x28, 0x02, 0xec, 0x85, 0x54, 0x66, 0x92, 0xa8, 0x4d, + 0x2b, 0xc0, 0xcd, 0x75, 0xc6, 0x05, 0x34, 0x00, 0x80, 0xd2, 0x3d, 0xc5, 0x2d, 0xd9, 0xec, 0x74, + 0x71, 0x0a, 0x1f, 0x98, 0xa1, 0x59, 0x03, 0xcb, 0xf2, 0x34, 0xc2, 0xf7, 0x22, 0x0b, 0x9a, 0xd8, + 0xd4, 0xc9, 0xfd, 0x6d, 0xc2, 0xb8, 0xfc, 0x25, 0x7a, 0x25, 0xb5, 0xcb, 0x02, 0xea, 0x33, 0x82, + 0xd7, 0x51, 0x26, 0x26, 0xe7, 0xa4, 0x79, 0x69, 0x71, 0x62, 0x65, 0x41, 0xe9, 0x5a, 0x51, 0x25, + 0xa6, 0x96, 0xb2, 0x8f, 0xf7, 0xe7, 0x86, 0x7e, 0xfe, 0xef, 0xd7, 0x8b, 0x92, 0x0e, 0x5c, 0xd9, + 0x45, 0xaf, 0x89, 0xe0, 0x37, 0x2a, 0xa6, 0xe7, 0xeb, 0xc4, 0xf5, 0x18, 0x0f, 0xeb, 0xb7, 0x3d, + 0xc6, 0xe1, 0x76, 0xbc, 0x81, 0xd0, 0x51, 0x22, 0xe1, 0xaa, 0x0b, 0x0a, 0x54, 0x33, 0xca, 0xba, + 0x12, 0x77, 0x15, 0x64, 0x5d, 0xd1, 0x4c, 0x97, 0x00, 0x57, 0x6f, 0x62, 0xca, 0xdf, 0x49, 0xa8, + 0xd0, 0xed, 0x26, 0x70, 0x34, 0x8b, 0xb2, 0x76, 0x74, 0x68, 0x78, 0x4e, 0x64, 0x6a, 0x64, 0x31, + 0xab, 0x8f, 0x8b, 0x8d, 0x4d, 0x87, 0xe1, 0x9b, 0x29, 0x1d, 0xc3, 0x42, 0xc7, 0x9b, 0x7d, 0x75, + 0xc4, 0x91, 0x53, 0x42, 0xae, 0xa1, 0xfc, 0x91, 0x0e, 0x96, 0x08, 0x49, 0xec, 0xf6, 0xd2, 0x20, + 0x07, 0x68, 0xb6, 0x23, 0x15, 0xf4, 0xdf, 0x43, 0x2f, 0x0b, 0x28, 0x33, 0x42, 0x71, 0x44, 0x42, + 0x11, 0x61, 0x62, 0x65, 0xb1, 0x47, 0x69, 0x9a, 0xd2, 0x41, 0x42, 0xfd, 0x8c, 0xdd, 0x14, 0x9a, + 0x84, 0xf2, 0x43, 0x09, 0xea, 0xb3, 0xe1, 0xf9, 0xe6, 0x96, 0xc7, 0xeb, 0x5a, 0x48, 0x77, 0x3c, + 0x87, 0x84, 0x49, 0x77, 0xe0, 0x19, 0x34, 0x9e, 0x08, 0x16, 0xd5, 0xc9, 0xea, 0xa7, 0x40, 0x6f, + 0x4b, 0xe9, 0x86, 0x4f, 0x5c, 0xba, 0x3f, 0x93, 0xd2, 0x75, 0x10, 0x01, 0xd6, 0x2d, 0x84, 0xcb, + 0x70, 0x18, 0xbd, 0xf7, 0xf8, 0x14, 0xdc, 0xaf, 0xf6, 0x70, 0xdf, 0x1a, 0xb1, 0x51, 0xb1, 0xa9, + 0x72, 0xeb, 0x5d, 0x2f, 0xae, 0x03, 0xbe, 0x42, 0xe7, 0x3a, 0xda, 0x39, 0x46, 0x4a, 0x17, 0xd0, + 0x4b, 0xe5, 0xc0, 0xb0, 0xb8, 0x6d, 0x04, 0x55, 0xa3, 0x42, 0x76, 0x85, 0x8c, 0xac, 0x8e, 0xca, + 0x41, 0x89, 0xdb, 0x5a, 0xf5, 0x16, 0xd9, 0x95, 0xbf, 0xed, 0x56, 0xb2, 0x46, 0xb2, 0xbe, 0x46, + 0x53, 0x6d, 0xc9, 0x82, 0x97, 0x75, 0xa2, 0x5c, 0x4d, 0xb6, 0xe6, 0x4a, 0xfe, 0x69, 0x14, 0xe5, + 0xba, 0x5e, 0xff, 0x31, 0x9a, 0x70, 0x08, 0xb3, 0x43, 0x2f, 0x68, 0x7a, 0xd2, 0xe7, 0x93, 0x44, + 0x26, 0x9f, 0xc2, 0x24, 0x8b, 0xeb, 0x47, 0x50, 0xbd, 0x99, 0x87, 0xef, 0x20, 0x64, 0xd3, 0x5a, + 0xcd, 0x63, 0x2c, 0x29, 0x47, 0xb6, 0xb4, 0xf4, 0x6c, 0x7f, 0x6e, 0x36, 0x0e, 0xc4, 0x9c, 0xaa, + 0xe2, 0x51, 0xb5, 0x66, 0xf2, 0x8a, 0x72, 0x9b, 0xb8, 0xa6, 0x5d, 0x5f, 0x27, 0xf6, 0xd3, 0x47, + 0x4b, 0x08, 0xee, 0x59, 0x27, 0xb6, 0xde, 0x14, 0x00, 0x5f, 0x42, 0xa3, 0xa6, 0xe3, 0x84, 0xb9, + 0x11, 0x11, 0x28, 0xf7, 0xf4, 0xd1, 0xd2, 0x34, 0x20, 0x3f, 0x72, 0x9c, 0x90, 0x30, 0xf6, 0x19, + 0x0f, 0x3d, 0xdf, 0xd5, 0x05, 0x0a, 0xdf, 0x41, 0x99, 0xb8, 0x08, 0xb9, 0xd1, 0x79, 0x69, 0xf1, + 0x74, 0xa9, 0xf8, 0x6c, 0x7f, 0x6e, 0xc5, 0xf5, 0x78, 0x65, 0xdb, 0x52, 0x6c, 0x5a, 0x53, 0x21, + 0x8b, 0xa2, 0x6c, 0xc9, 0x42, 0xe5, 0xf5, 0x80, 0x30, 0xa5, 0xb4, 0xa9, 0xad, 0x5e, 0xb9, 0xac, + 0x6d, 0x5b, 0x9f, 0x92, 0xba, 0x3e, 0x66, 0x45, 0x65, 0xc3, 0xd7, 0xd1, 0x48, 0x40, 0x83, 0xdc, + 0x98, 0x48, 0xc5, 0xdb, 0xe9, 0x1a, 0x24, 0xe9, 0x50, 0xb4, 0x90, 0xd2, 0xf2, 0xdd, 0xb2, 0x46, + 0x19, 0x23, 0x42, 0x73, 0xe9, 0xf3, 0x1b, 0x7a, 0xc4, 0xc3, 0x57, 0xd0, 0x59, 0xb6, 0x65, 0xb2, + 0x0a, 0x71, 0x0c, 0xa0, 0x1a, 0x15, 0xe2, 0xb9, 0x15, 0x9e, 0xcb, 0xcc, 0x4b, 0x8b, 0xa3, 0xfa, + 0x34, 0x9c, 0x96, 0xe2, 0xc3, 0x5b, 0xe2, 0x0c, 0x5f, 0x42, 0xb8, 0xc1, 0xe2, 0x76, 0xc2, 0x38, + 0x25, 0x18, 0x93, 0x09, 0x83, 0xdb, 0x80, 0x3e, 0x8b, 0x32, 0x80, 0x18, 0x17, 0x08, 0x58, 0xe1, + 0x05, 0x74, 0x7a, 0x87, 0x72, 0xcf, 0x77, 0x8d, 0x80, 0x7e, 0x43, 0xc2, 0x5c, 0x56, 0x9c, 0x4e, + 0xc4, 0x7b, 0x5a, 0xb4, 0x95, 0xea, 0x67, 0x94, 0xea, 0x67, 0x79, 0x03, 0x2d, 0x74, 0xec, 0x55, + 0xf8, 0x2a, 0xc5, 0xef, 0xa1, 0xad, 0xe9, 0xa5, 0xb6, 0xa6, 0xff, 0x00, 0xc9, 0xbd, 0xe2, 0x40, + 0xe7, 0x75, 0x7f, 0x58, 0x2b, 0xbf, 0x64, 0xd1, 0x98, 0x88, 0x80, 0x7f, 0x90, 0x50, 0x26, 0x9e, + 0x57, 0x78, 0xa9, 0xc7, 0x6b, 0x68, 0x1f, 0x94, 0x79, 0xe5, 0xb8, 0xf0, 0x58, 0x8e, 0xfc, 0xd6, + 0xc3, 0xbf, 0xfe, 0xfd, 0x71, 0xf8, 0x3c, 0x5e, 0x50, 0xfb, 0xcd, 0x67, 0xfc, 0xbb, 0x84, 0xa6, + 0xda, 0x06, 0x17, 0x5e, 0xeb, 0x77, 0x61, 0xb7, 0xa9, 0x9a, 0xbf, 0x76, 0x02, 0x26, 0xa8, 0x2e, + 0x0a, 0xd5, 0x97, 0xb1, 0xd2, 0x43, 0x75, 0x9c, 0xe5, 0x10, 0xe8, 0xc6, 0x56, 0x24, 0xf6, 0x37, + 0x09, 0x9d, 0x49, 0x0f, 0x2e, 0x7c, 0xf5, 0x58, 0x2a, 0x5a, 0x67, 0x64, 0xbe, 0x38, 0x28, 0x0d, + 0x94, 0xbf, 0x2f, 0x94, 0xaf, 0xe1, 0x62, 0x3f, 0xe5, 0xac, 0x21, 0x5d, 0x7d, 0xd0, 0x98, 0xc6, + 0x7b, 0xf8, 0xb9, 0x84, 0x5e, 0xed, 0xd8, 0x60, 0xf8, 0xbd, 0x7e, 0x8a, 0x7a, 0xf5, 0x77, 0xfe, + 0xfa, 0x09, 0xd9, 0x60, 0xeb, 0x13, 0x61, 0x6b, 0x1d, 0x97, 0x7a, 0xd8, 0x6a, 0xfb, 0xde, 0x1b, + 0xf1, 0xa7, 0xe9, 0x41, 0xea, 0x61, 0xed, 0xe1, 0x3f, 0x24, 0x34, 0xd5, 0x36, 0x65, 0xfb, 0xf7, + 0x59, 0xb7, 0xff, 0x1d, 0xf4, 0xef, 0xb3, 0xae, 0x23, 0x5d, 0xfe, 0x50, 0xd8, 0x7a, 0x17, 0xaf, + 0x0d, 0x62, 0x8b, 0x1d, 0x15, 0x6c, 0x0f, 0xff, 0x2d, 0xa1, 0xc9, 0xd6, 0xf8, 0xf8, 0x9d, 0x41, + 0x15, 0x25, 0x56, 0xd6, 0x06, 0x27, 0x82, 0x93, 0xbb, 0xc2, 0xc9, 0x26, 0xbe, 0x39, 0x88, 0x93, + 0x26, 0x23, 0xad, 0x55, 0x2a, 0x69, 0x8f, 0x0f, 0x0a, 0xd2, 0x93, 0x83, 0x82, 0xf4, 0xfc, 0xa0, + 0x20, 0x7d, 0x7f, 0x58, 0x18, 0x7a, 0x72, 0x58, 0x18, 0xfa, 0xe7, 0xb0, 0x30, 0xf4, 0x45, 0xb1, + 0xdf, 0x0c, 0xda, 0x6d, 0xbd, 0x5b, 0x0c, 0x25, 0x2b, 0x23, 0xfe, 0x00, 0x58, 0xfd, 0x3f, 0x00, + 0x00, 0xff, 0xff, 0x88, 0xdc, 0x96, 0x10, 0xbd, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -749,6 +846,8 @@ type QueryClient interface { ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) // ChainsRegistry queries the latest info for a given list of chains in Babylon's view ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) + // FinalityProviderChain info about one finality provider's chain id + FinalityProviderChain(ctx context.Context, in *QueryFinalityProviderChainRequest, opts ...grpc.CallOption) (*QueryFinalityProviderChainResponse, error) // FinalityProviders queries all finality providers for a given chain FinalityProviders(ctx context.Context, in *QueryFinalityProvidersRequest, opts ...grpc.CallOption) (*QueryFinalityProvidersResponse, error) // FinalityProvider info about one finality provider @@ -790,6 +889,15 @@ func (c *queryClient) ChainsRegistry(ctx context.Context, in *QueryChainsRegistr return out, nil } +func (c *queryClient) FinalityProviderChain(ctx context.Context, in *QueryFinalityProviderChainRequest, opts ...grpc.CallOption) (*QueryFinalityProviderChainResponse, error) { + out := new(QueryFinalityProviderChainResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/FinalityProviderChain", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) FinalityProviders(ctx context.Context, in *QueryFinalityProvidersRequest, opts ...grpc.CallOption) (*QueryFinalityProvidersResponse, error) { out := new(QueryFinalityProvidersResponse) err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/FinalityProviders", in, out, opts...) @@ -816,6 +924,8 @@ type QueryServer interface { ChainRegistryList(context.Context, *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) // ChainsRegistry queries the latest info for a given list of chains in Babylon's view ChainsRegistry(context.Context, *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) + // FinalityProviderChain info about one finality provider's chain id + FinalityProviderChain(context.Context, *QueryFinalityProviderChainRequest) (*QueryFinalityProviderChainResponse, error) // FinalityProviders queries all finality providers for a given chain FinalityProviders(context.Context, *QueryFinalityProvidersRequest) (*QueryFinalityProvidersResponse, error) // FinalityProvider info about one finality provider @@ -835,6 +945,9 @@ func (*UnimplementedQueryServer) ChainRegistryList(ctx context.Context, req *Que func (*UnimplementedQueryServer) ChainsRegistry(ctx context.Context, req *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ChainsRegistry not implemented") } +func (*UnimplementedQueryServer) FinalityProviderChain(ctx context.Context, req *QueryFinalityProviderChainRequest) (*QueryFinalityProviderChainResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FinalityProviderChain not implemented") +} func (*UnimplementedQueryServer) FinalityProviders(ctx context.Context, req *QueryFinalityProvidersRequest) (*QueryFinalityProvidersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FinalityProviders not implemented") } @@ -900,6 +1013,24 @@ func _Query_ChainsRegistry_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _Query_FinalityProviderChain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryFinalityProviderChainRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).FinalityProviderChain(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/babylon.btcstkconsumer.v1.Query/FinalityProviderChain", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).FinalityProviderChain(ctx, req.(*QueryFinalityProviderChainRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_FinalityProviders_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryFinalityProvidersRequest) if err := dec(in); err != nil { @@ -952,6 +1083,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "ChainsRegistry", Handler: _Query_ChainsRegistry_Handler, }, + { + MethodName: "FinalityProviderChain", + Handler: _Query_FinalityProviderChain_Handler, + }, { MethodName: "FinalityProviders", Handler: _Query_FinalityProviders_Handler, @@ -1437,6 +1572,66 @@ func (m *FinalityProviderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } +func (m *QueryFinalityProviderChainRequest) 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 *QueryFinalityProviderChainRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryFinalityProviderChainRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.FpBtcPkHex) > 0 { + i -= len(m.FpBtcPkHex) + copy(dAtA[i:], m.FpBtcPkHex) + i = encodeVarintQuery(dAtA, i, uint64(len(m.FpBtcPkHex))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryFinalityProviderChainResponse) 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 *QueryFinalityProviderChainResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryFinalityProviderChainResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -1641,6 +1836,32 @@ func (m *FinalityProviderResponse) Size() (n int) { return n } +func (m *QueryFinalityProviderChainRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FpBtcPkHex) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryFinalityProviderChainResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2921,6 +3142,170 @@ func (m *FinalityProviderResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryFinalityProviderChainRequest) 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: QueryFinalityProviderChainRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryFinalityProviderChainRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FpBtcPkHex", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FpBtcPkHex = string(dAtA[iNdEx:postIndex]) + 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 *QueryFinalityProviderChainResponse) 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: QueryFinalityProviderChainResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryFinalityProviderChainResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + 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 skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/btcstkconsumer/types/query.pb.gw.go b/x/btcstkconsumer/types/query.pb.gw.go index 9e5282ed6..d561633c9 100644 --- a/x/btcstkconsumer/types/query.pb.gw.go +++ b/x/btcstkconsumer/types/query.pb.gw.go @@ -87,19 +87,26 @@ func local_request_Query_ChainRegistryList_0(ctx context.Context, marshaler runt } -var ( - filter_Query_ChainsRegistry_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - func request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryChainsRegistryRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["chain_ids"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_ids") } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsRegistry_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + + protoReq.ChainIds, err = runtime.StringSlice(val, ",") + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_ids", err) } msg, err := client.ChainsRegistry(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -111,11 +118,22 @@ func local_request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime var protoReq QueryChainsRegistryRequest var metadata runtime.ServerMetadata - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["chain_ids"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_ids") } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainsRegistry_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + + protoReq.ChainIds, err = runtime.StringSlice(val, ",") + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_ids", err) } msg, err := server.ChainsRegistry(ctx, &protoReq) @@ -123,14 +141,86 @@ func local_request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime } +func request_Query_FinalityProviderChain_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalityProviderChainRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["fp_btc_pk_hex"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "fp_btc_pk_hex") + } + + protoReq.FpBtcPkHex, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fp_btc_pk_hex", err) + } + + msg, err := client.FinalityProviderChain(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_FinalityProviderChain_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalityProviderChainRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["fp_btc_pk_hex"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "fp_btc_pk_hex") + } + + protoReq.FpBtcPkHex, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fp_btc_pk_hex", err) + } + + msg, err := server.FinalityProviderChain(ctx, &protoReq) + return msg, metadata, err + +} + var ( - filter_Query_FinalityProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + filter_Query_FinalityProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{"chain_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_Query_FinalityProviders_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryFinalityProvidersRequest var metadata runtime.ServerMetadata + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["chain_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + } + + protoReq.ChainId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + } + if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -147,6 +237,24 @@ func local_request_Query_FinalityProviders_0(ctx context.Context, marshaler runt var protoReq QueryFinalityProvidersRequest var metadata runtime.ServerMetadata + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["chain_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + } + + protoReq.ChainId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + } + if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -159,10 +267,6 @@ func local_request_Query_FinalityProviders_0(ctx context.Context, marshaler runt } -var ( - filter_Query_FinalityProvider_0 = &utilities.DoubleArray{Encoding: map[string]int{"fp_btc_pk_hex": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - func request_Query_FinalityProvider_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryFinalityProviderRequest var metadata runtime.ServerMetadata @@ -174,6 +278,17 @@ func request_Query_FinalityProvider_0(ctx context.Context, marshaler runtime.Mar _ = err ) + val, ok = pathParams["chain_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + } + + protoReq.ChainId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + } + val, ok = pathParams["fp_btc_pk_hex"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "fp_btc_pk_hex") @@ -185,13 +300,6 @@ func request_Query_FinalityProvider_0(ctx context.Context, marshaler runtime.Mar return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fp_btc_pk_hex", err) } - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalityProvider_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := client.FinalityProvider(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err @@ -208,6 +316,17 @@ func local_request_Query_FinalityProvider_0(ctx context.Context, marshaler runti _ = err ) + val, ok = pathParams["chain_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + } + + protoReq.ChainId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + } + val, ok = pathParams["fp_btc_pk_hex"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "fp_btc_pk_hex") @@ -219,13 +338,6 @@ func local_request_Query_FinalityProvider_0(ctx context.Context, marshaler runti return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fp_btc_pk_hex", err) } - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_FinalityProvider_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := server.FinalityProvider(ctx, &protoReq) return msg, metadata, err @@ -306,6 +418,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_FinalityProviderChain_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_FinalityProviderChain_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_FinalityProviderChain_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_FinalityProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -453,6 +588,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_FinalityProviderChain_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_FinalityProviderChain_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_FinalityProviderChain_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_FinalityProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -497,15 +652,17 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"babylonchain", "babylon", "btcstkconsumer", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_ChainRegistryList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "chain_registry_list"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_ChainsRegistry_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "chains_registry"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_ChainsRegistry_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "btcstkconsumer", "v1", "chains_registry", "chain_ids"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_FinalityProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "finality_providers"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_FinalityProviderChain_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "btcstkconsumer", "v1", "finality_provider_chain", "fp_btc_pk_hex"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_FinalityProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"babylon", "btcstkconsumer", "v1", "finality_providers", "fp_btc_pk_hex", "finality_provider"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_FinalityProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "btcstkconsumer", "v1", "finality_providers", "chain_id"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_FinalityProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"babylon", "btcstkconsumer", "v1", "finality_provider", "chain_id", "fp_btc_pk_hex"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -515,6 +672,8 @@ var ( forward_Query_ChainsRegistry_0 = runtime.ForwardResponseMessage + forward_Query_FinalityProviderChain_0 = runtime.ForwardResponseMessage + forward_Query_FinalityProviders_0 = runtime.ForwardResponseMessage forward_Query_FinalityProvider_0 = runtime.ForwardResponseMessage From 76efc0db8ecdb6e0911147fe694970d891ed9d2b Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Fri, 22 Mar 2024 10:53:31 +0100 Subject: [PATCH 09/85] Update CHANGELOG --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1793be5f2..7217f11fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [Unreleased](https://github.com/babylonchain/babylon-private/tree/HEAD) + +[Full Changelog](https://github.com/babylonchain/babylon-private/compare/euphrates-0.1.0-rc.0...HEAD) + +## [euphrates-0.1.0-rc.0](https://github.com/babylonchain/babylon-private/tree/euphrates-0.1.0-rc.0) (2024-03-22) + +[Full Changelog](https://github.com/babylonchain/babylon-private/compare/v0.8.5...euphrates-0.1.0-rc.0) + +**Closed issues:** + +- handler for registering consumer chain finality providers [\#211](https://github.com/babylonchain/babylon-private/issues/211) +- restaking support and tests [\#208](https://github.com/babylonchain/babylon-private/issues/208) +- New module for BTC staking integration [\#204](https://github.com/babylonchain/babylon-private/issues/204) +- Consumer chain finality provider registry [\#203](https://github.com/babylonchain/babylon-private/issues/203) + ## [v0.8.0](https://github.com/babylonchain/babylon/tree/v0.8.0) (2024-02-08) [Full Changelog](https://github.com/babylonchain/babylon/compare/v0.8.0-rc.0...v0.8.0) From ce164ead2e5188b0318d82cd2346b08b4bf52182 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Mon, 25 Mar 2024 18:19:10 +1100 Subject: [PATCH 10/85] fix: only calculating Babylon FPs for FP set rotation (#223) --- x/btcstaking/keeper/power_dist_change.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/x/btcstaking/keeper/power_dist_change.go b/x/btcstaking/keeper/power_dist_change.go index 1f0ff4de2..ff468665b 100644 --- a/x/btcstaking/keeper/power_dist_change.go +++ b/x/btcstaking/keeper/power_dist_change.go @@ -124,10 +124,13 @@ func (k Keeper) ProcessAllPowerDistUpdateEvents( if err != nil { panic(err) // only programming error } - // add the BTC delegation to each restaked finality provider + // add the BTC delegation to each restaked **Babylon** finality provider + // TODO: separate FpBtcPkList for Babylon FPs and consumer chain FPs for _, fpBTCPK := range btcDel.FpBtcPkList { - fpBTCPKHex := fpBTCPK.MarshalHex() - activeBTCDels[fpBTCPKHex] = append(activeBTCDels[fpBTCPKHex], btcDel) + if k.HasFinalityProvider(ctx, fpBTCPK) { + fpBTCPKHex := fpBTCPK.MarshalHex() + activeBTCDels[fpBTCPKHex] = append(activeBTCDels[fpBTCPKHex], btcDel) + } } } else if delEvent.NewState == types.BTCDelegationStatus_UNBONDED { // add the expired BTC delegation to the map From 5c15e74b39dd9d02e601e2f43a6005186e930a9b Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 25 Mar 2024 08:26:59 +0100 Subject: [PATCH 11/85] Update CHANGELOG --- CHANGELOG.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7217f11fa..7c844b979 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,15 @@ ## [Unreleased](https://github.com/babylonchain/babylon-private/tree/HEAD) -[Full Changelog](https://github.com/babylonchain/babylon-private/compare/euphrates-0.1.0-rc.0...HEAD) +[Full Changelog](https://github.com/babylonchain/babylon-private/compare/euphrates-0.1.0-rc.1...HEAD) + +## [euphrates-0.1.0-rc.1](https://github.com/babylonchain/babylon-private/tree/euphrates-0.1.0-rc.1) (2024-03-25) + +[Full Changelog](https://github.com/babylonchain/babylon-private/compare/euphrates-0.1.0-rc.0...euphrates-0.1.0-rc.1) + +**Fixed bugs:** + +- Fix: only calculating Babylon FPs for FP set rotation (#223) ## [euphrates-0.1.0-rc.0](https://github.com/babylonchain/babylon-private/tree/euphrates-0.1.0-rc.0) (2024-03-22) From b98b20e9738e728bf258ef5ea13c0d62a29985d1 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Tue, 2 Apr 2024 23:03:35 +1100 Subject: [PATCH 12/85] fix --- x/btcstaking/keeper/msg_server_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/btcstaking/keeper/msg_server_test.go b/x/btcstaking/keeper/msg_server_test.go index d286c107a..94d55ca74 100644 --- a/x/btcstaking/keeper/msg_server_test.go +++ b/x/btcstaking/keeper/msg_server_test.go @@ -211,7 +211,7 @@ func TestProperVersionInDelegation(t *testing.T) { stakingValue, 1000, ) - require.NoError(t, err) + h.NoError(err) // ensure consistency between the msg and the BTC delegation in DB actualDel, err := h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingTxHash) From 0a6e9f8930e27f425c30df97b77f64da9a2ce05a Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 3 Apr 2024 15:32:45 +0200 Subject: [PATCH 13/85] R/consumer chain 2 (#224) * Rename consumer keys for clarity * Rename btc staking consumer methods * Rename consumer delegation private methods * Move consumer delegations to btcstaking * Refactor BTC delegations into one store * Simplify logic * Improve comments --- .../keeper/btc_consumer_delegations.go} | 78 ++++++------------- x/btcstaking/keeper/btc_delegations.go | 38 +++++---- x/btcstaking/keeper/grpc_query.go | 10 +-- x/btcstaking/keeper/keeper_test.go | 5 ++ x/btcstaking/keeper/msg_server.go | 52 ++++++------- x/btcstaking/keeper/restaking_test.go | 7 +- x/btcstaking/types/expected_keepers.go | 15 ++-- x/btcstaking/types/keys.go | 1 + .../keeper/consumer_chain_registry.go | 8 +- .../keeper/consumer_chain_registry_test.go | 2 +- .../keeper/finality_provider_registry.go | 28 +++---- .../keeper/finality_provider_registry_test.go | 6 +- x/btcstkconsumer/keeper/grpc_query.go | 4 +- x/btcstkconsumer/keeper/grpc_query_test.go | 6 +- x/btcstkconsumer/keeper/msg_server.go | 2 +- x/btcstkconsumer/types/keys.go | 10 +-- x/finality/types/mocked_keepers.go | 8 +- 17 files changed, 124 insertions(+), 156 deletions(-) rename x/{btcstkconsumer/keeper/btc_delegations.go => btcstaking/keeper/btc_consumer_delegations.go} (52%) diff --git a/x/btcstkconsumer/keeper/btc_delegations.go b/x/btcstaking/keeper/btc_consumer_delegations.go similarity index 52% rename from x/btcstkconsumer/keeper/btc_delegations.go rename to x/btcstaking/keeper/btc_consumer_delegations.go index 1669f9c38..7bae74394 100644 --- a/x/btcstkconsumer/keeper/btc_delegations.go +++ b/x/btcstaking/keeper/btc_consumer_delegations.go @@ -6,20 +6,16 @@ import ( "cosmossdk.io/store/prefix" bbn "github.com/babylonchain/babylon/types" bstypes "github.com/babylonchain/babylon/x/btcstaking/types" - "github.com/babylonchain/babylon/x/btcstkconsumer/types" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/cosmos/cosmos-sdk/runtime" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" ) -// AddBTCDelegation adds a BTC delegation post verification to the system, including -// - indexing the given BTC delegation in the BTC delegator store, and -// - saving it under BTC delegation store +// IndexBTCConsumerDelegation indexes a BTC delegation into the BTC consumer delegator store // CONTRACT: this function only takes BTC delegations that have passed verifications // imposed in `x/btcstaking/msg_server.go` -// TODO: is it possible to not replicate the storage of restaked BTC delegation? -func (k Keeper) AddBTCDelegation(ctx sdk.Context, btcDel *bstypes.BTCDelegation) error { +func (k Keeper) IndexBTCConsumerDelegation(ctx sdk.Context, btcDel *bstypes.BTCDelegation) error { if err := btcDel.ValidateBasic(); err != nil { return err } @@ -33,12 +29,12 @@ func (k Keeper) AddBTCDelegation(ctx sdk.Context, btcDel *bstypes.BTCDelegation) // for each finality provider the delegation restakes to, update its index for _, fpBTCPK := range btcDel.FpBtcPkList { // skip Babylon finality providers - if !k.HasFinalityProvider(ctx, &fpBTCPK) { + if !k.bscKeeper.HasConsumerFinalityProvider(ctx, &fpBTCPK) { continue } // get BTC delegation index under this finality provider - btcDelIndex := k.getBTCDelegatorDelegationIndex(ctx, &fpBTCPK, btcDel.BtcPk) + btcDelIndex := k.getBTCConsumerDelegatorDelegationIndex(ctx, &fpBTCPK, btcDel.BtcPk) if btcDelIndex == nil { btcDelIndex = bstypes.NewBTCDelegatorDelegationIndex() } @@ -47,19 +43,16 @@ func (k Keeper) AddBTCDelegation(ctx sdk.Context, btcDel *bstypes.BTCDelegation) return bstypes.ErrInvalidStakingTx.Wrapf(err.Error()) } // save the index - k.setBTCDelegatorDelegationIndex(ctx, &fpBTCPK, btcDel.BtcPk, btcDelIndex) + k.setBTCConsumerDelegatorDelegationIndex(ctx, &fpBTCPK, btcDel.BtcPk, btcDelIndex) } - // save this BTC delegation - k.SetBTCDelegation(ctx, btcDel) - return nil } -// GetBTCDelegatorDelegationsResponses gets BTC delegations of BTC delegators under +// GetBTCConsumerDelegatorDelegationsResponses gets BTC delegations of BTC delegators under // the given finality provider. The BTC delegators are paginated. This function is // used by the `FinalityProviderDelegations` query in BTC staking module -func (k Keeper) GetBTCDelegatorDelegationsResponses( +func (k Keeper) GetBTCConsumerDelegatorDelegationsResponses( ctx sdk.Context, fpBTCPK *bbn.BIP340PubKey, pagination *query.PageRequest, @@ -67,7 +60,7 @@ func (k Keeper) GetBTCDelegatorDelegationsResponses( btcHeight uint64, covenantQuorum uint32, ) ([]*bstypes.BTCDelegatorDelegationsResponse, *query.PageResponse, error) { - btcDelStore := k.btcDelegatorStore(ctx, fpBTCPK) + btcDelStore := k.btcConsumerDelegatorStore(ctx, fpBTCPK) btcDels := []*bstypes.BTCDelegatorDelegationsResponse{} pageRes, err := query.Paginate(btcDelStore, pagination, func(key, value []byte) error { @@ -76,7 +69,7 @@ func (k Keeper) GetBTCDelegatorDelegationsResponses( return err } - curBTCDels := k.getBTCDelegatorDelegations(ctx, fpBTCPK, delBTCPK) + curBTCDels := k.getBTCConsumerDelegatorDelegations(ctx, fpBTCPK, delBTCPK) btcDelsResp := make([]*bstypes.BTCDelegationResponse, len(curBTCDels.Dels)) for i, btcDel := range curBTCDels.Dels { @@ -99,42 +92,15 @@ func (k Keeper) GetBTCDelegatorDelegationsResponses( return btcDels, pageRes, nil } -func (k Keeper) SetBTCDelegation(ctx context.Context, btcDel *bstypes.BTCDelegation) { - store := k.btcDelegationStore(ctx) - stakingTxHash := btcDel.MustGetStakingTxHash() - btcDelBytes := k.cdc.MustMarshal(btcDel) - store.Set(stakingTxHash[:], btcDelBytes) -} - -func (k Keeper) getBTCDelegation(ctx context.Context, stakingTxHash chainhash.Hash) *bstypes.BTCDelegation { - store := k.btcDelegationStore(ctx) - btcDelBytes := store.Get(stakingTxHash[:]) - if len(btcDelBytes) == 0 { - return nil - } - var btcDel bstypes.BTCDelegation - k.cdc.MustUnmarshal(btcDelBytes, &btcDel) - return &btcDel -} - -// btcDelegationStore returns the KVStore of the BTC delegations -// prefix: BTCDelegationKey -// key: BTC delegation's staking tx hash -// value: BTCDelegation -func (k Keeper) btcDelegationStore(ctx context.Context) prefix.Store { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - return prefix.NewStore(storeAdapter, types.BTCDelegationKey) -} - -// getBTCDelegatorDelegationIndex gets the BTC delegation index with a given BTC PK under a given finality provider -func (k Keeper) getBTCDelegatorDelegationIndex(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey) *bstypes.BTCDelegatorDelegationIndex { +// getBTCConsumerDelegatorDelegationIndex gets the BTC delegation index with a given BTC PK under a given finality provider +func (k Keeper) getBTCConsumerDelegatorDelegationIndex(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey) *bstypes.BTCDelegatorDelegationIndex { // ensure the finality provider exists - if !k.HasFinalityProvider(ctx, fpBTCPK) { + if !k.bscKeeper.HasConsumerFinalityProvider(ctx, fpBTCPK) { return nil } delBTCPKBytes := delBTCPK.MustMarshal() - store := k.btcDelegatorStore(ctx, fpBTCPK) + store := k.btcConsumerDelegatorStore(ctx, fpBTCPK) // ensure BTC delegator exists if !store.Has(delBTCPKBytes) { @@ -147,15 +113,15 @@ func (k Keeper) getBTCDelegatorDelegationIndex(ctx context.Context, fpBTCPK *bbn return &btcDelIndex } -func (k Keeper) setBTCDelegatorDelegationIndex(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey, btcDelIndex *bstypes.BTCDelegatorDelegationIndex) { - store := k.btcDelegatorStore(ctx, fpBTCPK) +func (k Keeper) setBTCConsumerDelegatorDelegationIndex(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey, btcDelIndex *bstypes.BTCDelegatorDelegationIndex) { + store := k.btcConsumerDelegatorStore(ctx, fpBTCPK) btcDelIndexBytes := k.cdc.MustMarshal(btcDelIndex) store.Set(*delBTCPK, btcDelIndexBytes) } -// getBTCDelegatorDelegations gets the BTC delegations with a given BTC PK under a given finality provider -func (k Keeper) getBTCDelegatorDelegations(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey) *bstypes.BTCDelegatorDelegations { - btcDelIndex := k.getBTCDelegatorDelegationIndex(ctx, fpBTCPK, delBTCPK) +// getBTCConsumerDelegatorDelegations gets the BTC delegations with a given BTC PK under a given finality provider +func (k Keeper) getBTCConsumerDelegatorDelegations(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey) *bstypes.BTCDelegatorDelegations { + btcDelIndex := k.getBTCConsumerDelegatorDelegationIndex(ctx, fpBTCPK, delBTCPK) if btcDelIndex == nil { return nil } @@ -173,12 +139,12 @@ func (k Keeper) getBTCDelegatorDelegations(ctx context.Context, fpBTCPK *bbn.BIP return &bstypes.BTCDelegatorDelegations{Dels: btcDels} } -// btcDelegatorStore returns the KVStore of the BTC delegators -// prefix: BTCDelegatorKey || finality provider's Bitcoin secp256k1 PK +// btcConsumerDelegatorStore returns the KVStore of the BTC Consumer delegators +// prefix: BTCConsumerDelegatorKey || finality provider's Bitcoin secp256k1 PK // key: delegator's Bitcoin secp256k1 PK // value: BTCDelegatorDelegationIndex (a list of BTCDelegations' staking tx hashes) -func (k Keeper) btcDelegatorStore(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) prefix.Store { +func (k Keeper) btcConsumerDelegatorStore(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) prefix.Store { storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - delegationStore := prefix.NewStore(storeAdapter, types.BTCDelegatorKey) + delegationStore := prefix.NewStore(storeAdapter, bstypes.BTCConsumerDelegatorKey) return prefix.NewStore(delegationStore, fpBTCPK.MustMarshal()) } diff --git a/x/btcstaking/keeper/btc_delegations.go b/x/btcstaking/keeper/btc_delegations.go index 33688b5ed..056e08d3f 100644 --- a/x/btcstaking/keeper/btc_delegations.go +++ b/x/btcstaking/keeper/btc_delegations.go @@ -80,7 +80,6 @@ func (k Keeper) addCovenantSigsToBTCDelegation( unbondingTxSig *bbn.BIP340Signature, parsedUnbondingSlashingAdaptorSignatures []asig.AdaptorSignature, params *types.Params, - restakedToConsumers bool, ) { // All is fine add received signatures to the BTC delegation and BtcUndelegation btcDel.AddCovenantSigs( @@ -90,12 +89,8 @@ func (k Keeper) addCovenantSigsToBTCDelegation( parsedUnbondingSlashingAdaptorSignatures, ) - // set BTC delegation back to KV store (and consumer's KV store if restaked to - // consumer finality providers) + // set BTC delegation back to KV store k.setBTCDelegation(ctx, btcDel) - if restakedToConsumers { - k.bscKeeper.SetBTCDelegation(ctx, btcDel) - } // If reaching the covenant quorum after this msg, the BTC delegation becomes // active. Then, record and emit this event @@ -122,16 +117,11 @@ func (k Keeper) btcUndelegate( ctx sdk.Context, btcDel *types.BTCDelegation, unbondingTxSig *bbn.BIP340Signature, - restakedToConsumers bool, ) { btcDel.BtcUndelegation.DelegatorUnbondingSig = unbondingTxSig - // set BTC delegation back to KV store (and consumer's KV store if restaked to - // consumer finality providers) + // set BTC delegation back to KV store k.setBTCDelegation(ctx, btcDel) - if restakedToConsumers { - k.bscKeeper.SetBTCDelegation(ctx, btcDel) - } // notify subscriber about this unbonded BTC delegation event := &types.EventBTCDelegationStateUpdate{ @@ -157,21 +147,35 @@ func (k Keeper) setBTCDelegation(ctx context.Context, btcDel *types.BTCDelegatio } // validateRestakedFPs ensures all finality providers are known to Babylon and at least -// 1 one of them is a Babylon finality provider. It also checks whether the BTC stake is +// one of them is a Babylon finality provider. It also checks whether the BTC stake is // restaked to FPs of consumer chains func (k Keeper) validateRestakedFPs(ctx context.Context, fpBTCPKs []bbn.BIP340PubKey) (bool, error) { - restakedToBabylon := false - restakedToConsumers := false + var ( + fp *types.FinalityProvider + err error + restakedToBabylon = false + restakedToConsumers = false + ) + for _, fpBTCPK := range fpBTCPKs { - if k.HasFinalityProvider(ctx, fpBTCPK) { + // find the fp and determine whether it's Babylon fp or consumer chain fp + if fp, err = k.GetFinalityProvider(ctx, fpBTCPK); err == nil { restakedToBabylon = true continue - } else if k.bscKeeper.HasFinalityProvider(ctx, &fpBTCPK) { + } else if chainID, err := k.bscKeeper.GetConsumerFinalityProviderChain(ctx, &fpBTCPK); err == nil { + fp, err = k.bscKeeper.GetConsumerFinalityProvider(ctx, chainID, &fpBTCPK) + if err != nil { + return false, err + } restakedToConsumers = true continue } else { return false, types.ErrFpNotFound.Wrapf("finality provider pk %s is not found", fpBTCPK.MarshalHex()) } + // ensure the finality provider is not slashed + if fp.IsSlashed() { + return false, types.ErrFpAlreadySlashed + } } if !restakedToBabylon { // a BTC delegation has to stake to at least 1 Babylon finality provider diff --git a/x/btcstaking/keeper/grpc_query.go b/x/btcstaking/keeper/grpc_query.go index 68187f98b..10c88aa7b 100644 --- a/x/btcstaking/keeper/grpc_query.go +++ b/x/btcstaking/keeper/grpc_query.go @@ -71,12 +71,12 @@ func (k Keeper) FinalityProvider(c context.Context, req *types.QueryFinalityProv fp, err := k.GetFinalityProvider(ctx, key) if err != nil { // Try in the btcstkconsumer module - if k.bscKeeper.HasFinalityProvider(ctx, fpPK) { - fpChain, err := k.bscKeeper.GetFinalityProviderChain(ctx, fpPK) + if k.bscKeeper.HasConsumerFinalityProvider(ctx, fpPK) { + fpChain, err := k.bscKeeper.GetConsumerFinalityProviderChain(ctx, fpPK) if err != nil { return nil, err } - fp, err := k.bscKeeper.GetFinalityProvider(ctx, fpChain, fpPK) + fp, err := k.bscKeeper.GetConsumerFinalityProvider(ctx, fpChain, fpPK) if err != nil { return nil, err } @@ -288,9 +288,9 @@ func (k Keeper) FinalityProviderDelegations(ctx context.Context, req *types.Quer if err != nil { return nil, err } - } else if k.bscKeeper.HasFinalityProvider(ctx, fpPK) { + } else if k.bscKeeper.HasConsumerFinalityProvider(ctx, fpPK) { // this is a consumer chain finality provider - btcDels, pageRes, err = k.bscKeeper.GetBTCDelegatorDelegationsResponses(sdkCtx, fpPK, req.Pagination, currentWValue, btcHeight, covenantQuorum) + btcDels, pageRes, err = k.GetBTCConsumerDelegatorDelegationsResponses(sdkCtx, fpPK, req.Pagination, currentWValue, btcHeight, covenantQuorum) if err != nil { return nil, err } diff --git a/x/btcstaking/keeper/keeper_test.go b/x/btcstaking/keeper/keeper_test.go index 862332deb..d5d85f691 100644 --- a/x/btcstaking/keeper/keeper_test.go +++ b/x/btcstaking/keeper/keeper_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + etypes "github.com/babylonchain/babylon/x/epoching/types" "math/rand" "testing" @@ -160,6 +161,10 @@ func (h *Helper) CreateConsumerChainFinalityProvider(r *rand.Rand, chainID strin return nil, nil, nil, err } fp.ChainId = chainID + + registeredEpoch := uint64(10) + h.CheckpointingKeeper.EXPECT().GetEpoch(gomock.Eq(h.Ctx)).Return(&etypes.Epoch{EpochNumber: registeredEpoch}).AnyTimes() + msgNewFp := types.MsgCreateFinalityProvider{ Description: fp.Description, Commission: fp.Commission, diff --git a/x/btcstaking/keeper/msg_server.go b/x/btcstaking/keeper/msg_server.go index 87b497fba..30952ac86 100644 --- a/x/btcstaking/keeper/msg_server.go +++ b/x/btcstaking/keeper/msg_server.go @@ -103,6 +103,20 @@ func (ms msgServer) CreateFinalityProvider(goCtx context.Context, req *types.Msg ChainId: chainID, } + if chainID == ctx.ChainID() { + ms.SetFinalityProvider(ctx, &fp) + } else { + // ensure finality provider does not already exist + if ms.bscKeeper.HasConsumerFinalityProvider(ctx, req.BtcPk) { + return nil, types.ErrFpRegistered + } + // Check that chain is registered in the btcstkconsumer module + if !ms.bscKeeper.IsConsumerChainRegistered(ctx, chainID) { + return nil, types.ErrChainIDNotRegistered + } + ms.bscKeeper.SetConsumerFinalityProvider(ctx, &fp) + } + // notify subscriber if err := ctx.EventManager().EmitTypedEvent(&types.EventNewFinalityProvider{Fp: &fp}); err != nil { return nil, err @@ -207,23 +221,12 @@ func (ms msgServer) CreateBTCDelegation(goCtx context.Context, req *types.MsgCre return nil, types.ErrInvalidProofOfPossession.Wrapf("error while validating proof of posession: %v", err) } - // Ensure all finality providers are known to Babylon, are not slashed, - // and their registered epochs are finalised - for _, fpBTCPK := range req.FpBtcPkList { - // get this finality provider - fp, err := ms.GetFinalityProvider(ctx, fpBTCPK) - if err != nil { - return nil, err - } - // ensure the finality provider is not slashed - if fp.IsSlashed() { - return nil, types.ErrFpAlreadySlashed - } - } - - // Ensure all finality providers are known to Babylon and at least 1 one of them - // is a Babylon finality provider, and then check whether the BTC stake is - // restaked to FPs of consumer chains + // Ensure all finality providers + // - are known to Babylon, + // - at least 1 one of them is a Babylon finality provider, + // - are not slashed, and + // - their registered epochs are finalised + // and then check whether the BTC stake is restaked to FPs of consumer chains // TODO: ensure the BTC delegation does not restake to too many finality providers // (pending concrete design) restakedToConsumers, err := ms.validateRestakedFPs(ctx, req.FpBtcPkList) @@ -473,12 +476,10 @@ func (ms msgServer) CreateBTCDelegation(goCtx context.Context, req *types.MsgCre if err := ms.AddBTCDelegation(ctx, newBTCDel); err != nil { panic(fmt.Errorf("failed to add BTC delegation that has passed verification: %w", err)) } - // if this BTC delegation restaked to consumer chains' FPs, add it to - // btcstkconsumer module's storage as well - // TODO: revisit the relationship between BTC staking module and BTC staking consumer - // module and consolidating the storage of BTC delegations. + // if this BTC delegation is restaked to consumer chains' FPs, add it to btcstkconsumer indexes + // TODO: revisit the relationship between BTC staking module and BTC staking consumer module if restakedToConsumers { - if err := ms.bscKeeper.AddBTCDelegation(ctx, newBTCDel); err != nil { + if err := ms.IndexBTCConsumerDelegation(ctx, newBTCDel); err != nil { panic(fmt.Errorf("failed to add BTC delegation restaked to consumer chains' finality providers despite it has passed verification: %w", err)) } } @@ -520,7 +521,7 @@ func (ms msgServer) AddCovenantSigs(goCtx context.Context, req *types.MsgAddCove } // check whether the BTC stake is restaked to FPs of consumer chains - restakedToConsumers, err := ms.validateRestakedFPs(ctx, btcDel.FpBtcPkList) + _, err = ms.validateRestakedFPs(ctx, btcDel.FpBtcPkList) if err != nil { panic(err) // btcDel has passed verification and this can only be programming error } @@ -647,7 +648,6 @@ func (ms msgServer) AddCovenantSigs(goCtx context.Context, req *types.MsgAddCove req.UnbondingTxSig, parsedUnbondingSlashingAdaptorSignatures, params, - restakedToConsumers, ) return &types.MsgAddCovenantSigsResponse{}, nil @@ -672,7 +672,7 @@ func (ms msgServer) BTCUndelegate(goCtx context.Context, req *types.MsgBTCUndele } // check whether the BTC stake is restaked to FPs of consumer chains - restakedToConsumers, err := ms.validateRestakedFPs(ctx, btcDel.FpBtcPkList) + _, err = ms.validateRestakedFPs(ctx, btcDel.FpBtcPkList) if err != nil { panic(err) // btcDel has passed verification and this can only be programming error } @@ -711,7 +711,7 @@ func (ms msgServer) BTCUndelegate(goCtx context.Context, req *types.MsgBTCUndele // all good, add the signature to BTC delegation's undelegation // and set back - ms.btcUndelegate(ctx, btcDel, req.UnbondingTxSig, restakedToConsumers) + ms.btcUndelegate(ctx, btcDel, req.UnbondingTxSig) return &types.MsgBTCUndelegateResponse{}, nil } diff --git a/x/btcstaking/keeper/restaking_test.go b/x/btcstaking/keeper/restaking_test.go index a36a71a20..0add2c8e5 100644 --- a/x/btcstaking/keeper/restaking_test.go +++ b/x/btcstaking/keeper/restaking_test.go @@ -35,8 +35,7 @@ func FuzzRestaking_RestakedBTCDelegation(f *testing.F) { wValue := h.BTCCheckpointKeeper.GetParams(h.Ctx).CheckpointFinalizationTimeout // generate and insert new Babylon finality provider - _, fpPK, fp := h.CreateFinalityProvider(r) - t.Log(changeAddress, fpPK, fp) + _, fpPK, _ := h.CreateFinalityProvider(r) /* ensure that registering a consumer chain finality provider with non-existing chain ID will fail @@ -53,7 +52,7 @@ func FuzzRestaking_RestakedBTCDelegation(f *testing.F) { _, czFPPK, czFP, err := h.CreateConsumerChainFinalityProvider(r, chainRegister.ChainId) h.NoError(err) czFPBTCPK := bbn.NewBIP340PubKeyFromBTCPK(czFPPK) - czFP2, err := h.BTCStkConsumerKeeper.GetFinalityProvider(h.Ctx, chainRegister.ChainId, czFPBTCPK) + czFP2, err := h.BTCStkConsumerKeeper.GetConsumerFinalityProvider(h.Ctx, chainRegister.ChainId, czFPBTCPK) h.NoError(err) require.Equal(t, czFP, czFP2) @@ -84,7 +83,7 @@ func FuzzRestaking_RestakedBTCDelegation(f *testing.F) { 1000, ) h.Error(err) - require.True(t, errors.Is(err, types.ErrNoBabylonFPRestaked)) + require.True(t, errors.Is(err, types.ErrNoBabylonFPRestaked), err) /* happy case -- restaking to a Babylon fp and a consumer chain fp diff --git a/x/btcstaking/types/expected_keepers.go b/x/btcstaking/types/expected_keepers.go index 67909d5a1..39764b40b 100644 --- a/x/btcstaking/types/expected_keepers.go +++ b/x/btcstaking/types/expected_keepers.go @@ -8,8 +8,6 @@ import ( btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" btclctypes "github.com/babylonchain/babylon/x/btclightclient/types" etypes "github.com/babylonchain/babylon/x/epoching/types" - sdk "github.com/cosmos/cosmos-sdk/types" - query "github.com/cosmos/cosmos-sdk/types/query" ) type BTCLightClientKeeper interface { @@ -29,12 +27,9 @@ type CheckpointingKeeper interface { } type BTCStkConsumerKeeper interface { - IsChainRegistered(ctx context.Context, chainID string) bool - HasFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) bool - GetFinalityProviderChain(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) - GetFinalityProvider(ctx context.Context, chainID string, fpBTCPK *bbn.BIP340PubKey) (*FinalityProvider, error) - SetFinalityProvider(ctx context.Context, fp *FinalityProvider) - AddBTCDelegation(ctx sdk.Context, btcDel *BTCDelegation) error - SetBTCDelegation(ctx context.Context, btcDel *BTCDelegation) - GetBTCDelegatorDelegationsResponses(ctx sdk.Context, fpBTCPK *bbn.BIP340PubKey, pagination *query.PageRequest, wValue uint64, btcHeight uint64, covenantQuorum uint32) ([]*BTCDelegatorDelegationsResponse, *query.PageResponse, error) + IsConsumerChainRegistered(ctx context.Context, chainID string) bool + HasConsumerFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) bool + GetConsumerFinalityProviderChain(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) + GetConsumerFinalityProvider(ctx context.Context, chainID string, fpBTCPK *bbn.BIP340PubKey) (*FinalityProvider, error) + SetConsumerFinalityProvider(ctx context.Context, fp *FinalityProvider) } diff --git a/x/btcstaking/types/keys.go b/x/btcstaking/types/keys.go index 099e808cd..74a0748db 100644 --- a/x/btcstaking/types/keys.go +++ b/x/btcstaking/types/keys.go @@ -23,4 +23,5 @@ var ( BTCHeightKey = []byte{0x06} // key prefix for the BTC heights VotingPowerDistCacheKey = []byte{0x07} // key prefix for voting power distribution cache PowerDistUpdateKey = []byte{0x08} // key prefix for power distribution update events + BTCConsumerDelegatorKey = []byte{0x09} // key prefix for the Consumer BTC delegators ) diff --git a/x/btcstkconsumer/keeper/consumer_chain_registry.go b/x/btcstkconsumer/keeper/consumer_chain_registry.go index 634ae515b..45441471c 100644 --- a/x/btcstkconsumer/keeper/consumer_chain_registry.go +++ b/x/btcstkconsumer/keeper/consumer_chain_registry.go @@ -14,14 +14,14 @@ func (k Keeper) SetChainRegister(ctx context.Context, chainRegister *types.Chain } // IsChainRegistered returns whether the chain register exists for a given ID -func (k Keeper) IsChainRegistered(ctx context.Context, chainID string) bool { +func (k Keeper) IsConsumerChainRegistered(ctx context.Context, chainID string) bool { store := k.chainRegistryStore(ctx) return store.Has([]byte(chainID)) } // GetChainRegister returns the ChainRegister struct for a chain with a given ID. func (k Keeper) GetChainRegister(ctx context.Context, chainID string) (*types.ChainRegister, error) { - if !k.IsChainRegistered(ctx, chainID) { + if !k.IsConsumerChainRegistered(ctx, chainID) { return nil, types.ErrChainNotRegistered } @@ -47,10 +47,10 @@ func (k Keeper) GetAllRegisteredChainIDs(ctx context.Context) []string { } // chainRegistryStore stores the information of registered CZ chains -// prefix: ChainRegisterKey +// prefix: ConsumerChainRegisterKey // key: chainID // value: ChainRegister func (k Keeper) chainRegistryStore(ctx context.Context) prefix.Store { storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - return prefix.NewStore(storeAdapter, types.ChainRegisterKey) + return prefix.NewStore(storeAdapter, types.ConsumerChainRegisterKey) } diff --git a/x/btcstkconsumer/keeper/consumer_chain_registry_test.go b/x/btcstkconsumer/keeper/consumer_chain_registry_test.go index 0a4298615..8ab7210cf 100644 --- a/x/btcstkconsumer/keeper/consumer_chain_registry_test.go +++ b/x/btcstkconsumer/keeper/consumer_chain_registry_test.go @@ -23,7 +23,7 @@ func FuzzChainRegistry(f *testing.F) { chainRegister := datagen.GenRandomChainRegister(r) // check that the chain is not registered - isRegistered := zcKeeper.IsChainRegistered(ctx, chainRegister.ChainId) + isRegistered := zcKeeper.IsConsumerChainRegistered(ctx, chainRegister.ChainId) require.False(t, isRegistered) // Check that the chain is not registered diff --git a/x/btcstkconsumer/keeper/finality_provider_registry.go b/x/btcstkconsumer/keeper/finality_provider_registry.go index fab3488e8..ce63fe45b 100644 --- a/x/btcstkconsumer/keeper/finality_provider_registry.go +++ b/x/btcstkconsumer/keeper/finality_provider_registry.go @@ -13,8 +13,8 @@ import ( btcstktypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" ) -// SetFinalityProvider adds the given finality provider to CZ chains KVStore -func (k Keeper) SetFinalityProvider(ctx context.Context, fp *btcstaking.FinalityProvider) { +// SetConsumerFinalityProvider adds the given finality provider to CZ chains KVStore +func (k Keeper) SetConsumerFinalityProvider(ctx context.Context, fp *btcstaking.FinalityProvider) { store := k.finalityProviderStore(ctx, fp.ChainId) fpBytes := k.cdc.MustMarshal(fp) store.Set(fp.BtcPk.MustMarshal(), fpBytes) @@ -23,9 +23,9 @@ func (k Keeper) SetFinalityProvider(ctx context.Context, fp *btcstaking.Finality fpChainStore.Set(fp.BtcPk.MustMarshal(), []byte(fp.ChainId)) } -// GetFinalityProvider gets the finality provider in the chain id with the given finality provider Bitcoin PK -func (k Keeper) GetFinalityProvider(ctx context.Context, chainID string, fpBTCPK *bbn.BIP340PubKey) (*btcstaking.FinalityProvider, error) { - if !k.HasFinalityProvider(ctx, fpBTCPK) { +// GetConsumerFinalityProvider gets the finality provider in the chain id with the given finality provider Bitcoin PK +func (k Keeper) GetConsumerFinalityProvider(ctx context.Context, chainID string, fpBTCPK *bbn.BIP340PubKey) (*btcstaking.FinalityProvider, error) { + if !k.HasConsumerFinalityProvider(ctx, fpBTCPK) { return nil, btcstaking.ErrFpNotFound } store := k.finalityProviderStore(ctx, chainID) @@ -39,15 +39,15 @@ func (k Keeper) GetFinalityProvider(ctx context.Context, chainID string, fpBTCPK return &fp, nil } -// HasFinalityProvider checks if the finality provider already exists, across / independently of all chain ids -func (k Keeper) HasFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) bool { +// HasConsumerFinalityProvider checks if the finality provider already exists, across / independently of all chain ids +func (k Keeper) HasConsumerFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) bool { store := k.finalityProviderChainStore(ctx) return store.Has(*fpBTCPK) } -// GetFinalityProviderChain gets the finality provider chain id for the given finality provider Bitcoin PK -func (k Keeper) GetFinalityProviderChain(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) { - if !k.HasFinalityProvider(ctx, fpBTCPK) { +// GetConsumerFinalityProviderChain gets the finality provider chain id for the given finality provider Bitcoin PK +func (k Keeper) GetConsumerFinalityProviderChain(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) { + if !k.HasConsumerFinalityProvider(ctx, fpBTCPK) { return "", btcstaking.ErrFpNotFound } store := k.finalityProviderChainStore(ctx) @@ -107,20 +107,20 @@ func (k Keeper) GetFPs(ctx context.Context, chainID string) map[string]btcstakin } // finalityProviderStore returns the KVStore of the finality provider set per chain -// prefix: FinalityProviderKey || chain id +// prefix: ConsumerFinalityProviderKey || chain id // key: Bitcoin PubKey // value: FinalityProvider func (k Keeper) finalityProviderStore(ctx context.Context, chainID string) prefix.Store { storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - fpStore := prefix.NewStore(storeAdapter, btcstktypes.FinalityProviderKey) + fpStore := prefix.NewStore(storeAdapter, btcstktypes.ConsumerFinalityProviderKey) return prefix.NewStore(fpStore, []byte(chainID)) } // finalityProviderChainStore returns the KVStore of the finality provider chain per FP BTC PubKey -// prefix: FinalityProviderChainKey +// prefix: ConsumerFinalityProviderChainKey // key: Bitcoin PubKey // value: chain id func (k Keeper) finalityProviderChainStore(ctx context.Context) prefix.Store { storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - return prefix.NewStore(storeAdapter, btcstktypes.FinalityProviderChainKey) + return prefix.NewStore(storeAdapter, btcstktypes.ConsumerFinalityProviderChainKey) } diff --git a/x/btcstkconsumer/keeper/finality_provider_registry_test.go b/x/btcstkconsumer/keeper/finality_provider_registry_test.go index 23cbc4fa9..82a9df098 100644 --- a/x/btcstkconsumer/keeper/finality_provider_registry_test.go +++ b/x/btcstkconsumer/keeper/finality_provider_registry_test.go @@ -24,7 +24,7 @@ func FuzzFPRegistry(f *testing.F) { czChainID := "test-" + datagen.GenRandomHexStr(r, 10) // check that the chain is not registered - isRegistered := bscKeeper.IsChainRegistered(ctx, czChainID) + isRegistered := bscKeeper.IsConsumerChainRegistered(ctx, czChainID) require.False(t, isRegistered) // Create a random finality provider public key @@ -51,10 +51,10 @@ func FuzzFPRegistry(f *testing.F) { BtcPk: fpBtcPk, ChainId: czChainID, } - bscKeeper.SetFinalityProvider(ctx, &fp) + bscKeeper.SetConsumerFinalityProvider(ctx, &fp) // Check that the finality provider is being registered - hasFP := bscKeeper.HasFinalityProvider(ctx, fpBtcPk) + hasFP := bscKeeper.HasConsumerFinalityProvider(ctx, fpBtcPk) require.True(t, hasFP) }) } diff --git a/x/btcstkconsumer/keeper/grpc_query.go b/x/btcstkconsumer/keeper/grpc_query.go index d4e21676e..c490be9e5 100644 --- a/x/btcstkconsumer/keeper/grpc_query.go +++ b/x/btcstkconsumer/keeper/grpc_query.go @@ -123,7 +123,7 @@ func (k Keeper) FinalityProvider(c context.Context, req *types.QueryFinalityProv } ctx := sdk.UnwrapSDKContext(c) - fp, err := k.GetFinalityProvider(ctx, req.ChainId, fpPK) + fp, err := k.GetConsumerFinalityProvider(ctx, req.ChainId, fpPK) if err != nil { return nil, err } @@ -149,7 +149,7 @@ func (k Keeper) FinalityProviderChain(c context.Context, req *types.QueryFinalit } ctx := sdk.UnwrapSDKContext(c) - chainID, err := k.GetFinalityProviderChain(ctx, fpPK) + chainID, err := k.GetConsumerFinalityProviderChain(ctx, fpPK) if err != nil { return nil, err } diff --git a/x/btcstkconsumer/keeper/grpc_query_test.go b/x/btcstkconsumer/keeper/grpc_query_test.go index e8409b65c..7721d63e5 100644 --- a/x/btcstkconsumer/keeper/grpc_query_test.go +++ b/x/btcstkconsumer/keeper/grpc_query_test.go @@ -120,7 +120,7 @@ func FuzzFinalityProviders(f *testing.F) { require.NoError(t, err) fp.ChainId = chainID - bscKeeper.SetFinalityProvider(ctx, fp) + bscKeeper.SetConsumerFinalityProvider(ctx, fp) fpsMap[fp.BtcPk.MarshalHex()] = fp } numOfFpsInStore := len(fpsMap) @@ -189,7 +189,7 @@ func FuzzFinalityProvider(f *testing.F) { require.NoError(t, err) fp.ChainId = chainID - bscKeeper.SetFinalityProvider(ctx, fp) + bscKeeper.SetConsumerFinalityProvider(ctx, fp) existingFp = fp.BtcPk.MarshalHex() fpsMap[existingFp] = fp } @@ -252,7 +252,7 @@ func FuzzFinalityProviderChain(f *testing.F) { require.NoError(t, err) fp.ChainId = chainID - bscKeeper.SetFinalityProvider(ctx, fp) + bscKeeper.SetConsumerFinalityProvider(ctx, fp) existingFp = fp.BtcPk.MarshalHex() fpsMap[existingFp] = fp } diff --git a/x/btcstkconsumer/keeper/msg_server.go b/x/btcstkconsumer/keeper/msg_server.go index 79c40a6d3..46180e36b 100644 --- a/x/btcstkconsumer/keeper/msg_server.go +++ b/x/btcstkconsumer/keeper/msg_server.go @@ -33,7 +33,7 @@ func (ms msgServer) RegisterChain(goCtx context.Context, req *types.MsgRegisterC } ctx := sdk.UnwrapSDKContext(goCtx) - if ms.IsChainRegistered(ctx, req.ChainId) { + if ms.IsConsumerChainRegistered(ctx, req.ChainId) { return nil, types.ErrChainAlreadyRegistered } ms.SetChainRegister(ctx, &chainRegister) diff --git a/x/btcstkconsumer/types/keys.go b/x/btcstkconsumer/types/keys.go index 309d6f627..87cb296ef 100644 --- a/x/btcstkconsumer/types/keys.go +++ b/x/btcstkconsumer/types/keys.go @@ -15,12 +15,10 @@ const ( ) var ( - ParamsKey = []byte("p_btcstkconsumer") - ChainRegisterKey = []byte{0x01} // ChainRegisterKey defines the key to the chain register for each CZ in store - FinalityProviderKey = []byte{0x02} // FinalityProviderKey defines the key to the CZ finality providers store - FinalityProviderChainKey = []byte{0x03} // FinalityProviderChainKey defines the key to the CZ chains per FP BTC PK store - BTCDelegatorKey = []byte{0x04} // key prefix for the BTC delegators - BTCDelegationKey = []byte{0x05} // key prefix for the BTC delegations + ParamsKey = []byte("p_btcstkconsumer") + ConsumerChainRegisterKey = []byte{0x01} // ConsumerChainRegisterKey defines the key to the chain register for each CZ in store + ConsumerFinalityProviderKey = []byte{0x02} // ConsumerFinalityProviderKey defines the key to the CZ finality providers store + ConsumerFinalityProviderChainKey = []byte{0x03} // ConsumerFinalityProviderChainKey defines the key to the CZ chains per FP BTC PK store ) func KeyPrefix(p string) []byte { diff --git a/x/finality/types/mocked_keepers.go b/x/finality/types/mocked_keepers.go index ecef9983e..97f2f4177 100644 --- a/x/finality/types/mocked_keepers.go +++ b/x/finality/types/mocked_keepers.go @@ -53,7 +53,7 @@ func (mr *MockBTCStakingKeeperMockRecorder) GetBTCStakingActivatedHeight(ctx int // GetFinalityProvider mocks base method. func (m *MockBTCStakingKeeper) GetFinalityProvider(ctx context.Context, fpBTCPK []byte) (*types.FinalityProvider, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetFinalityProvider", ctx, fpBTCPK) + ret := m.ctrl.Call(m, "GetConsumerFinalityProvider", ctx, fpBTCPK) ret0, _ := ret[0].(*types.FinalityProvider) ret1, _ := ret[1].(error) return ret0, ret1 @@ -62,7 +62,7 @@ func (m *MockBTCStakingKeeper) GetFinalityProvider(ctx context.Context, fpBTCPK // GetFinalityProvider indicates an expected call of GetFinalityProvider. func (mr *MockBTCStakingKeeperMockRecorder) GetFinalityProvider(ctx, fpBTCPK interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFinalityProvider", reflect.TypeOf((*MockBTCStakingKeeper)(nil).GetFinalityProvider), ctx, fpBTCPK) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConsumerFinalityProvider", reflect.TypeOf((*MockBTCStakingKeeper)(nil).GetFinalityProvider), ctx, fpBTCPK) } // GetLastFinalizedEpoch mocks base method. @@ -139,7 +139,7 @@ func (mr *MockBTCStakingKeeperMockRecorder) GetVotingPowerTable(ctx, height inte // HasFinalityProvider mocks base method. func (m *MockBTCStakingKeeper) HasFinalityProvider(ctx context.Context, fpBTCPK []byte) bool { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HasFinalityProvider", ctx, fpBTCPK) + ret := m.ctrl.Call(m, "HasConsumerFinalityProvider", ctx, fpBTCPK) ret0, _ := ret[0].(bool) return ret0 } @@ -147,7 +147,7 @@ func (m *MockBTCStakingKeeper) HasFinalityProvider(ctx context.Context, fpBTCPK // HasFinalityProvider indicates an expected call of HasFinalityProvider. func (mr *MockBTCStakingKeeperMockRecorder) HasFinalityProvider(ctx, fpBTCPK interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasFinalityProvider", reflect.TypeOf((*MockBTCStakingKeeper)(nil).HasFinalityProvider), ctx, fpBTCPK) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasConsumerFinalityProvider", reflect.TypeOf((*MockBTCStakingKeeper)(nil).HasFinalityProvider), ctx, fpBTCPK) } // RemoveVotingPowerDistCache mocks base method. From c94b5f59caa215adb44da67a4d11d803496bdbf0 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Tue, 16 Apr 2024 19:29:19 +0800 Subject: [PATCH 14/85] linting validateRestakedFPs --- x/btcstaking/keeper/btc_delegations.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/x/btcstaking/keeper/btc_delegations.go b/x/btcstaking/keeper/btc_delegations.go index 056e08d3f..7126bf6c1 100644 --- a/x/btcstaking/keeper/btc_delegations.go +++ b/x/btcstaking/keeper/btc_delegations.go @@ -151,31 +151,35 @@ func (k Keeper) setBTCDelegation(ctx context.Context, btcDel *types.BTCDelegatio // restaked to FPs of consumer chains func (k Keeper) validateRestakedFPs(ctx context.Context, fpBTCPKs []bbn.BIP340PubKey) (bool, error) { var ( - fp *types.FinalityProvider - err error restakedToBabylon = false restakedToConsumers = false ) for _, fpBTCPK := range fpBTCPKs { // find the fp and determine whether it's Babylon fp or consumer chain fp - if fp, err = k.GetFinalityProvider(ctx, fpBTCPK); err == nil { + if fp, err := k.GetFinalityProvider(ctx, fpBTCPK); err == nil { + // ensure the finality provider is not slashed + if fp.IsSlashed() { + return false, types.ErrFpAlreadySlashed + } + // ensure the finality provider's registered epoch is finalised restakedToBabylon = true continue } else if chainID, err := k.bscKeeper.GetConsumerFinalityProviderChain(ctx, &fpBTCPK); err == nil { - fp, err = k.bscKeeper.GetConsumerFinalityProvider(ctx, chainID, &fpBTCPK) + fp, err := k.bscKeeper.GetConsumerFinalityProvider(ctx, chainID, &fpBTCPK) if err != nil { return false, err } + // ensure the finality provider is not slashed + if fp.IsSlashed() { + return false, types.ErrFpAlreadySlashed + } + // ensure the finality provider's registered epoch is finalised restakedToConsumers = true continue } else { return false, types.ErrFpNotFound.Wrapf("finality provider pk %s is not found", fpBTCPK.MarshalHex()) } - // ensure the finality provider is not slashed - if fp.IsSlashed() { - return false, types.ErrFpAlreadySlashed - } } if !restakedToBabylon { // a BTC delegation has to stake to at least 1 Babylon finality provider From 4c1e0d5202f163bca339ad8dad1b7e1593912ab2 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Mon, 22 Apr 2024 16:25:04 +0800 Subject: [PATCH 15/85] proto: define IBC packet formats for PoS integration (#229) --- proto/babylon/btcstaking/v1/packet.proto | 151 + proto/babylon/zoneconcierge/v1/packet.proto | 2 + x/btcstaking/types/packet.pb.go | 3109 +++++++++++++++++++ x/zoneconcierge/types/packet.pb.go | 176 +- 4 files changed, 3392 insertions(+), 46 deletions(-) create mode 100644 proto/babylon/btcstaking/v1/packet.proto create mode 100644 x/btcstaking/types/packet.pb.go diff --git a/proto/babylon/btcstaking/v1/packet.proto b/proto/babylon/btcstaking/v1/packet.proto new file mode 100644 index 000000000..e049e027b --- /dev/null +++ b/proto/babylon/btcstaking/v1/packet.proto @@ -0,0 +1,151 @@ +syntax = "proto3"; +package babylon.btcstaking.v1; + +import "cosmos/crypto/secp256k1/keys.proto"; +import "cosmos/staking/v1beta1/staking.proto"; +import "babylon/btcstaking/v1/pop.proto"; +import "babylon/btcstaking/v1/btcstaking.proto"; + +option go_package = "github.com/babylonchain/babylon/x/btcstaking/types"; + +// BTCStakingIBCPacket is an IBC packet carrying a set of events related +// to BTC staking for a particular consumer chain +// It will be constructed and sent upon `EndBlock` of ZoneConcierge +// (if there are any BTC staking events for a consumer chain) +message BTCStakingIBCPacket { + repeated NewFinalityProvider new_fp = 1; + repeated SlashedFinalityProvider slashed_fp = 2; + repeated ActiveBTCDelegation active_del = 3; + repeated SlashedBTCDelegation slashed_del = 4; + repeated UnbondedBTCDelegation unbonded_del = 5; +} + +// NewFinalityProvider is an IBC packet sent from Babylon to consumer chain +// upon a newly registered finality provider on this consumer chain +message NewFinalityProvider { + // description defines the description terms for the finality provider. + cosmos.staking.v1beta1.Description description = 1; + // commission defines the commission rate of the finality provider. + // It forms as a string converted from "cosmossdk.io/math.LegacyDec" + string commission = 2; + // babylon_pk is the Babylon secp256k1 PK of this finality provider + cosmos.crypto.secp256k1.PubKey babylon_pk = 3; + // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider + // the PK follows encoding in BIP-340 spec in hex format + string btc_pk_hex = 4; + // pop is the proof of possession of babylon_pk and btc_pk + ProofOfPossession pop = 5; + // master_pub_rand is the master public randomness of the finality provider + // encoded as a base58 string + string master_pub_rand = 6; + // registered_epoch is the epoch when this finality provider is registered + uint64 registered_epoch = 7; + // slashed_babylon_height indicates the Babylon height when + // the finality provider is slashed. + // if it's 0 then the finality provider is not slashed + uint64 slashed_babylon_height = 8; + // slashed_btc_height indicates the BTC height when + // the finality provider is slashed. + // if it's 0 then the finality provider is not slashed + uint64 slashed_btc_height = 9; + // chain_id is the chain id of the chain the finality provider is operating on. + // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. + string chain_id = 10; +} + +// SlashedFinalityProvider is an IBC packet sent from consumer chain to Babylon +// upon a finality provider is slashed on the consumer chain +message SlashedFinalityProvider { + // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider + // the PK follows encoding in BIP-340 spec in hex format + string btc_pk_hex = 1; +} + +// ActiveBTCDelegation is an IBC packet sent from Babylon to consumer chain +// upon a BTC delegation newly receives covenant signatures and thus becomes active +message ActiveBTCDelegation { + // btc_pk_hex is the Bitcoin secp256k1 PK of this BTC delegation + // the PK follows encoding in BIP-340 spec in hex format + string btc_pk_hex = 1; + // fp_btc_pk_list is the list of BIP-340 PKs of the finality providers that + // this BTC delegation delegates to + repeated string fp_btc_pk_list = 2; + // start_height is the start BTC height of the BTC delegation + // it is the start BTC height of the timelock + uint64 start_height = 3; + // end_height is the end height of the BTC delegation + // it is the end BTC height of the timelock - w + uint64 end_height = 4; + // total_sat is the total amount of BTC stakes in this delegation + // quantified in satoshi + uint64 total_sat = 5; + // staking_tx is the staking tx + bytes staking_tx = 6; + // slashing_tx is the slashing tx + bytes slashing_tx = 7; + // delegator_slashing_sig is the signature on the slashing tx + // by the delegator (i.e., SK corresponding to btc_pk) as string hex. + // It will be a part of the witness for the staking tx output. + bytes delegator_slashing_sig = 8; + // covenant_sigs is a list of adaptor signatures on the slashing tx + // by each covenant member + // It will be a part of the witness for the staking tx output. + repeated CovenantAdaptorSignatures covenant_sigs = 9; + // staking_output_idx is the index of the staking output in the staking tx + uint32 staking_output_idx = 10; + // unbonding_time used in unbonding output timelock path and in slashing transactions + // change outputs + uint32 unbonding_time = 13; + // undelegation_info is the undelegation info of this delegation. + BTCUndelegationInfo undelegation_info = 14; + // params version used to validate delegation + uint32 params_version = 15; +} + +// BTCUndelegationInfo provides all necessary info about the undeleagation +message BTCUndelegationInfo { + // unbonding_tx is the transaction which will transfer the funds from staking + // output to unbonding output. Unbonding output will usually have lower timelock + // than staking output. + bytes unbonding_tx = 1; + // delegator_unbonding_sig is the signature on the unbonding tx + // by the delegator (i.e., SK corresponding to btc_pk). + // It effectively proves that the delegator wants to unbond and thus + // Babylon will consider this BTC delegation unbonded. Delegator's BTC + // on Bitcoin will be unbonded after timelock. + bytes delegator_unbonding_sig = 2; + // covenant_unbonding_sig_list is the list of signatures on the unbonding tx + // by covenant members + repeated SignatureInfo covenant_unbonding_sig_list = 3; + // slashing_tx is the unbonding slashing tx + bytes slashing_tx = 4; + // delegator_slashing_sig is the signature on the slashing tx + // by the delegator (i.e., SK corresponding to btc_pk). + // It will be a part of the witness for the unbonding tx output. + bytes delegator_slashing_sig = 5; + // covenant_slashing_sigs is a list of adaptor signatures on the + // unbonding slashing tx by each covenant member + // It will be a part of the witness for the staking tx output. + repeated CovenantAdaptorSignatures covenant_slashing_sigs = 6; +} + +// SlashedBTCDelegation is an IBC packet sent upon a slashed BTC delegation +// Slashing can happen on both Babylon and consumer chain, so both of them could +// send this packet to each other +message SlashedBTCDelegation { + // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation + string staking_tx_hash = 1; + // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing + // this allows the consumer chain to verify the BTC delegation is indeed slashed + string recovered_fp_btc_sk = 2; +} + +// UnbondedBTCDelegation is an IBC packet sent from Babylon to consumer chain +// upon an early unbonded BTC delegation +message UnbondedBTCDelegation { + // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation + string staking_tx_hash = 1; + // unbonding_tx_sig is the signature on the unbonding tx signed by the BTC delegator + // It proves that the BTC delegator wants to unbond + bytes unbonding_tx_sig = 2; +} diff --git a/proto/babylon/zoneconcierge/v1/packet.proto b/proto/babylon/zoneconcierge/v1/packet.proto index a9b4ef163..7662ff3c7 100644 --- a/proto/babylon/zoneconcierge/v1/packet.proto +++ b/proto/babylon/zoneconcierge/v1/packet.proto @@ -5,6 +5,7 @@ import "babylon/btccheckpoint/v1/btccheckpoint.proto"; import "babylon/checkpointing/v1/checkpoint.proto"; import "babylon/btclightclient/v1/btclightclient.proto"; import "babylon/epoching/v1/epoching.proto"; +import "babylon/btcstaking/v1/packet.proto"; import "babylon/zoneconcierge/v1/zoneconcierge.proto"; option go_package = "github.com/babylonchain/babylon/x/zoneconcierge/types"; @@ -15,6 +16,7 @@ message ZoneconciergePacketData { // packet is the actual message carried in the IBC packet oneof packet { BTCTimestamp btc_timestamp = 1; + babylon.btcstaking.v1.BTCStakingIBCPacket btc_staking = 2; } } diff --git a/x/btcstaking/types/packet.pb.go b/x/btcstaking/types/packet.pb.go new file mode 100644 index 000000000..33e16b674 --- /dev/null +++ b/x/btcstaking/types/packet.pb.go @@ -0,0 +1,3109 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: babylon/btcstaking/v1/packet.proto + +package types + +import ( + fmt "fmt" + secp256k1 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + types "github.com/cosmos/cosmos-sdk/x/staking/types" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// BTCStakingIBCPacket is an IBC packet carrying a set of events related +// to BTC staking for a particular consumer chain +// It will be constructed and sent upon `EndBlock` of ZoneConcierge +// (if there are any BTC staking events for a consumer chain) +type BTCStakingIBCPacket struct { + NewFp []*NewFinalityProvider `protobuf:"bytes,1,rep,name=new_fp,json=newFp,proto3" json:"new_fp,omitempty"` + SlashedFp []*SlashedFinalityProvider `protobuf:"bytes,2,rep,name=slashed_fp,json=slashedFp,proto3" json:"slashed_fp,omitempty"` + ActiveDel []*ActiveBTCDelegation `protobuf:"bytes,3,rep,name=active_del,json=activeDel,proto3" json:"active_del,omitempty"` + SlashedDel []*SlashedBTCDelegation `protobuf:"bytes,4,rep,name=slashed_del,json=slashedDel,proto3" json:"slashed_del,omitempty"` + UnbondedDel []*UnbondedBTCDelegation `protobuf:"bytes,5,rep,name=unbonded_del,json=unbondedDel,proto3" json:"unbonded_del,omitempty"` +} + +func (m *BTCStakingIBCPacket) Reset() { *m = BTCStakingIBCPacket{} } +func (m *BTCStakingIBCPacket) String() string { return proto.CompactTextString(m) } +func (*BTCStakingIBCPacket) ProtoMessage() {} +func (*BTCStakingIBCPacket) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{0} +} +func (m *BTCStakingIBCPacket) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BTCStakingIBCPacket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BTCStakingIBCPacket.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 *BTCStakingIBCPacket) XXX_Merge(src proto.Message) { + xxx_messageInfo_BTCStakingIBCPacket.Merge(m, src) +} +func (m *BTCStakingIBCPacket) XXX_Size() int { + return m.Size() +} +func (m *BTCStakingIBCPacket) XXX_DiscardUnknown() { + xxx_messageInfo_BTCStakingIBCPacket.DiscardUnknown(m) +} + +var xxx_messageInfo_BTCStakingIBCPacket proto.InternalMessageInfo + +func (m *BTCStakingIBCPacket) GetNewFp() []*NewFinalityProvider { + if m != nil { + return m.NewFp + } + return nil +} + +func (m *BTCStakingIBCPacket) GetSlashedFp() []*SlashedFinalityProvider { + if m != nil { + return m.SlashedFp + } + return nil +} + +func (m *BTCStakingIBCPacket) GetActiveDel() []*ActiveBTCDelegation { + if m != nil { + return m.ActiveDel + } + return nil +} + +func (m *BTCStakingIBCPacket) GetSlashedDel() []*SlashedBTCDelegation { + if m != nil { + return m.SlashedDel + } + return nil +} + +func (m *BTCStakingIBCPacket) GetUnbondedDel() []*UnbondedBTCDelegation { + if m != nil { + return m.UnbondedDel + } + return nil +} + +// NewFinalityProvider is an IBC packet sent from Babylon to consumer chain +// upon a newly registered finality provider on this consumer chain +type NewFinalityProvider struct { + // description defines the description terms for the finality provider. + Description *types.Description `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // commission defines the commission rate of the finality provider. + // It forms as a string converted from "cosmossdk.io/math.LegacyDec" + Commission string `protobuf:"bytes,2,opt,name=commission,proto3" json:"commission,omitempty"` + // babylon_pk is the Babylon secp256k1 PK of this finality provider + BabylonPk *secp256k1.PubKey `protobuf:"bytes,3,opt,name=babylon_pk,json=babylonPk,proto3" json:"babylon_pk,omitempty"` + // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider + // the PK follows encoding in BIP-340 spec in hex format + BtcPkHex string `protobuf:"bytes,4,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` + // pop is the proof of possession of babylon_pk and btc_pk + Pop *ProofOfPossession `protobuf:"bytes,5,opt,name=pop,proto3" json:"pop,omitempty"` + // master_pub_rand is the master public randomness of the finality provider + // encoded as a base58 string + MasterPubRand string `protobuf:"bytes,6,opt,name=master_pub_rand,json=masterPubRand,proto3" json:"master_pub_rand,omitempty"` + // registered_epoch is the epoch when this finality provider is registered + RegisteredEpoch uint64 `protobuf:"varint,7,opt,name=registered_epoch,json=registeredEpoch,proto3" json:"registered_epoch,omitempty"` + // slashed_babylon_height indicates the Babylon height when + // the finality provider is slashed. + // if it's 0 then the finality provider is not slashed + SlashedBabylonHeight uint64 `protobuf:"varint,8,opt,name=slashed_babylon_height,json=slashedBabylonHeight,proto3" json:"slashed_babylon_height,omitempty"` + // slashed_btc_height indicates the BTC height when + // the finality provider is slashed. + // if it's 0 then the finality provider is not slashed + SlashedBtcHeight uint64 `protobuf:"varint,9,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` + // chain_id is the chain id of the chain the finality provider is operating on. + // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. + ChainId string `protobuf:"bytes,10,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (m *NewFinalityProvider) Reset() { *m = NewFinalityProvider{} } +func (m *NewFinalityProvider) String() string { return proto.CompactTextString(m) } +func (*NewFinalityProvider) ProtoMessage() {} +func (*NewFinalityProvider) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{1} +} +func (m *NewFinalityProvider) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NewFinalityProvider) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NewFinalityProvider.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 *NewFinalityProvider) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewFinalityProvider.Merge(m, src) +} +func (m *NewFinalityProvider) XXX_Size() int { + return m.Size() +} +func (m *NewFinalityProvider) XXX_DiscardUnknown() { + xxx_messageInfo_NewFinalityProvider.DiscardUnknown(m) +} + +var xxx_messageInfo_NewFinalityProvider proto.InternalMessageInfo + +func (m *NewFinalityProvider) GetDescription() *types.Description { + if m != nil { + return m.Description + } + return nil +} + +func (m *NewFinalityProvider) GetCommission() string { + if m != nil { + return m.Commission + } + return "" +} + +func (m *NewFinalityProvider) GetBabylonPk() *secp256k1.PubKey { + if m != nil { + return m.BabylonPk + } + return nil +} + +func (m *NewFinalityProvider) GetBtcPkHex() string { + if m != nil { + return m.BtcPkHex + } + return "" +} + +func (m *NewFinalityProvider) GetPop() *ProofOfPossession { + if m != nil { + return m.Pop + } + return nil +} + +func (m *NewFinalityProvider) GetMasterPubRand() string { + if m != nil { + return m.MasterPubRand + } + return "" +} + +func (m *NewFinalityProvider) GetRegisteredEpoch() uint64 { + if m != nil { + return m.RegisteredEpoch + } + return 0 +} + +func (m *NewFinalityProvider) GetSlashedBabylonHeight() uint64 { + if m != nil { + return m.SlashedBabylonHeight + } + return 0 +} + +func (m *NewFinalityProvider) GetSlashedBtcHeight() uint64 { + if m != nil { + return m.SlashedBtcHeight + } + return 0 +} + +func (m *NewFinalityProvider) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + +// SlashedFinalityProvider is an IBC packet sent from consumer chain to Babylon +// upon a finality provider is slashed on the consumer chain +type SlashedFinalityProvider struct { + // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider + // the PK follows encoding in BIP-340 spec in hex format + BtcPkHex string `protobuf:"bytes,1,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` +} + +func (m *SlashedFinalityProvider) Reset() { *m = SlashedFinalityProvider{} } +func (m *SlashedFinalityProvider) String() string { return proto.CompactTextString(m) } +func (*SlashedFinalityProvider) ProtoMessage() {} +func (*SlashedFinalityProvider) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{2} +} +func (m *SlashedFinalityProvider) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SlashedFinalityProvider) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SlashedFinalityProvider.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 *SlashedFinalityProvider) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlashedFinalityProvider.Merge(m, src) +} +func (m *SlashedFinalityProvider) XXX_Size() int { + return m.Size() +} +func (m *SlashedFinalityProvider) XXX_DiscardUnknown() { + xxx_messageInfo_SlashedFinalityProvider.DiscardUnknown(m) +} + +var xxx_messageInfo_SlashedFinalityProvider proto.InternalMessageInfo + +func (m *SlashedFinalityProvider) GetBtcPkHex() string { + if m != nil { + return m.BtcPkHex + } + return "" +} + +// ActiveBTCDelegation is an IBC packet sent from Babylon to consumer chain +// upon a BTC delegation newly receives covenant signatures and thus becomes active +type ActiveBTCDelegation struct { + // btc_pk_hex is the Bitcoin secp256k1 PK of this BTC delegation + // the PK follows encoding in BIP-340 spec in hex format + BtcPkHex string `protobuf:"bytes,1,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` + // fp_btc_pk_list is the list of BIP-340 PKs of the finality providers that + // this BTC delegation delegates to + FpBtcPkList []string `protobuf:"bytes,2,rep,name=fp_btc_pk_list,json=fpBtcPkList,proto3" json:"fp_btc_pk_list,omitempty"` + // start_height is the start BTC height of the BTC delegation + // it is the start BTC height of the timelock + StartHeight uint64 `protobuf:"varint,3,opt,name=start_height,json=startHeight,proto3" json:"start_height,omitempty"` + // end_height is the end height of the BTC delegation + // it is the end BTC height of the timelock - w + EndHeight uint64 `protobuf:"varint,4,opt,name=end_height,json=endHeight,proto3" json:"end_height,omitempty"` + // total_sat is the total amount of BTC stakes in this delegation + // quantified in satoshi + TotalSat uint64 `protobuf:"varint,5,opt,name=total_sat,json=totalSat,proto3" json:"total_sat,omitempty"` + // staking_tx is the staking tx + StakingTx []byte `protobuf:"bytes,6,opt,name=staking_tx,json=stakingTx,proto3" json:"staking_tx,omitempty"` + // slashing_tx is the slashing tx + SlashingTx []byte `protobuf:"bytes,7,opt,name=slashing_tx,json=slashingTx,proto3" json:"slashing_tx,omitempty"` + // delegator_slashing_sig is the signature on the slashing tx + // by the delegator (i.e., SK corresponding to btc_pk) as string hex. + // It will be a part of the witness for the staking tx output. + DelegatorSlashingSig []byte `protobuf:"bytes,8,opt,name=delegator_slashing_sig,json=delegatorSlashingSig,proto3" json:"delegator_slashing_sig,omitempty"` + // covenant_sigs is a list of adaptor signatures on the slashing tx + // by each covenant member + // It will be a part of the witness for the staking tx output. + CovenantSigs []*CovenantAdaptorSignatures `protobuf:"bytes,9,rep,name=covenant_sigs,json=covenantSigs,proto3" json:"covenant_sigs,omitempty"` + // staking_output_idx is the index of the staking output in the staking tx + StakingOutputIdx uint32 `protobuf:"varint,10,opt,name=staking_output_idx,json=stakingOutputIdx,proto3" json:"staking_output_idx,omitempty"` + // unbonding_time used in unbonding output timelock path and in slashing transactions + // change outputs + UnbondingTime uint32 `protobuf:"varint,13,opt,name=unbonding_time,json=unbondingTime,proto3" json:"unbonding_time,omitempty"` + // undelegation_info is the undelegation info of this delegation. + UndelegationInfo *BTCUndelegationInfo `protobuf:"bytes,14,opt,name=undelegation_info,json=undelegationInfo,proto3" json:"undelegation_info,omitempty"` + // params version used to validate delegation + ParamsVersion uint32 `protobuf:"varint,15,opt,name=params_version,json=paramsVersion,proto3" json:"params_version,omitempty"` +} + +func (m *ActiveBTCDelegation) Reset() { *m = ActiveBTCDelegation{} } +func (m *ActiveBTCDelegation) String() string { return proto.CompactTextString(m) } +func (*ActiveBTCDelegation) ProtoMessage() {} +func (*ActiveBTCDelegation) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{3} +} +func (m *ActiveBTCDelegation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ActiveBTCDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ActiveBTCDelegation.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 *ActiveBTCDelegation) XXX_Merge(src proto.Message) { + xxx_messageInfo_ActiveBTCDelegation.Merge(m, src) +} +func (m *ActiveBTCDelegation) XXX_Size() int { + return m.Size() +} +func (m *ActiveBTCDelegation) XXX_DiscardUnknown() { + xxx_messageInfo_ActiveBTCDelegation.DiscardUnknown(m) +} + +var xxx_messageInfo_ActiveBTCDelegation proto.InternalMessageInfo + +func (m *ActiveBTCDelegation) GetBtcPkHex() string { + if m != nil { + return m.BtcPkHex + } + return "" +} + +func (m *ActiveBTCDelegation) GetFpBtcPkList() []string { + if m != nil { + return m.FpBtcPkList + } + return nil +} + +func (m *ActiveBTCDelegation) GetStartHeight() uint64 { + if m != nil { + return m.StartHeight + } + return 0 +} + +func (m *ActiveBTCDelegation) GetEndHeight() uint64 { + if m != nil { + return m.EndHeight + } + return 0 +} + +func (m *ActiveBTCDelegation) GetTotalSat() uint64 { + if m != nil { + return m.TotalSat + } + return 0 +} + +func (m *ActiveBTCDelegation) GetStakingTx() []byte { + if m != nil { + return m.StakingTx + } + return nil +} + +func (m *ActiveBTCDelegation) GetSlashingTx() []byte { + if m != nil { + return m.SlashingTx + } + return nil +} + +func (m *ActiveBTCDelegation) GetDelegatorSlashingSig() []byte { + if m != nil { + return m.DelegatorSlashingSig + } + return nil +} + +func (m *ActiveBTCDelegation) GetCovenantSigs() []*CovenantAdaptorSignatures { + if m != nil { + return m.CovenantSigs + } + return nil +} + +func (m *ActiveBTCDelegation) GetStakingOutputIdx() uint32 { + if m != nil { + return m.StakingOutputIdx + } + return 0 +} + +func (m *ActiveBTCDelegation) GetUnbondingTime() uint32 { + if m != nil { + return m.UnbondingTime + } + return 0 +} + +func (m *ActiveBTCDelegation) GetUndelegationInfo() *BTCUndelegationInfo { + if m != nil { + return m.UndelegationInfo + } + return nil +} + +func (m *ActiveBTCDelegation) GetParamsVersion() uint32 { + if m != nil { + return m.ParamsVersion + } + return 0 +} + +// BTCUndelegationInfo provides all necessary info about the undeleagation +type BTCUndelegationInfo struct { + // unbonding_tx is the transaction which will transfer the funds from staking + // output to unbonding output. Unbonding output will usually have lower timelock + // than staking output. + UnbondingTx []byte `protobuf:"bytes,1,opt,name=unbonding_tx,json=unbondingTx,proto3" json:"unbonding_tx,omitempty"` + // delegator_unbonding_sig is the signature on the unbonding tx + // by the delegator (i.e., SK corresponding to btc_pk). + // It effectively proves that the delegator wants to unbond and thus + // Babylon will consider this BTC delegation unbonded. Delegator's BTC + // on Bitcoin will be unbonded after timelock. + DelegatorUnbondingSig []byte `protobuf:"bytes,2,opt,name=delegator_unbonding_sig,json=delegatorUnbondingSig,proto3" json:"delegator_unbonding_sig,omitempty"` + // covenant_unbonding_sig_list is the list of signatures on the unbonding tx + // by covenant members + CovenantUnbondingSigList []*SignatureInfo `protobuf:"bytes,3,rep,name=covenant_unbonding_sig_list,json=covenantUnbondingSigList,proto3" json:"covenant_unbonding_sig_list,omitempty"` + // slashing_tx is the unbonding slashing tx + SlashingTx []byte `protobuf:"bytes,4,opt,name=slashing_tx,json=slashingTx,proto3" json:"slashing_tx,omitempty"` + // delegator_slashing_sig is the signature on the slashing tx + // by the delegator (i.e., SK corresponding to btc_pk). + // It will be a part of the witness for the unbonding tx output. + DelegatorSlashingSig []byte `protobuf:"bytes,5,opt,name=delegator_slashing_sig,json=delegatorSlashingSig,proto3" json:"delegator_slashing_sig,omitempty"` + // covenant_slashing_sigs is a list of adaptor signatures on the + // unbonding slashing tx by each covenant member + // It will be a part of the witness for the staking tx output. + CovenantSlashingSigs []*CovenantAdaptorSignatures `protobuf:"bytes,6,rep,name=covenant_slashing_sigs,json=covenantSlashingSigs,proto3" json:"covenant_slashing_sigs,omitempty"` +} + +func (m *BTCUndelegationInfo) Reset() { *m = BTCUndelegationInfo{} } +func (m *BTCUndelegationInfo) String() string { return proto.CompactTextString(m) } +func (*BTCUndelegationInfo) ProtoMessage() {} +func (*BTCUndelegationInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{4} +} +func (m *BTCUndelegationInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BTCUndelegationInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BTCUndelegationInfo.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 *BTCUndelegationInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_BTCUndelegationInfo.Merge(m, src) +} +func (m *BTCUndelegationInfo) XXX_Size() int { + return m.Size() +} +func (m *BTCUndelegationInfo) XXX_DiscardUnknown() { + xxx_messageInfo_BTCUndelegationInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_BTCUndelegationInfo proto.InternalMessageInfo + +func (m *BTCUndelegationInfo) GetUnbondingTx() []byte { + if m != nil { + return m.UnbondingTx + } + return nil +} + +func (m *BTCUndelegationInfo) GetDelegatorUnbondingSig() []byte { + if m != nil { + return m.DelegatorUnbondingSig + } + return nil +} + +func (m *BTCUndelegationInfo) GetCovenantUnbondingSigList() []*SignatureInfo { + if m != nil { + return m.CovenantUnbondingSigList + } + return nil +} + +func (m *BTCUndelegationInfo) GetSlashingTx() []byte { + if m != nil { + return m.SlashingTx + } + return nil +} + +func (m *BTCUndelegationInfo) GetDelegatorSlashingSig() []byte { + if m != nil { + return m.DelegatorSlashingSig + } + return nil +} + +func (m *BTCUndelegationInfo) GetCovenantSlashingSigs() []*CovenantAdaptorSignatures { + if m != nil { + return m.CovenantSlashingSigs + } + return nil +} + +// SlashedBTCDelegation is an IBC packet sent upon a slashed BTC delegation +// Slashing can happen on both Babylon and consumer chain, so both of them could +// send this packet to each other +type SlashedBTCDelegation struct { + // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation + StakingTxHash string `protobuf:"bytes,1,opt,name=staking_tx_hash,json=stakingTxHash,proto3" json:"staking_tx_hash,omitempty"` + // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing + // this allows the consumer chain to verify the BTC delegation is indeed slashed + RecoveredFpBtcSk string `protobuf:"bytes,2,opt,name=recovered_fp_btc_sk,json=recoveredFpBtcSk,proto3" json:"recovered_fp_btc_sk,omitempty"` +} + +func (m *SlashedBTCDelegation) Reset() { *m = SlashedBTCDelegation{} } +func (m *SlashedBTCDelegation) String() string { return proto.CompactTextString(m) } +func (*SlashedBTCDelegation) ProtoMessage() {} +func (*SlashedBTCDelegation) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{5} +} +func (m *SlashedBTCDelegation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SlashedBTCDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SlashedBTCDelegation.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 *SlashedBTCDelegation) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlashedBTCDelegation.Merge(m, src) +} +func (m *SlashedBTCDelegation) XXX_Size() int { + return m.Size() +} +func (m *SlashedBTCDelegation) XXX_DiscardUnknown() { + xxx_messageInfo_SlashedBTCDelegation.DiscardUnknown(m) +} + +var xxx_messageInfo_SlashedBTCDelegation proto.InternalMessageInfo + +func (m *SlashedBTCDelegation) GetStakingTxHash() string { + if m != nil { + return m.StakingTxHash + } + return "" +} + +func (m *SlashedBTCDelegation) GetRecoveredFpBtcSk() string { + if m != nil { + return m.RecoveredFpBtcSk + } + return "" +} + +// UnbondedBTCDelegation is an IBC packet sent from Babylon to consumer chain +// upon an early unbonded BTC delegation +type UnbondedBTCDelegation struct { + // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation + StakingTxHash string `protobuf:"bytes,1,opt,name=staking_tx_hash,json=stakingTxHash,proto3" json:"staking_tx_hash,omitempty"` + // unbonding_tx_sig is the signature on the unbonding tx signed by the BTC delegator + // It proves that the BTC delegator wants to unbond + UnbondingTxSig []byte `protobuf:"bytes,2,opt,name=unbonding_tx_sig,json=unbondingTxSig,proto3" json:"unbonding_tx_sig,omitempty"` +} + +func (m *UnbondedBTCDelegation) Reset() { *m = UnbondedBTCDelegation{} } +func (m *UnbondedBTCDelegation) String() string { return proto.CompactTextString(m) } +func (*UnbondedBTCDelegation) ProtoMessage() {} +func (*UnbondedBTCDelegation) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{6} +} +func (m *UnbondedBTCDelegation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UnbondedBTCDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UnbondedBTCDelegation.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 *UnbondedBTCDelegation) XXX_Merge(src proto.Message) { + xxx_messageInfo_UnbondedBTCDelegation.Merge(m, src) +} +func (m *UnbondedBTCDelegation) XXX_Size() int { + return m.Size() +} +func (m *UnbondedBTCDelegation) XXX_DiscardUnknown() { + xxx_messageInfo_UnbondedBTCDelegation.DiscardUnknown(m) +} + +var xxx_messageInfo_UnbondedBTCDelegation proto.InternalMessageInfo + +func (m *UnbondedBTCDelegation) GetStakingTxHash() string { + if m != nil { + return m.StakingTxHash + } + return "" +} + +func (m *UnbondedBTCDelegation) GetUnbondingTxSig() []byte { + if m != nil { + return m.UnbondingTxSig + } + return nil +} + +func init() { + proto.RegisterType((*BTCStakingIBCPacket)(nil), "babylon.btcstaking.v1.BTCStakingIBCPacket") + proto.RegisterType((*NewFinalityProvider)(nil), "babylon.btcstaking.v1.NewFinalityProvider") + proto.RegisterType((*SlashedFinalityProvider)(nil), "babylon.btcstaking.v1.SlashedFinalityProvider") + proto.RegisterType((*ActiveBTCDelegation)(nil), "babylon.btcstaking.v1.ActiveBTCDelegation") + proto.RegisterType((*BTCUndelegationInfo)(nil), "babylon.btcstaking.v1.BTCUndelegationInfo") + proto.RegisterType((*SlashedBTCDelegation)(nil), "babylon.btcstaking.v1.SlashedBTCDelegation") + proto.RegisterType((*UnbondedBTCDelegation)(nil), "babylon.btcstaking.v1.UnbondedBTCDelegation") +} + +func init() { + proto.RegisterFile("babylon/btcstaking/v1/packet.proto", fileDescriptor_3ed0d17ad14d6c0e) +} + +var fileDescriptor_3ed0d17ad14d6c0e = []byte{ + // 1059 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x6f, 0xe3, 0x44, + 0x10, 0xbf, 0x34, 0xe9, 0x9f, 0x4c, 0x92, 0x36, 0x6c, 0xdb, 0x3b, 0x73, 0x07, 0x69, 0xc9, 0x1d, + 0xa7, 0x00, 0x87, 0x43, 0x0b, 0x1c, 0x12, 0x0f, 0x48, 0x4d, 0x7b, 0x55, 0x2b, 0x0a, 0x8d, 0x9c, + 0x14, 0x24, 0x5e, 0xac, 0xb5, 0xbd, 0x49, 0x56, 0x49, 0xbc, 0x96, 0x77, 0x93, 0x26, 0xdf, 0x02, + 0x24, 0x3e, 0x14, 0x8f, 0xf7, 0x08, 0x6f, 0xa8, 0x7d, 0xe1, 0x63, 0x20, 0x8f, 0xd7, 0x89, 0x5b, + 0x92, 0x0a, 0x78, 0xf4, 0xcc, 0x6f, 0x7e, 0x3b, 0xb3, 0xf3, 0x9b, 0x59, 0x43, 0xd5, 0xa1, 0xce, + 0x74, 0x20, 0xfc, 0xba, 0xa3, 0x5c, 0xa9, 0x68, 0x9f, 0xfb, 0xdd, 0xfa, 0xf8, 0xa0, 0x1e, 0x50, + 0xb7, 0xcf, 0x94, 0x19, 0x84, 0x42, 0x09, 0xb2, 0xab, 0x31, 0xe6, 0x1c, 0x63, 0x8e, 0x0f, 0x9e, + 0x56, 0x5d, 0x21, 0x87, 0x42, 0xd6, 0xdd, 0x70, 0x1a, 0x28, 0x51, 0x97, 0xcc, 0x0d, 0x0e, 0xbf, + 0x7c, 0xdd, 0x3f, 0xa8, 0xf7, 0xd9, 0x54, 0xc6, 0xa1, 0x4f, 0x5f, 0x68, 0xcc, 0x9c, 0xda, 0x61, + 0x8a, 0x1e, 0x24, 0xdf, 0x1a, 0xb5, 0xb7, 0x24, 0x09, 0x11, 0x68, 0xc0, 0xcb, 0xc5, 0x80, 0x54, + 0x3e, 0x88, 0xab, 0xfe, 0x92, 0x85, 0xed, 0x46, 0xfb, 0xb8, 0x15, 0x1b, 0xcf, 0x1b, 0xc7, 0x4d, + 0xac, 0x83, 0x1c, 0xc1, 0x9a, 0xcf, 0xae, 0xed, 0x4e, 0x60, 0x64, 0xf6, 0xb3, 0xb5, 0xc2, 0xe1, + 0xc7, 0xe6, 0xc2, 0x92, 0xcc, 0xef, 0xd9, 0xf5, 0x29, 0xf7, 0xe9, 0x80, 0xab, 0x69, 0x33, 0x14, + 0x63, 0xee, 0xb1, 0xd0, 0x5a, 0xf5, 0xd9, 0xf5, 0x69, 0x40, 0xbe, 0x03, 0x90, 0x03, 0x2a, 0x7b, + 0xcc, 0x8b, 0x68, 0x56, 0x90, 0xc6, 0x5c, 0x42, 0xd3, 0x8a, 0x81, 0xff, 0xa0, 0xca, 0x6b, 0x86, + 0xd3, 0x80, 0x9c, 0x03, 0x50, 0x57, 0xf1, 0x31, 0xb3, 0x3d, 0x36, 0x30, 0xb2, 0x0f, 0x66, 0x75, + 0x84, 0xc0, 0x46, 0xfb, 0xf8, 0x84, 0x0d, 0x58, 0x97, 0x2a, 0x2e, 0x7c, 0x2b, 0x1f, 0x47, 0x9f, + 0xb0, 0x01, 0xb9, 0x80, 0x42, 0x92, 0x59, 0xc4, 0x95, 0x43, 0xae, 0x4f, 0x1e, 0x4e, 0xed, 0x2e, + 0x59, 0x52, 0x59, 0xc4, 0x76, 0x09, 0xc5, 0x91, 0xef, 0x08, 0xdf, 0xd3, 0x74, 0xab, 0x48, 0xf7, + 0x6a, 0x09, 0xdd, 0x95, 0x86, 0xde, 0xe5, 0x2b, 0x24, 0x0c, 0x27, 0x6c, 0x50, 0xfd, 0x2b, 0x0b, + 0xdb, 0x0b, 0xee, 0x95, 0xbc, 0x81, 0x82, 0xc7, 0xa4, 0x1b, 0xf2, 0x20, 0x8a, 0x31, 0x32, 0xfb, + 0x99, 0x5a, 0xe1, 0xf0, 0xb9, 0x19, 0x0b, 0xc6, 0x9c, 0x9f, 0x81, 0x82, 0x31, 0x4f, 0xe6, 0x50, + 0x2b, 0x1d, 0x47, 0x2a, 0x00, 0xae, 0x18, 0x0e, 0xb9, 0x94, 0x11, 0xcb, 0xca, 0x7e, 0xa6, 0x96, + 0xb7, 0x52, 0x16, 0xf2, 0x0d, 0x80, 0x4e, 0xdd, 0x0e, 0xfa, 0x46, 0x16, 0x4f, 0xd9, 0x4b, 0x4e, + 0x89, 0xa5, 0x6b, 0xce, 0xa4, 0x6b, 0x36, 0x47, 0xce, 0xb7, 0x6c, 0x6a, 0xe5, 0x75, 0x48, 0xb3, + 0x4f, 0xde, 0x03, 0x70, 0x94, 0x6b, 0x07, 0x7d, 0xbb, 0xc7, 0x26, 0x46, 0x0e, 0xf9, 0x37, 0x1c, + 0xe5, 0x36, 0xfb, 0x67, 0x6c, 0x42, 0xbe, 0x86, 0x6c, 0x20, 0x02, 0x63, 0x15, 0x69, 0x6b, 0x4b, + 0x2e, 0xa9, 0x19, 0x0a, 0xd1, 0xb9, 0xec, 0x34, 0x85, 0x94, 0x0c, 0x93, 0xb2, 0xa2, 0x20, 0xf2, + 0x12, 0xb6, 0x86, 0x54, 0x2a, 0x16, 0xda, 0xc1, 0xc8, 0xb1, 0x43, 0xea, 0x7b, 0xc6, 0x1a, 0xd2, + 0x97, 0x62, 0x73, 0x73, 0xe4, 0x58, 0xd4, 0xf7, 0xc8, 0x47, 0x50, 0x0e, 0x59, 0x97, 0x47, 0x26, + 0xe6, 0xd9, 0x2c, 0x10, 0x6e, 0xcf, 0x58, 0xdf, 0xcf, 0xd4, 0x72, 0xd6, 0xd6, 0xdc, 0xfe, 0x26, + 0x32, 0x93, 0x2f, 0xe0, 0x71, 0x22, 0x85, 0xa4, 0xe8, 0x1e, 0xe3, 0xdd, 0x9e, 0x32, 0x36, 0x30, + 0x60, 0x47, 0x7b, 0x1b, 0xb1, 0xf3, 0x0c, 0x7d, 0xe4, 0x15, 0x90, 0x59, 0x94, 0x72, 0x93, 0x88, + 0x3c, 0x46, 0x94, 0x93, 0x08, 0xe5, 0x6a, 0xf4, 0xbb, 0xb0, 0xe1, 0xf6, 0x28, 0xf7, 0x6d, 0xee, + 0x19, 0x80, 0xf9, 0xae, 0xe3, 0xf7, 0xb9, 0x57, 0xfd, 0x0a, 0x9e, 0x2c, 0x91, 0xfe, 0xbd, 0x6b, + 0xcc, 0xdc, 0xbd, 0xc6, 0xea, 0x1f, 0x39, 0xd8, 0x5e, 0xa0, 0xf2, 0x87, 0xa3, 0xc8, 0x73, 0xd8, + 0xec, 0x04, 0xb6, 0x06, 0x0c, 0xb8, 0x54, 0x38, 0x96, 0x79, 0xab, 0xd0, 0x09, 0x1a, 0x11, 0xe6, + 0x82, 0x4b, 0x45, 0x3e, 0x80, 0xa2, 0x54, 0x34, 0x54, 0x49, 0x59, 0x59, 0x2c, 0xab, 0x80, 0x36, + 0x5d, 0xd1, 0xfb, 0x00, 0xcc, 0xf7, 0x12, 0x40, 0x0e, 0x01, 0x79, 0xe6, 0x7b, 0xda, 0xfd, 0x0c, + 0xf2, 0x4a, 0x28, 0x3a, 0xb0, 0x25, 0x55, 0xd8, 0xe9, 0x9c, 0xb5, 0x81, 0x86, 0x16, 0xc5, 0x58, + 0xdd, 0x69, 0x5b, 0x4d, 0xb0, 0x7f, 0x45, 0x2b, 0xaf, 0x2d, 0xed, 0x09, 0xd9, 0xd3, 0xb3, 0xa9, + 0xfd, 0xeb, 0xe8, 0x87, 0xc4, 0xd4, 0x9e, 0x44, 0x1d, 0xf3, 0xe2, 0x7a, 0x45, 0x68, 0xcf, 0xa0, + 0x92, 0x77, 0xb1, 0x63, 0x45, 0x6b, 0x67, 0xe6, 0x6d, 0x69, 0x67, 0x8b, 0x77, 0xc9, 0x15, 0x94, + 0x5c, 0x31, 0x66, 0x3e, 0xf5, 0x55, 0x84, 0x95, 0x46, 0x1e, 0xa7, 0xf4, 0xb3, 0x25, 0x02, 0x3c, + 0xd6, 0xd8, 0x23, 0x8f, 0x06, 0x11, 0x13, 0xef, 0xfa, 0x54, 0x8d, 0x42, 0x26, 0xad, 0x62, 0x42, + 0xd3, 0xe2, 0x5d, 0x89, 0x42, 0xd0, 0xc5, 0x88, 0x91, 0x0a, 0x46, 0xca, 0xe6, 0xde, 0x04, 0x9b, + 0x5c, 0xb2, 0xca, 0xda, 0x73, 0x89, 0x8e, 0x73, 0x6f, 0x42, 0x3e, 0x84, 0xcd, 0x78, 0xce, 0xb1, + 0x38, 0x3e, 0x64, 0x46, 0x09, 0x91, 0xa5, 0x99, 0xb5, 0xcd, 0x87, 0x8c, 0xfc, 0x08, 0xef, 0x8c, + 0x7c, 0x6f, 0xd6, 0x53, 0x9b, 0xfb, 0x1d, 0x61, 0x6c, 0xe2, 0xc0, 0x2c, 0x5b, 0x78, 0x8d, 0xf6, + 0xf1, 0x55, 0x2a, 0xe4, 0xdc, 0xef, 0x08, 0xab, 0x3c, 0xba, 0x67, 0x89, 0xce, 0x0f, 0x68, 0x48, + 0x87, 0xd2, 0x1e, 0xb3, 0x10, 0xa7, 0x7f, 0x2b, 0x3e, 0x3f, 0xb6, 0xfe, 0x10, 0x1b, 0xab, 0xbf, + 0xc6, 0x6f, 0xc2, 0x7d, 0xc2, 0x48, 0x18, 0xa9, 0xf4, 0x63, 0x75, 0x15, 0x93, 0xd5, 0x15, 0x37, + 0xe7, 0x35, 0x3c, 0x99, 0x37, 0x67, 0x0e, 0x8e, 0xba, 0xb3, 0x82, 0xe8, 0xdd, 0x99, 0xfb, 0x2a, + 0xf1, 0x46, 0xed, 0x71, 0xe1, 0xd9, 0xac, 0x3d, 0x77, 0xc2, 0x62, 0x95, 0xc6, 0xdb, 0xfe, 0xc5, + 0xb2, 0x0d, 0x9d, 0x74, 0x07, 0xcb, 0x36, 0x12, 0xa2, 0xf4, 0x01, 0x28, 0xec, 0x7b, 0xd2, 0xca, + 0xfd, 0x07, 0x69, 0xad, 0x3e, 0x20, 0xad, 0x0e, 0x3c, 0x9e, 0x4b, 0x2b, 0x15, 0x24, 0x8d, 0xb5, + 0xff, 0xa9, 0xb1, 0x9d, 0x99, 0xc6, 0xe6, 0xc7, 0xc8, 0xea, 0x10, 0x76, 0x16, 0xbd, 0x45, 0xd1, + 0x56, 0x9c, 0x0f, 0x94, 0xdd, 0xa3, 0xb2, 0xa7, 0xe7, 0xbe, 0x34, 0x9b, 0xaa, 0x33, 0x2a, 0x7b, + 0xe4, 0x53, 0xd8, 0x0e, 0x59, 0xc4, 0x1c, 0xe2, 0x8b, 0x8c, 0x6b, 0x40, 0xf6, 0xf5, 0x03, 0x50, + 0x9e, 0xb9, 0x4e, 0xa3, 0x55, 0xd0, 0xea, 0x57, 0x39, 0xec, 0x2e, 0x7c, 0xab, 0xfe, 0xf5, 0x79, + 0x35, 0x28, 0xa7, 0xe5, 0x92, 0x12, 0xc1, 0x66, 0x4a, 0x32, 0x2d, 0xde, 0x6d, 0x5c, 0xfc, 0x76, + 0x53, 0xc9, 0xbc, 0xbd, 0xa9, 0x64, 0xfe, 0xbc, 0xa9, 0x64, 0x7e, 0xbe, 0xad, 0x3c, 0x7a, 0x7b, + 0x5b, 0x79, 0xf4, 0xfb, 0x6d, 0xe5, 0xd1, 0x4f, 0x87, 0x5d, 0xae, 0x7a, 0x23, 0xc7, 0x74, 0xc5, + 0xb0, 0xae, 0x6f, 0x11, 0x57, 0x67, 0xf2, 0x51, 0x9f, 0xa4, 0x7f, 0x70, 0xd4, 0x34, 0x60, 0xd2, + 0x59, 0xc3, 0x3f, 0x9b, 0xcf, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x80, 0xc3, 0x6c, 0xac, 0xa9, + 0x09, 0x00, 0x00, +} + +func (m *BTCStakingIBCPacket) 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 *BTCStakingIBCPacket) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BTCStakingIBCPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.UnbondedDel) > 0 { + for iNdEx := len(m.UnbondedDel) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.UnbondedDel[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + } + if len(m.SlashedDel) > 0 { + for iNdEx := len(m.SlashedDel) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SlashedDel[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.ActiveDel) > 0 { + for iNdEx := len(m.ActiveDel) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ActiveDel[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.SlashedFp) > 0 { + for iNdEx := len(m.SlashedFp) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SlashedFp[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.NewFp) > 0 { + for iNdEx := len(m.NewFp) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.NewFp[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *NewFinalityProvider) 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 *NewFinalityProvider) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintPacket(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0x52 + } + if m.SlashedBtcHeight != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.SlashedBtcHeight)) + i-- + dAtA[i] = 0x48 + } + if m.SlashedBabylonHeight != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.SlashedBabylonHeight)) + i-- + dAtA[i] = 0x40 + } + if m.RegisteredEpoch != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.RegisteredEpoch)) + i-- + dAtA[i] = 0x38 + } + if len(m.MasterPubRand) > 0 { + i -= len(m.MasterPubRand) + copy(dAtA[i:], m.MasterPubRand) + i = encodeVarintPacket(dAtA, i, uint64(len(m.MasterPubRand))) + i-- + dAtA[i] = 0x32 + } + if m.Pop != nil { + { + size, err := m.Pop.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.BtcPkHex) > 0 { + i -= len(m.BtcPkHex) + copy(dAtA[i:], m.BtcPkHex) + i = encodeVarintPacket(dAtA, i, uint64(len(m.BtcPkHex))) + i-- + dAtA[i] = 0x22 + } + if m.BabylonPk != nil { + { + size, err := m.BabylonPk.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.Commission) > 0 { + i -= len(m.Commission) + copy(dAtA[i:], m.Commission) + i = encodeVarintPacket(dAtA, i, uint64(len(m.Commission))) + i-- + dAtA[i] = 0x12 + } + if m.Description != nil { + { + size, err := m.Description.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SlashedFinalityProvider) 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 *SlashedFinalityProvider) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SlashedFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.BtcPkHex) > 0 { + i -= len(m.BtcPkHex) + copy(dAtA[i:], m.BtcPkHex) + i = encodeVarintPacket(dAtA, i, uint64(len(m.BtcPkHex))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ActiveBTCDelegation) 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 *ActiveBTCDelegation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ActiveBTCDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ParamsVersion != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.ParamsVersion)) + i-- + dAtA[i] = 0x78 + } + if m.UndelegationInfo != nil { + { + size, err := m.UndelegationInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x72 + } + if m.UnbondingTime != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.UnbondingTime)) + i-- + dAtA[i] = 0x68 + } + if m.StakingOutputIdx != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.StakingOutputIdx)) + i-- + dAtA[i] = 0x50 + } + if len(m.CovenantSigs) > 0 { + for iNdEx := len(m.CovenantSigs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.CovenantSigs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + } + if len(m.DelegatorSlashingSig) > 0 { + i -= len(m.DelegatorSlashingSig) + copy(dAtA[i:], m.DelegatorSlashingSig) + i = encodeVarintPacket(dAtA, i, uint64(len(m.DelegatorSlashingSig))) + i-- + dAtA[i] = 0x42 + } + if len(m.SlashingTx) > 0 { + i -= len(m.SlashingTx) + copy(dAtA[i:], m.SlashingTx) + i = encodeVarintPacket(dAtA, i, uint64(len(m.SlashingTx))) + i-- + dAtA[i] = 0x3a + } + if len(m.StakingTx) > 0 { + i -= len(m.StakingTx) + copy(dAtA[i:], m.StakingTx) + i = encodeVarintPacket(dAtA, i, uint64(len(m.StakingTx))) + i-- + dAtA[i] = 0x32 + } + if m.TotalSat != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.TotalSat)) + i-- + dAtA[i] = 0x28 + } + if m.EndHeight != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.EndHeight)) + i-- + dAtA[i] = 0x20 + } + if m.StartHeight != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.StartHeight)) + i-- + dAtA[i] = 0x18 + } + if len(m.FpBtcPkList) > 0 { + for iNdEx := len(m.FpBtcPkList) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.FpBtcPkList[iNdEx]) + copy(dAtA[i:], m.FpBtcPkList[iNdEx]) + i = encodeVarintPacket(dAtA, i, uint64(len(m.FpBtcPkList[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.BtcPkHex) > 0 { + i -= len(m.BtcPkHex) + copy(dAtA[i:], m.BtcPkHex) + i = encodeVarintPacket(dAtA, i, uint64(len(m.BtcPkHex))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *BTCUndelegationInfo) 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 *BTCUndelegationInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BTCUndelegationInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.CovenantSlashingSigs) > 0 { + for iNdEx := len(m.CovenantSlashingSigs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.CovenantSlashingSigs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if len(m.DelegatorSlashingSig) > 0 { + i -= len(m.DelegatorSlashingSig) + copy(dAtA[i:], m.DelegatorSlashingSig) + i = encodeVarintPacket(dAtA, i, uint64(len(m.DelegatorSlashingSig))) + i-- + dAtA[i] = 0x2a + } + if len(m.SlashingTx) > 0 { + i -= len(m.SlashingTx) + copy(dAtA[i:], m.SlashingTx) + i = encodeVarintPacket(dAtA, i, uint64(len(m.SlashingTx))) + i-- + dAtA[i] = 0x22 + } + if len(m.CovenantUnbondingSigList) > 0 { + for iNdEx := len(m.CovenantUnbondingSigList) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.CovenantUnbondingSigList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.DelegatorUnbondingSig) > 0 { + i -= len(m.DelegatorUnbondingSig) + copy(dAtA[i:], m.DelegatorUnbondingSig) + i = encodeVarintPacket(dAtA, i, uint64(len(m.DelegatorUnbondingSig))) + i-- + dAtA[i] = 0x12 + } + if len(m.UnbondingTx) > 0 { + i -= len(m.UnbondingTx) + copy(dAtA[i:], m.UnbondingTx) + i = encodeVarintPacket(dAtA, i, uint64(len(m.UnbondingTx))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SlashedBTCDelegation) 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 *SlashedBTCDelegation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SlashedBTCDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.RecoveredFpBtcSk) > 0 { + i -= len(m.RecoveredFpBtcSk) + copy(dAtA[i:], m.RecoveredFpBtcSk) + i = encodeVarintPacket(dAtA, i, uint64(len(m.RecoveredFpBtcSk))) + i-- + dAtA[i] = 0x12 + } + if len(m.StakingTxHash) > 0 { + i -= len(m.StakingTxHash) + copy(dAtA[i:], m.StakingTxHash) + i = encodeVarintPacket(dAtA, i, uint64(len(m.StakingTxHash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *UnbondedBTCDelegation) 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 *UnbondedBTCDelegation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UnbondedBTCDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.UnbondingTxSig) > 0 { + i -= len(m.UnbondingTxSig) + copy(dAtA[i:], m.UnbondingTxSig) + i = encodeVarintPacket(dAtA, i, uint64(len(m.UnbondingTxSig))) + i-- + dAtA[i] = 0x12 + } + if len(m.StakingTxHash) > 0 { + i -= len(m.StakingTxHash) + copy(dAtA[i:], m.StakingTxHash) + i = encodeVarintPacket(dAtA, i, uint64(len(m.StakingTxHash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintPacket(dAtA []byte, offset int, v uint64) int { + offset -= sovPacket(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *BTCStakingIBCPacket) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.NewFp) > 0 { + for _, e := range m.NewFp { + l = e.Size() + n += 1 + l + sovPacket(uint64(l)) + } + } + if len(m.SlashedFp) > 0 { + for _, e := range m.SlashedFp { + l = e.Size() + n += 1 + l + sovPacket(uint64(l)) + } + } + if len(m.ActiveDel) > 0 { + for _, e := range m.ActiveDel { + l = e.Size() + n += 1 + l + sovPacket(uint64(l)) + } + } + if len(m.SlashedDel) > 0 { + for _, e := range m.SlashedDel { + l = e.Size() + n += 1 + l + sovPacket(uint64(l)) + } + } + if len(m.UnbondedDel) > 0 { + for _, e := range m.UnbondedDel { + l = e.Size() + n += 1 + l + sovPacket(uint64(l)) + } + } + return n +} + +func (m *NewFinalityProvider) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Description != nil { + l = m.Description.Size() + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.Commission) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + if m.BabylonPk != nil { + l = m.BabylonPk.Size() + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.BtcPkHex) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + if m.Pop != nil { + l = m.Pop.Size() + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.MasterPubRand) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + if m.RegisteredEpoch != 0 { + n += 1 + sovPacket(uint64(m.RegisteredEpoch)) + } + if m.SlashedBabylonHeight != 0 { + n += 1 + sovPacket(uint64(m.SlashedBabylonHeight)) + } + if m.SlashedBtcHeight != 0 { + n += 1 + sovPacket(uint64(m.SlashedBtcHeight)) + } + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + return n +} + +func (m *SlashedFinalityProvider) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.BtcPkHex) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + return n +} + +func (m *ActiveBTCDelegation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.BtcPkHex) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + if len(m.FpBtcPkList) > 0 { + for _, s := range m.FpBtcPkList { + l = len(s) + n += 1 + l + sovPacket(uint64(l)) + } + } + if m.StartHeight != 0 { + n += 1 + sovPacket(uint64(m.StartHeight)) + } + if m.EndHeight != 0 { + n += 1 + sovPacket(uint64(m.EndHeight)) + } + if m.TotalSat != 0 { + n += 1 + sovPacket(uint64(m.TotalSat)) + } + l = len(m.StakingTx) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.SlashingTx) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.DelegatorSlashingSig) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + if len(m.CovenantSigs) > 0 { + for _, e := range m.CovenantSigs { + l = e.Size() + n += 1 + l + sovPacket(uint64(l)) + } + } + if m.StakingOutputIdx != 0 { + n += 1 + sovPacket(uint64(m.StakingOutputIdx)) + } + if m.UnbondingTime != 0 { + n += 1 + sovPacket(uint64(m.UnbondingTime)) + } + if m.UndelegationInfo != nil { + l = m.UndelegationInfo.Size() + n += 1 + l + sovPacket(uint64(l)) + } + if m.ParamsVersion != 0 { + n += 1 + sovPacket(uint64(m.ParamsVersion)) + } + return n +} + +func (m *BTCUndelegationInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.UnbondingTx) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.DelegatorUnbondingSig) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + if len(m.CovenantUnbondingSigList) > 0 { + for _, e := range m.CovenantUnbondingSigList { + l = e.Size() + n += 1 + l + sovPacket(uint64(l)) + } + } + l = len(m.SlashingTx) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.DelegatorSlashingSig) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + if len(m.CovenantSlashingSigs) > 0 { + for _, e := range m.CovenantSlashingSigs { + l = e.Size() + n += 1 + l + sovPacket(uint64(l)) + } + } + return n +} + +func (m *SlashedBTCDelegation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.StakingTxHash) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.RecoveredFpBtcSk) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + return n +} + +func (m *UnbondedBTCDelegation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.StakingTxHash) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.UnbondingTxSig) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + return n +} + +func sovPacket(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozPacket(x uint64) (n int) { + return sovPacket(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *BTCStakingIBCPacket) 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 ErrIntOverflowPacket + } + 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: BTCStakingIBCPacket: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BTCStakingIBCPacket: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewFp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewFp = append(m.NewFp, &NewFinalityProvider{}) + if err := m.NewFp[len(m.NewFp)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashedFp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SlashedFp = append(m.SlashedFp, &SlashedFinalityProvider{}) + if err := m.SlashedFp[len(m.SlashedFp)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ActiveDel", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ActiveDel = append(m.ActiveDel, &ActiveBTCDelegation{}) + if err := m.ActiveDel[len(m.ActiveDel)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashedDel", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SlashedDel = append(m.SlashedDel, &SlashedBTCDelegation{}) + if err := m.SlashedDel[len(m.SlashedDel)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondedDel", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UnbondedDel = append(m.UnbondedDel, &UnbondedBTCDelegation{}) + if err := m.UnbondedDel[len(m.UnbondedDel)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NewFinalityProvider) 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 ErrIntOverflowPacket + } + 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: NewFinalityProvider: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NewFinalityProvider: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Description == nil { + m.Description = &types.Description{} + } + if err := m.Description.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Commission", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Commission = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BabylonPk", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BabylonPk == nil { + m.BabylonPk = &secp256k1.PubKey{} + } + if err := m.BabylonPk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BtcPkHex", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BtcPkHex = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pop", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pop == nil { + m.Pop = &ProofOfPossession{} + } + if err := m.Pop.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MasterPubRand", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MasterPubRand = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RegisteredEpoch", wireType) + } + m.RegisteredEpoch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RegisteredEpoch |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashedBabylonHeight", wireType) + } + m.SlashedBabylonHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SlashedBabylonHeight |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashedBtcHeight", wireType) + } + m.SlashedBtcHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SlashedBtcHeight |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SlashedFinalityProvider) 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 ErrIntOverflowPacket + } + 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: SlashedFinalityProvider: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SlashedFinalityProvider: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BtcPkHex", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BtcPkHex = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ActiveBTCDelegation) 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 ErrIntOverflowPacket + } + 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: ActiveBTCDelegation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ActiveBTCDelegation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BtcPkHex", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BtcPkHex = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FpBtcPkList", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FpBtcPkList = append(m.FpBtcPkList, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartHeight", wireType) + } + m.StartHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.StartHeight |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EndHeight", wireType) + } + m.EndHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EndHeight |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalSat", wireType) + } + m.TotalSat = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalSat |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StakingTx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StakingTx = append(m.StakingTx[:0], dAtA[iNdEx:postIndex]...) + if m.StakingTx == nil { + m.StakingTx = []byte{} + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashingTx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SlashingTx = append(m.SlashingTx[:0], dAtA[iNdEx:postIndex]...) + if m.SlashingTx == nil { + m.SlashingTx = []byte{} + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorSlashingSig", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorSlashingSig = append(m.DelegatorSlashingSig[:0], dAtA[iNdEx:postIndex]...) + if m.DelegatorSlashingSig == nil { + m.DelegatorSlashingSig = []byte{} + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CovenantSigs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CovenantSigs = append(m.CovenantSigs, &CovenantAdaptorSignatures{}) + if err := m.CovenantSigs[len(m.CovenantSigs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StakingOutputIdx", wireType) + } + m.StakingOutputIdx = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.StakingOutputIdx |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingTime", wireType) + } + m.UnbondingTime = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingTime |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UndelegationInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UndelegationInfo == nil { + m.UndelegationInfo = &BTCUndelegationInfo{} + } + if err := m.UndelegationInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ParamsVersion", wireType) + } + m.ParamsVersion = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ParamsVersion |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BTCUndelegationInfo) 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 ErrIntOverflowPacket + } + 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: BTCUndelegationInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BTCUndelegationInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingTx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UnbondingTx = append(m.UnbondingTx[:0], dAtA[iNdEx:postIndex]...) + if m.UnbondingTx == nil { + m.UnbondingTx = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorUnbondingSig", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorUnbondingSig = append(m.DelegatorUnbondingSig[:0], dAtA[iNdEx:postIndex]...) + if m.DelegatorUnbondingSig == nil { + m.DelegatorUnbondingSig = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CovenantUnbondingSigList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CovenantUnbondingSigList = append(m.CovenantUnbondingSigList, &SignatureInfo{}) + if err := m.CovenantUnbondingSigList[len(m.CovenantUnbondingSigList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashingTx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SlashingTx = append(m.SlashingTx[:0], dAtA[iNdEx:postIndex]...) + if m.SlashingTx == nil { + m.SlashingTx = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorSlashingSig", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorSlashingSig = append(m.DelegatorSlashingSig[:0], dAtA[iNdEx:postIndex]...) + if m.DelegatorSlashingSig == nil { + m.DelegatorSlashingSig = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CovenantSlashingSigs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CovenantSlashingSigs = append(m.CovenantSlashingSigs, &CovenantAdaptorSignatures{}) + if err := m.CovenantSlashingSigs[len(m.CovenantSlashingSigs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SlashedBTCDelegation) 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 ErrIntOverflowPacket + } + 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: SlashedBTCDelegation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SlashedBTCDelegation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StakingTxHash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StakingTxHash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RecoveredFpBtcSk", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RecoveredFpBtcSk = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UnbondedBTCDelegation) 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 ErrIntOverflowPacket + } + 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: UnbondedBTCDelegation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UnbondedBTCDelegation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StakingTxHash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StakingTxHash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingTxSig", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UnbondingTxSig = append(m.UnbondingTxSig[:0], dAtA[iNdEx:postIndex]...) + if m.UnbondingTxSig == nil { + m.UnbondingTxSig = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipPacket(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPacket + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPacket + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPacket + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthPacket + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupPacket + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthPacket + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthPacket = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowPacket = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupPacket = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/zoneconcierge/types/packet.pb.go b/x/zoneconcierge/types/packet.pb.go index 6e123e938..35575a226 100644 --- a/x/zoneconcierge/types/packet.pb.go +++ b/x/zoneconcierge/types/packet.pb.go @@ -5,10 +5,11 @@ package types import ( fmt "fmt" - types3 "github.com/babylonchain/babylon/x/btccheckpoint/types" - types "github.com/babylonchain/babylon/x/btclightclient/types" - types2 "github.com/babylonchain/babylon/x/checkpointing/types" - types1 "github.com/babylonchain/babylon/x/epoching/types" + types4 "github.com/babylonchain/babylon/x/btccheckpoint/types" + types1 "github.com/babylonchain/babylon/x/btclightclient/types" + types "github.com/babylonchain/babylon/x/btcstaking/types" + types3 "github.com/babylonchain/babylon/x/checkpointing/types" + types2 "github.com/babylonchain/babylon/x/epoching/types" proto "github.com/cosmos/gogoproto/proto" io "io" math "math" @@ -33,6 +34,7 @@ type ZoneconciergePacketData struct { // // Types that are valid to be assigned to Packet: // *ZoneconciergePacketData_BtcTimestamp + // *ZoneconciergePacketData_BtcStaking Packet isZoneconciergePacketData_Packet `protobuf_oneof:"packet"` } @@ -78,8 +80,12 @@ type isZoneconciergePacketData_Packet interface { type ZoneconciergePacketData_BtcTimestamp struct { BtcTimestamp *BTCTimestamp `protobuf:"bytes,1,opt,name=btc_timestamp,json=btcTimestamp,proto3,oneof" json:"btc_timestamp,omitempty"` } +type ZoneconciergePacketData_BtcStaking struct { + BtcStaking *types.BTCStakingIBCPacket `protobuf:"bytes,2,opt,name=btc_staking,json=btcStaking,proto3,oneof" json:"btc_staking,omitempty"` +} func (*ZoneconciergePacketData_BtcTimestamp) isZoneconciergePacketData_Packet() {} +func (*ZoneconciergePacketData_BtcStaking) isZoneconciergePacketData_Packet() {} func (m *ZoneconciergePacketData) GetPacket() isZoneconciergePacketData_Packet { if m != nil { @@ -95,10 +101,18 @@ func (m *ZoneconciergePacketData) GetBtcTimestamp() *BTCTimestamp { return nil } +func (m *ZoneconciergePacketData) GetBtcStaking() *types.BTCStakingIBCPacket { + if x, ok := m.GetPacket().(*ZoneconciergePacketData_BtcStaking); ok { + return x.BtcStaking + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*ZoneconciergePacketData) XXX_OneofWrappers() []interface{} { return []interface{}{ (*ZoneconciergePacketData_BtcTimestamp)(nil), + (*ZoneconciergePacketData_BtcStaking)(nil), } } @@ -114,13 +128,13 @@ type BTCTimestamp struct { // - the block AFTER the common ancestor of BTC tip at epoch `lastFinalizedEpoch-1` and BTC tip at epoch `lastFinalizedEpoch` // - BTC tip at epoch `lastFinalizedEpoch` // where `lastFinalizedEpoch` is the last finalised epoch in Babylon - BtcHeaders []*types.BTCHeaderInfo `protobuf:"bytes,2,rep,name=btc_headers,json=btcHeaders,proto3" json:"btc_headers,omitempty"` + BtcHeaders []*types1.BTCHeaderInfo `protobuf:"bytes,2,rep,name=btc_headers,json=btcHeaders,proto3" json:"btc_headers,omitempty"` // epoch_info is the metadata of the sealed epoch - EpochInfo *types1.Epoch `protobuf:"bytes,3,opt,name=epoch_info,json=epochInfo,proto3" json:"epoch_info,omitempty"` + EpochInfo *types2.Epoch `protobuf:"bytes,3,opt,name=epoch_info,json=epochInfo,proto3" json:"epoch_info,omitempty"` // raw_checkpoint is the raw checkpoint that seals this epoch - RawCheckpoint *types2.RawCheckpoint `protobuf:"bytes,4,opt,name=raw_checkpoint,json=rawCheckpoint,proto3" json:"raw_checkpoint,omitempty"` + RawCheckpoint *types3.RawCheckpoint `protobuf:"bytes,4,opt,name=raw_checkpoint,json=rawCheckpoint,proto3" json:"raw_checkpoint,omitempty"` // btc_submission_key is position of two BTC txs that include the raw checkpoint of this epoch - BtcSubmissionKey *types3.SubmissionKey `protobuf:"bytes,5,opt,name=btc_submission_key,json=btcSubmissionKey,proto3" json:"btc_submission_key,omitempty"` + BtcSubmissionKey *types4.SubmissionKey `protobuf:"bytes,5,opt,name=btc_submission_key,json=btcSubmissionKey,proto3" json:"btc_submission_key,omitempty"` // //Proofs that the header is finalized Proof *ProofFinalizedChainInfo `protobuf:"bytes,6,opt,name=proof,proto3" json:"proof,omitempty"` @@ -166,28 +180,28 @@ func (m *BTCTimestamp) GetHeader() *IndexedHeader { return nil } -func (m *BTCTimestamp) GetBtcHeaders() []*types.BTCHeaderInfo { +func (m *BTCTimestamp) GetBtcHeaders() []*types1.BTCHeaderInfo { if m != nil { return m.BtcHeaders } return nil } -func (m *BTCTimestamp) GetEpochInfo() *types1.Epoch { +func (m *BTCTimestamp) GetEpochInfo() *types2.Epoch { if m != nil { return m.EpochInfo } return nil } -func (m *BTCTimestamp) GetRawCheckpoint() *types2.RawCheckpoint { +func (m *BTCTimestamp) GetRawCheckpoint() *types3.RawCheckpoint { if m != nil { return m.RawCheckpoint } return nil } -func (m *BTCTimestamp) GetBtcSubmissionKey() *types3.SubmissionKey { +func (m *BTCTimestamp) GetBtcSubmissionKey() *types4.SubmissionKey { if m != nil { return m.BtcSubmissionKey } @@ -211,37 +225,39 @@ func init() { } var fileDescriptor_be12e124c5c4fdb9 = []byte{ - // 471 bytes of a gzipped FileDescriptorProto + // 511 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x4f, 0x6f, 0xd3, 0x30, - 0x18, 0xc6, 0x1b, 0xca, 0x2a, 0x70, 0x37, 0x84, 0x7c, 0x21, 0xda, 0x21, 0x9a, 0x2a, 0x01, 0x45, - 0x9a, 0x1c, 0x65, 0x88, 0x03, 0x27, 0xa4, 0x96, 0x3f, 0xab, 0x10, 0x30, 0x85, 0x71, 0xd9, 0xa5, - 0xb2, 0xdd, 0xb7, 0x8d, 0xd5, 0xd6, 0x8e, 0x12, 0xaf, 0x5b, 0xf7, 0x29, 0xf8, 0x52, 0x48, 0x1c, - 0x77, 0xe4, 0x88, 0xda, 0x2f, 0x82, 0xec, 0xfc, 0x69, 0x52, 0x94, 0x4b, 0xe4, 0xf7, 0xc9, 0xcf, - 0x8f, 0xfd, 0x3e, 0x7e, 0xd1, 0x73, 0x46, 0xd9, 0x7a, 0xa1, 0xa4, 0x7f, 0xa7, 0x24, 0x70, 0x25, - 0xb9, 0x80, 0x64, 0x06, 0xfe, 0x2a, 0xf0, 0x63, 0xca, 0xe7, 0xa0, 0x49, 0x9c, 0x28, 0xad, 0xb0, - 0x9b, 0x63, 0xa4, 0x86, 0x91, 0x55, 0x70, 0x7c, 0x5a, 0x18, 0x30, 0xcd, 0x79, 0x04, 0x7c, 0x1e, - 0x2b, 0x21, 0xb5, 0x31, 0xa8, 0x09, 0x99, 0xcf, 0xf1, 0xab, 0x82, 0xde, 0xfd, 0x11, 0x72, 0x66, - 0xe8, 0xff, 0x50, 0x52, 0x31, 0x5e, 0x88, 0x59, 0x64, 0xbe, 0x50, 0x3a, 0x57, 0x94, 0x9c, 0xef, - 0x15, 0x3c, 0xc4, 0x8a, 0x47, 0xb9, 0x6b, 0xb1, 0xce, 0x99, 0xd3, 0xc6, 0x6e, 0xeb, 0x7d, 0x59, - 0xba, 0x97, 0xa0, 0x67, 0x57, 0x55, 0xf9, 0xc2, 0x26, 0xf2, 0x9e, 0x6a, 0x8a, 0xbf, 0xa0, 0x23, - 0xa6, 0xf9, 0x58, 0x8b, 0x25, 0xa4, 0x9a, 0x2e, 0x63, 0xd7, 0x39, 0x71, 0xfa, 0xdd, 0xb3, 0x17, - 0xa4, 0x29, 0x27, 0x32, 0xb8, 0x1c, 0x5e, 0x16, 0xf4, 0x79, 0x2b, 0x3c, 0x64, 0x9a, 0x97, 0xf5, - 0xe0, 0x11, 0xea, 0x64, 0x71, 0xf7, 0x7e, 0xb5, 0xd1, 0x61, 0x15, 0xc5, 0xef, 0x50, 0x27, 0x02, - 0x3a, 0x81, 0x24, 0x3f, 0xe2, 0x65, 0xf3, 0x11, 0x23, 0x39, 0x81, 0x5b, 0x98, 0x9c, 0x5b, 0x3c, - 0xcc, 0xb7, 0xe1, 0x11, 0xea, 0x9a, 0xab, 0x66, 0x55, 0xea, 0x3e, 0x38, 0x69, 0xf7, 0xbb, 0x67, - 0xfd, 0xd2, 0x65, 0x2f, 0xcb, 0xec, 0xa6, 0x99, 0xc5, 0x48, 0x4e, 0x55, 0x88, 0x98, 0xe6, 0x59, - 0x99, 0xe2, 0xb7, 0x08, 0xd9, 0x40, 0xc7, 0x42, 0x4e, 0x95, 0xdb, 0xb6, 0xf7, 0x29, 0xdf, 0x89, - 0x94, 0x59, 0xaf, 0x02, 0xf2, 0xc1, 0xac, 0xc3, 0xc7, 0x56, 0x32, 0x36, 0xf8, 0x2b, 0x7a, 0x92, - 0xd0, 0x9b, 0xf1, 0xee, 0x95, 0xdd, 0x87, 0x7b, 0xed, 0xd4, 0x26, 0xc2, 0x78, 0x84, 0xf4, 0x66, - 0x58, 0x6a, 0xe1, 0x51, 0x52, 0x2d, 0xf1, 0x0f, 0x84, 0x4d, 0x57, 0xe9, 0x35, 0x5b, 0x8a, 0x34, - 0x15, 0x4a, 0x8e, 0xe7, 0xb0, 0x76, 0x0f, 0xf6, 0x3c, 0xeb, 0x23, 0xb8, 0x0a, 0xc8, 0xf7, 0x92, - 0xff, 0x0c, 0xeb, 0xf0, 0x29, 0xd3, 0xbc, 0xa6, 0xe0, 0x4f, 0xe8, 0x20, 0x4e, 0x94, 0x9a, 0xba, - 0x1d, 0xeb, 0x14, 0x34, 0x87, 0x7d, 0x61, 0xb0, 0x8f, 0x42, 0xd2, 0x85, 0xb8, 0x83, 0xc9, 0x30, - 0xa2, 0x42, 0xda, 0xbc, 0xb2, 0xfd, 0x83, 0x6f, 0xbf, 0x37, 0x9e, 0x73, 0xbf, 0xf1, 0x9c, 0xbf, - 0x1b, 0xcf, 0xf9, 0xb9, 0xf5, 0x5a, 0xf7, 0x5b, 0xaf, 0xf5, 0x67, 0xeb, 0xb5, 0xae, 0xde, 0xcc, - 0x84, 0x8e, 0xae, 0x19, 0xe1, 0x6a, 0xe9, 0xe7, 0xee, 0xdc, 0xec, 0x2e, 0x0a, 0xff, 0x76, 0x6f, - 0x3a, 0xf5, 0x3a, 0x86, 0x94, 0x75, 0xec, 0x4c, 0xbe, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, 0x31, - 0xea, 0x29, 0xbc, 0xb1, 0x03, 0x00, 0x00, + 0x18, 0xc6, 0x9b, 0x95, 0x55, 0xe0, 0x6e, 0x08, 0xf9, 0x42, 0xb4, 0x43, 0x34, 0x55, 0x02, 0x0a, + 0x42, 0xae, 0x32, 0xc4, 0x81, 0x13, 0x52, 0xcb, 0x9f, 0x56, 0x68, 0x30, 0x65, 0xe3, 0xb2, 0x4b, + 0x65, 0xbb, 0x6e, 0x63, 0xb5, 0xb5, 0xa3, 0xc4, 0xeb, 0xd6, 0x7d, 0x0a, 0xbe, 0x12, 0x07, 0x24, + 0x8e, 0x3b, 0x72, 0x44, 0xed, 0x17, 0x99, 0xfc, 0x27, 0x69, 0xd2, 0xa9, 0x97, 0xca, 0xef, 0xd3, + 0xc7, 0xbf, 0x3c, 0xaf, 0xdf, 0x17, 0xbc, 0x20, 0x98, 0x2c, 0x67, 0x52, 0x74, 0x6e, 0xa5, 0x60, + 0x54, 0x0a, 0xca, 0x59, 0x3a, 0x61, 0x9d, 0x45, 0xd8, 0x49, 0x30, 0x9d, 0x32, 0x85, 0x92, 0x54, + 0x2a, 0x09, 0x7d, 0x67, 0x43, 0x15, 0x1b, 0x5a, 0x84, 0x47, 0x6f, 0x73, 0x00, 0x51, 0x94, 0xc6, + 0x8c, 0x4e, 0x13, 0xc9, 0x85, 0xd2, 0x80, 0x8a, 0x60, 0x39, 0x47, 0xaf, 0x73, 0xf7, 0xe6, 0x1f, + 0x2e, 0x26, 0xda, 0xfd, 0xc0, 0x8a, 0x4a, 0xe0, 0x19, 0x9f, 0xc4, 0xfa, 0x97, 0x15, 0xe4, 0x92, + 0xe2, 0xfc, 0xad, 0xdc, 0xcf, 0x12, 0x49, 0x63, 0x47, 0xcd, 0xcf, 0xdb, 0x1e, 0xa2, 0x68, 0xa6, + 0xf0, 0xd4, 0xb9, 0xca, 0xad, 0x6e, 0x1a, 0x7a, 0xf0, 0x22, 0xd5, 0xde, 0x8d, 0xbb, 0xf5, 0xdb, + 0x03, 0xcf, 0x2f, 0xcb, 0xfa, 0x99, 0x61, 0x7d, 0xc2, 0x0a, 0xc3, 0x53, 0x70, 0x48, 0x14, 0x1d, + 0x2a, 0x3e, 0x67, 0x99, 0xc2, 0xf3, 0xc4, 0xf7, 0x8e, 0xbd, 0x76, 0xf3, 0xe4, 0x25, 0xda, 0xf5, + 0x98, 0xa8, 0x7b, 0xd1, 0xbb, 0xc8, 0xdd, 0xfd, 0x5a, 0x74, 0x40, 0x14, 0x2d, 0x6a, 0x78, 0x0a, + 0x9a, 0x1a, 0xe7, 0x72, 0xfb, 0x7b, 0x06, 0xf6, 0xa6, 0x80, 0x6d, 0x5a, 0x72, 0xa4, 0x73, 0x5b, + 0x0d, 0xba, 0x3d, 0x9b, 0xa9, 0x5f, 0x8b, 0x00, 0x51, 0xd4, 0xc9, 0xdd, 0xc7, 0xa0, 0x61, 0xfb, + 0x6e, 0xfd, 0xa9, 0x83, 0x83, 0xf2, 0x97, 0xe1, 0x47, 0xd0, 0x88, 0x19, 0x1e, 0xb1, 0xd4, 0x25, + 0x7e, 0xb5, 0x3b, 0xf1, 0x40, 0x8c, 0xd8, 0x0d, 0x1b, 0xf5, 0x8d, 0x3d, 0x72, 0xd7, 0xe0, 0xc0, + 0x46, 0xb5, 0x55, 0xe6, 0xef, 0x1d, 0xd7, 0xdb, 0xcd, 0x93, 0x76, 0x39, 0x6a, 0x79, 0x7e, 0x36, + 0xae, 0x45, 0x0c, 0xc4, 0x58, 0x9a, 0x98, 0xb6, 0xcc, 0xe0, 0x07, 0x00, 0xcc, 0x10, 0x87, 0x5c, + 0x8c, 0xa5, 0x5f, 0x37, 0x79, 0x8a, 0xdd, 0x40, 0xc5, 0x7c, 0x17, 0x21, 0xfa, 0xac, 0xcf, 0xd1, + 0x13, 0x23, 0x69, 0x0c, 0xfc, 0x0e, 0x9e, 0xa6, 0xf8, 0x7a, 0xb8, 0xd9, 0x2c, 0xff, 0xd1, 0x56, + 0x3b, 0x95, 0x2d, 0xd4, 0x8c, 0x08, 0x5f, 0xf7, 0x0a, 0x2d, 0x3a, 0x4c, 0xcb, 0x25, 0xfc, 0x09, + 0xa0, 0x19, 0xc0, 0x15, 0x99, 0xf3, 0x2c, 0xe3, 0x52, 0x0c, 0xa7, 0x6c, 0xe9, 0xef, 0x6f, 0x31, + 0xab, 0x6b, 0xbf, 0x08, 0xd1, 0x79, 0xe1, 0xff, 0xc6, 0x96, 0xd1, 0x33, 0x3d, 0x82, 0xb2, 0x02, + 0xbf, 0x82, 0xfd, 0x24, 0x95, 0x72, 0xec, 0x37, 0x0c, 0x29, 0xdc, 0xfd, 0xd8, 0x67, 0xda, 0xf6, + 0x85, 0x0b, 0x3c, 0xe3, 0xb7, 0x6c, 0xd4, 0x8b, 0x31, 0x17, 0xe6, 0xbd, 0xec, 0xfd, 0xee, 0x8f, + 0xbf, 0xab, 0xc0, 0xbb, 0x5b, 0x05, 0xde, 0xff, 0x55, 0xe0, 0xfd, 0x5a, 0x07, 0xb5, 0xbb, 0x75, + 0x50, 0xfb, 0xb7, 0x0e, 0x6a, 0x97, 0xef, 0x27, 0x5c, 0xc5, 0x57, 0x04, 0x51, 0x39, 0xef, 0x38, + 0x3a, 0xd5, 0xb7, 0xf3, 0xa2, 0x73, 0xb3, 0xb5, 0xed, 0x6a, 0x99, 0xb0, 0x8c, 0x34, 0xcc, 0x8e, + 0xbf, 0xbb, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x49, 0x2d, 0xfa, 0x25, 0x04, 0x00, 0x00, } func (m *ZoneconciergePacketData) Marshal() (dAtA []byte, err error) { @@ -297,6 +313,27 @@ func (m *ZoneconciergePacketData_BtcTimestamp) MarshalToSizedBuffer(dAtA []byte) } return len(dAtA) - i, nil } +func (m *ZoneconciergePacketData_BtcStaking) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ZoneconciergePacketData_BtcStaking) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.BtcStaking != nil { + { + size, err := m.BtcStaking.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} func (m *BTCTimestamp) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -429,6 +466,18 @@ func (m *ZoneconciergePacketData_BtcTimestamp) Size() (n int) { } return n } +func (m *ZoneconciergePacketData_BtcStaking) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BtcStaking != nil { + l = m.BtcStaking.Size() + n += 1 + l + sovPacket(uint64(l)) + } + return n +} func (m *BTCTimestamp) Size() (n int) { if m == nil { return 0 @@ -534,6 +583,41 @@ func (m *ZoneconciergePacketData) Unmarshal(dAtA []byte) error { } m.Packet = &ZoneconciergePacketData_BtcTimestamp{v} iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BtcStaking", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &types.BTCStakingIBCPacket{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Packet = &ZoneconciergePacketData_BtcStaking{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPacket(dAtA[iNdEx:]) @@ -649,7 +733,7 @@ func (m *BTCTimestamp) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.BtcHeaders = append(m.BtcHeaders, &types.BTCHeaderInfo{}) + m.BtcHeaders = append(m.BtcHeaders, &types1.BTCHeaderInfo{}) if err := m.BtcHeaders[len(m.BtcHeaders)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -684,7 +768,7 @@ func (m *BTCTimestamp) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.EpochInfo == nil { - m.EpochInfo = &types1.Epoch{} + m.EpochInfo = &types2.Epoch{} } if err := m.EpochInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -720,7 +804,7 @@ func (m *BTCTimestamp) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.RawCheckpoint == nil { - m.RawCheckpoint = &types2.RawCheckpoint{} + m.RawCheckpoint = &types3.RawCheckpoint{} } if err := m.RawCheckpoint.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -756,7 +840,7 @@ func (m *BTCTimestamp) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.BtcSubmissionKey == nil { - m.BtcSubmissionKey = &types3.SubmissionKey{} + m.BtcSubmissionKey = &types4.SubmissionKey{} } if err := m.BtcSubmissionKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err From 56b21f4ead8827b572735198e8a91284ee26d011 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Mon, 22 Apr 2024 16:57:43 +0800 Subject: [PATCH 16/85] zoneconcierge: let zoneconcierge hold a pointer to btcstaking module (#232) --- app/app.go | 92 ++++++++++--------- testutil/keeper/zoneconcierge.go | 3 +- x/btcstaking/types/mocked_keepers.go | 70 ++++++++++++++ x/finality/types/mocked_keepers.go | 8 +- x/zoneconcierge/genesis_test.go | 2 +- x/zoneconcierge/keeper/grpc_query_test.go | 2 +- x/zoneconcierge/keeper/keeper.go | 24 +++-- x/zoneconcierge/keeper/params_test.go | 2 +- .../keeper/proof_btc_timestamp_test.go | 2 +- x/zoneconcierge/types/expected_keepers.go | 5 +- x/zoneconcierge/types/mocked_keepers.go | 38 +++----- 11 files changed, 155 insertions(+), 93 deletions(-) diff --git a/app/app.go b/app/app.go index 8b1a411fb..b37ed1f93 100644 --- a/app/app.go +++ b/app/app.go @@ -641,6 +641,32 @@ func NewBabylonApp( authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) + // set up BTC staking keeper + app.BTCStakingKeeper = btcstakingkeeper.NewKeeper( + appCodec, + runtime.NewKVStoreService(keys[btcstakingtypes.StoreKey]), + &btclightclientKeeper, + &btcCheckpointKeeper, + &checkpointingKeeper, + &app.BTCStkConsumerKeeper, + btcNetParams, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + // set up finality keeper + app.FinalityKeeper = finalitykeeper.NewKeeper( + appCodec, + runtime.NewKVStoreService(keys[finalitytypes.StoreKey]), + &app.BTCStakingKeeper, + &app.IncentiveKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + + monitorKeeper := monitorkeeper.NewKeeper( + appCodec, + runtime.NewKVStoreService(keys[monitortypes.StoreKey]), + &btclightclientKeeper, + ) + zcKeeper := zckeeper.NewKeeper( appCodec, runtime.NewKVStoreService(keys[zctypes.StoreKey]), @@ -653,11 +679,33 @@ func NewBabylonApp( &btclightclientKeeper, &checkpointingKeeper, &btcCheckpointKeeper, - epochingKeeper, + &epochingKeeper, storeQuerier, + &app.BTCStakingKeeper, scopedZoneConciergeKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) + + // add msgServiceRouter so that the epoching module can forward unwrapped messages to the staking module + epochingKeeper.SetMsgServiceRouter(app.BaseApp.MsgServiceRouter()) + // make ZoneConcierge and Monitor to subscribe to the epoching's hooks + epochingKeeper.SetHooks( + epochingtypes.NewMultiEpochingHooks(zcKeeper.Hooks(), monitorKeeper.Hooks()), + ) + // set hooks + checkpointingKeeper.SetHooks( + checkpointingtypes.NewMultiCheckpointingHooks(epochingKeeper.Hooks(), zcKeeper.Hooks(), monitorKeeper.Hooks()), + ) + btclightclientKeeper.SetHooks( + btclightclienttypes.NewMultiBTCLightClientHooks(btcCheckpointKeeper.Hooks()), + ) + + // wire the keepers with hooks to the app + app.EpochingKeeper = epochingKeeper + app.BTCLightClientKeeper = btclightclientKeeper + app.CheckpointingKeeper = checkpointingKeeper + app.BtcCheckpointKeeper = btcCheckpointKeeper + app.MonitorKeeper = monitorKeeper app.ZoneConciergeKeeper = *zcKeeper // Create Transfer Keepers @@ -674,48 +722,6 @@ func NewBabylonApp( authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - app.MonitorKeeper = monitorkeeper.NewKeeper( - appCodec, - runtime.NewKVStoreService(keys[monitortypes.StoreKey]), - &btclightclientKeeper, - ) - - // add msgServiceRouter so that the epoching module can forward unwrapped messages to the staking module - epochingKeeper.SetMsgServiceRouter(app.BaseApp.MsgServiceRouter()) - // make ZoneConcierge and Monitor to subscribe to the epoching's hooks - app.EpochingKeeper = *epochingKeeper.SetHooks( - epochingtypes.NewMultiEpochingHooks(app.ZoneConciergeKeeper.Hooks(), app.MonitorKeeper.Hooks()), - ) - - // set up Checkpointing, BTCCheckpoint, and BTCLightclient keepers - app.CheckpointingKeeper = *checkpointingKeeper.SetHooks( - checkpointingtypes.NewMultiCheckpointingHooks(app.EpochingKeeper.Hooks(), app.ZoneConciergeKeeper.Hooks(), app.MonitorKeeper.Hooks()), - ) - app.BtcCheckpointKeeper = btcCheckpointKeeper - app.BTCLightClientKeeper = *btclightclientKeeper.SetHooks( - btclightclienttypes.NewMultiBTCLightClientHooks(app.BtcCheckpointKeeper.Hooks()), - ) - - // set up BTC staking keeper - app.BTCStakingKeeper = btcstakingkeeper.NewKeeper( - appCodec, - runtime.NewKVStoreService(keys[btcstakingtypes.StoreKey]), - &btclightclientKeeper, - &btcCheckpointKeeper, - &checkpointingKeeper, - &app.BTCStkConsumerKeeper, - btcNetParams, - authtypes.NewModuleAddress(govtypes.ModuleName).String(), - ) - // set up finality keeper - app.FinalityKeeper = finalitykeeper.NewKeeper( - appCodec, - runtime.NewKVStoreService(keys[finalitytypes.StoreKey]), - &app.BTCStakingKeeper, - &app.IncentiveKeeper, - authtypes.NewModuleAddress(govtypes.ModuleName).String(), - ) - // create evidence keeper with router evidenceKeeper := evidencekeeper.NewKeeper( appCodec, diff --git a/testutil/keeper/zoneconcierge.go b/testutil/keeper/zoneconcierge.go index 1c5478db4..e76f4f901 100644 --- a/testutil/keeper/zoneconcierge.go +++ b/testutil/keeper/zoneconcierge.go @@ -69,7 +69,7 @@ func (zoneconciergeStoreQuerier) Query(req *storetypes.RequestQuery) (*storetype }, nil } -func ZoneConciergeKeeper(t testing.TB, btclcKeeper types.BTCLightClientKeeper, checkpointingKeeper types.CheckpointingKeeper, btccKeeper types.BtcCheckpointKeeper, epochingKeeper types.EpochingKeeper) (*keeper.Keeper, sdk.Context) { +func ZoneConciergeKeeper(t testing.TB, btclcKeeper types.BTCLightClientKeeper, checkpointingKeeper types.CheckpointingKeeper, btccKeeper types.BtcCheckpointKeeper, epochingKeeper types.EpochingKeeper, bsKeeper types.BTCStakingKeeper) (*keeper.Keeper, sdk.Context) { logger := log.NewTestLogger(t) storeKey := storetypes.NewKVStoreKey(types.StoreKey) memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) @@ -97,6 +97,7 @@ func ZoneConciergeKeeper(t testing.TB, btclcKeeper types.BTCLightClientKeeper, c btccKeeper, epochingKeeper, zoneconciergeStoreQuerier{}, + bsKeeper, capabilityKeeper.ScopeToModule("ZoneconciergeScopedKeeper"), authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) diff --git a/x/btcstaking/types/mocked_keepers.go b/x/btcstaking/types/mocked_keepers.go index c238f310a..3012d06ca 100644 --- a/x/btcstaking/types/mocked_keepers.go +++ b/x/btcstaking/types/mocked_keepers.go @@ -205,3 +205,73 @@ func NewMockBTCStkConsumerKeeper(ctrl *gomock.Controller) *MockBTCStkConsumerKee func (m *MockBTCStkConsumerKeeper) EXPECT() *MockBTCStkConsumerKeeperMockRecorder { return m.recorder } + +// GetConsumerFinalityProvider mocks base method. +func (m *MockBTCStkConsumerKeeper) GetConsumerFinalityProvider(ctx context.Context, chainID string, fpBTCPK *types.BIP340PubKey) (*FinalityProvider, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetConsumerFinalityProvider", ctx, chainID, fpBTCPK) + ret0, _ := ret[0].(*FinalityProvider) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetConsumerFinalityProvider indicates an expected call of GetConsumerFinalityProvider. +func (mr *MockBTCStkConsumerKeeperMockRecorder) GetConsumerFinalityProvider(ctx, chainID, fpBTCPK interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConsumerFinalityProvider", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).GetConsumerFinalityProvider), ctx, chainID, fpBTCPK) +} + +// GetConsumerFinalityProviderChain mocks base method. +func (m *MockBTCStkConsumerKeeper) GetConsumerFinalityProviderChain(ctx context.Context, fpBTCPK *types.BIP340PubKey) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetConsumerFinalityProviderChain", ctx, fpBTCPK) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetConsumerFinalityProviderChain indicates an expected call of GetConsumerFinalityProviderChain. +func (mr *MockBTCStkConsumerKeeperMockRecorder) GetConsumerFinalityProviderChain(ctx, fpBTCPK interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConsumerFinalityProviderChain", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).GetConsumerFinalityProviderChain), ctx, fpBTCPK) +} + +// HasConsumerFinalityProvider mocks base method. +func (m *MockBTCStkConsumerKeeper) HasConsumerFinalityProvider(ctx context.Context, fpBTCPK *types.BIP340PubKey) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HasConsumerFinalityProvider", ctx, fpBTCPK) + ret0, _ := ret[0].(bool) + return ret0 +} + +// HasConsumerFinalityProvider indicates an expected call of HasConsumerFinalityProvider. +func (mr *MockBTCStkConsumerKeeperMockRecorder) HasConsumerFinalityProvider(ctx, fpBTCPK interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasConsumerFinalityProvider", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).HasConsumerFinalityProvider), ctx, fpBTCPK) +} + +// IsConsumerChainRegistered mocks base method. +func (m *MockBTCStkConsumerKeeper) IsConsumerChainRegistered(ctx context.Context, chainID string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsConsumerChainRegistered", ctx, chainID) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsConsumerChainRegistered indicates an expected call of IsConsumerChainRegistered. +func (mr *MockBTCStkConsumerKeeperMockRecorder) IsConsumerChainRegistered(ctx, chainID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsConsumerChainRegistered", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).IsConsumerChainRegistered), ctx, chainID) +} + +// SetConsumerFinalityProvider mocks base method. +func (m *MockBTCStkConsumerKeeper) SetConsumerFinalityProvider(ctx context.Context, fp *FinalityProvider) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetConsumerFinalityProvider", ctx, fp) +} + +// SetConsumerFinalityProvider indicates an expected call of SetConsumerFinalityProvider. +func (mr *MockBTCStkConsumerKeeperMockRecorder) SetConsumerFinalityProvider(ctx, fp interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConsumerFinalityProvider", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).SetConsumerFinalityProvider), ctx, fp) +} diff --git a/x/finality/types/mocked_keepers.go b/x/finality/types/mocked_keepers.go index 97f2f4177..ecef9983e 100644 --- a/x/finality/types/mocked_keepers.go +++ b/x/finality/types/mocked_keepers.go @@ -53,7 +53,7 @@ func (mr *MockBTCStakingKeeperMockRecorder) GetBTCStakingActivatedHeight(ctx int // GetFinalityProvider mocks base method. func (m *MockBTCStakingKeeper) GetFinalityProvider(ctx context.Context, fpBTCPK []byte) (*types.FinalityProvider, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetConsumerFinalityProvider", ctx, fpBTCPK) + ret := m.ctrl.Call(m, "GetFinalityProvider", ctx, fpBTCPK) ret0, _ := ret[0].(*types.FinalityProvider) ret1, _ := ret[1].(error) return ret0, ret1 @@ -62,7 +62,7 @@ func (m *MockBTCStakingKeeper) GetFinalityProvider(ctx context.Context, fpBTCPK // GetFinalityProvider indicates an expected call of GetFinalityProvider. func (mr *MockBTCStakingKeeperMockRecorder) GetFinalityProvider(ctx, fpBTCPK interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConsumerFinalityProvider", reflect.TypeOf((*MockBTCStakingKeeper)(nil).GetFinalityProvider), ctx, fpBTCPK) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFinalityProvider", reflect.TypeOf((*MockBTCStakingKeeper)(nil).GetFinalityProvider), ctx, fpBTCPK) } // GetLastFinalizedEpoch mocks base method. @@ -139,7 +139,7 @@ func (mr *MockBTCStakingKeeperMockRecorder) GetVotingPowerTable(ctx, height inte // HasFinalityProvider mocks base method. func (m *MockBTCStakingKeeper) HasFinalityProvider(ctx context.Context, fpBTCPK []byte) bool { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HasConsumerFinalityProvider", ctx, fpBTCPK) + ret := m.ctrl.Call(m, "HasFinalityProvider", ctx, fpBTCPK) ret0, _ := ret[0].(bool) return ret0 } @@ -147,7 +147,7 @@ func (m *MockBTCStakingKeeper) HasFinalityProvider(ctx context.Context, fpBTCPK // HasFinalityProvider indicates an expected call of HasFinalityProvider. func (mr *MockBTCStakingKeeperMockRecorder) HasFinalityProvider(ctx, fpBTCPK interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasConsumerFinalityProvider", reflect.TypeOf((*MockBTCStakingKeeper)(nil).HasFinalityProvider), ctx, fpBTCPK) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasFinalityProvider", reflect.TypeOf((*MockBTCStakingKeeper)(nil).HasFinalityProvider), ctx, fpBTCPK) } // RemoveVotingPowerDistCache mocks base method. diff --git a/x/zoneconcierge/genesis_test.go b/x/zoneconcierge/genesis_test.go index 59ae3107d..04e049233 100644 --- a/x/zoneconcierge/genesis_test.go +++ b/x/zoneconcierge/genesis_test.go @@ -16,7 +16,7 @@ func TestGenesis(t *testing.T) { Params: types.Params{IbcPacketTimeoutSeconds: 100}, } - k, ctx := keepertest.ZoneConciergeKeeper(t, nil, nil, nil, nil) + k, ctx := keepertest.ZoneConciergeKeeper(t, nil, nil, nil, nil, nil) zoneconcierge.InitGenesis(ctx, *k, genesisState) got := zoneconcierge.ExportGenesis(ctx, *k) require.NotNil(t, got) diff --git a/x/zoneconcierge/keeper/grpc_query_test.go b/x/zoneconcierge/keeper/grpc_query_test.go index 08c5cab8b..7823915ac 100644 --- a/x/zoneconcierge/keeper/grpc_query_test.go +++ b/x/zoneconcierge/keeper/grpc_query_test.go @@ -396,7 +396,7 @@ func FuzzFinalizedChainInfo(f *testing.F) { btclcKeeper.EXPECT().GetMainChainFrom(gomock.Any(), gomock.Any()).Return([]*btclightclienttypes.BTCHeaderInfo{mockBTCHeaderInfo}).AnyTimes() btclcKeeper.EXPECT().GetTipInfo(gomock.Any()).Return(mockBTCHeaderInfo).AnyTimes() - zcKeeper, ctx := testkeeper.ZoneConciergeKeeper(t, btclcKeeper, checkpointingKeeper, btccKeeper, epochingKeeper) + zcKeeper, ctx := testkeeper.ZoneConciergeKeeper(t, btclcKeeper, checkpointingKeeper, btccKeeper, epochingKeeper, nil) hooks := zcKeeper.Hooks() var ( diff --git a/x/zoneconcierge/keeper/keeper.go b/x/zoneconcierge/keeper/keeper.go index 23223c902..eaead68a6 100644 --- a/x/zoneconcierge/keeper/keeper.go +++ b/x/zoneconcierge/keeper/keeper.go @@ -16,21 +16,23 @@ import ( type ( Keeper struct { - cdc codec.BinaryCodec - storeService corestoretypes.KVStoreService - - ics4Wrapper types.ICS4Wrapper - clientKeeper types.ClientKeeper - channelKeeper types.ChannelKeeper - portKeeper types.PortKeeper - authKeeper types.AccountKeeper - bankKeeper types.BankKeeper + cdc codec.BinaryCodec + storeService corestoretypes.KVStoreService + ics4Wrapper types.ICS4Wrapper + clientKeeper types.ClientKeeper + channelKeeper types.ChannelKeeper + portKeeper types.PortKeeper + authKeeper types.AccountKeeper + bankKeeper types.BankKeeper + // used in BTC timestamping btclcKeeper types.BTCLightClientKeeper checkpointingKeeper types.CheckpointingKeeper btccKeeper types.BtcCheckpointKeeper epochingKeeper types.EpochingKeeper storeQuerier storetypes.Queryable - scopedKeeper types.ScopedKeeper + // used in BTC staking + bsKeeper types.BTCStakingKeeper + scopedKeeper types.ScopedKeeper // The address capable of executing a MsgUpdateParams message. // Typically, this should be the x/gov module account. authority string @@ -51,6 +53,7 @@ func NewKeeper( btccKeeper types.BtcCheckpointKeeper, epochingKeeper types.EpochingKeeper, storeQuerier storetypes.Queryable, + bsKeeper types.BTCStakingKeeper, scopedKeeper types.ScopedKeeper, authority string, ) *Keeper { @@ -68,6 +71,7 @@ func NewKeeper( btccKeeper: btccKeeper, epochingKeeper: epochingKeeper, storeQuerier: storeQuerier, + bsKeeper: bsKeeper, scopedKeeper: scopedKeeper, authority: authority, } diff --git a/x/zoneconcierge/keeper/params_test.go b/x/zoneconcierge/keeper/params_test.go index b8f8f772d..70c1f96a6 100644 --- a/x/zoneconcierge/keeper/params_test.go +++ b/x/zoneconcierge/keeper/params_test.go @@ -9,7 +9,7 @@ import ( ) func TestGetParams(t *testing.T) { - k, ctx := testkeeper.ZoneConciergeKeeper(t, nil, nil, nil, nil) + k, ctx := testkeeper.ZoneConciergeKeeper(t, nil, nil, nil, nil, nil) params := types.DefaultParams() if err := k.SetParams(ctx, params); err != nil { diff --git a/x/zoneconcierge/keeper/proof_btc_timestamp_test.go b/x/zoneconcierge/keeper/proof_btc_timestamp_test.go index 48190e086..dc9ee4a42 100644 --- a/x/zoneconcierge/keeper/proof_btc_timestamp_test.go +++ b/x/zoneconcierge/keeper/proof_btc_timestamp_test.go @@ -137,7 +137,7 @@ func FuzzProofEpochSealed_BLSSig(f *testing.F) { epochingKeeper.EXPECT().GetEpoch(gomock.Any()).Return(epoch).AnyTimes() epochingKeeper.EXPECT().GetHistoricalEpoch(gomock.Any(), gomock.Eq(epoch.EpochNumber)).Return(epoch, nil).AnyTimes() // create zcKeeper and ctx - zcKeeper, ctx := testkeeper.ZoneConciergeKeeper(t, nil, checkpointingKeeper, nil, epochingKeeper) + zcKeeper, ctx := testkeeper.ZoneConciergeKeeper(t, nil, checkpointingKeeper, nil, epochingKeeper, nil) // prove proof, err := zcKeeper.ProveEpochSealed(ctx, epoch.EpochNumber) diff --git a/x/zoneconcierge/types/expected_keepers.go b/x/zoneconcierge/types/expected_keepers.go index 695af1467..5ff831980 100644 --- a/x/zoneconcierge/types/expected_keepers.go +++ b/x/zoneconcierge/types/expected_keepers.go @@ -10,7 +10,6 @@ import ( btclctypes "github.com/babylonchain/babylon/x/btclightclient/types" checkpointingtypes "github.com/babylonchain/babylon/x/checkpointing/types" epochingtypes "github.com/babylonchain/babylon/x/epoching/types" - ctypes "github.com/cometbft/cometbft/rpc/core/types" sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" connectiontypes "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types" @@ -105,7 +104,5 @@ type EpochingKeeper interface { GetEpoch(ctx context.Context) *epochingtypes.Epoch } -// CometClient is a Comet client that allows to query tx inclusion proofs -type CometClient interface { - Tx(ctx context.Context, hash []byte, prove bool) (*ctypes.ResultTx, error) +type BTCStakingKeeper interface { } diff --git a/x/zoneconcierge/types/mocked_keepers.go b/x/zoneconcierge/types/mocked_keepers.go index f5eb253fc..2cb590833 100644 --- a/x/zoneconcierge/types/mocked_keepers.go +++ b/x/zoneconcierge/types/mocked_keepers.go @@ -13,7 +13,6 @@ import ( types1 "github.com/babylonchain/babylon/x/btclightclient/types" types2 "github.com/babylonchain/babylon/x/checkpointing/types" types3 "github.com/babylonchain/babylon/x/epoching/types" - coretypes "github.com/cometbft/cometbft/rpc/core/types" types4 "github.com/cosmos/cosmos-sdk/types" types5 "github.com/cosmos/ibc-go/modules/capability/types" types6 "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" @@ -802,40 +801,25 @@ func (mr *MockEpochingKeeperMockRecorder) GetHistoricalEpoch(ctx, epochNumber in return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetHistoricalEpoch", reflect.TypeOf((*MockEpochingKeeper)(nil).GetHistoricalEpoch), ctx, epochNumber) } -// MockCometClient is a mock of CometClient interface. -type MockCometClient struct { +// MockBTCStakingKeeper is a mock of BTCStakingKeeper interface. +type MockBTCStakingKeeper struct { ctrl *gomock.Controller - recorder *MockCometClientMockRecorder + recorder *MockBTCStakingKeeperMockRecorder } -// MockCometClientMockRecorder is the mock recorder for MockCometClient. -type MockCometClientMockRecorder struct { - mock *MockCometClient +// MockBTCStakingKeeperMockRecorder is the mock recorder for MockBTCStakingKeeper. +type MockBTCStakingKeeperMockRecorder struct { + mock *MockBTCStakingKeeper } -// NewMockCometClient creates a new mock instance. -func NewMockCometClient(ctrl *gomock.Controller) *MockCometClient { - mock := &MockCometClient{ctrl: ctrl} - mock.recorder = &MockCometClientMockRecorder{mock} +// NewMockBTCStakingKeeper creates a new mock instance. +func NewMockBTCStakingKeeper(ctrl *gomock.Controller) *MockBTCStakingKeeper { + mock := &MockBTCStakingKeeper{ctrl: ctrl} + mock.recorder = &MockBTCStakingKeeperMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockCometClient) EXPECT() *MockCometClientMockRecorder { +func (m *MockBTCStakingKeeper) EXPECT() *MockBTCStakingKeeperMockRecorder { return m.recorder } - -// Tx mocks base method. -func (m *MockCometClient) Tx(ctx context.Context, hash []byte, prove bool) (*coretypes.ResultTx, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Tx", ctx, hash, prove) - ret0, _ := ret[0].(*coretypes.ResultTx) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Tx indicates an expected call of Tx. -func (mr *MockCometClientMockRecorder) Tx(ctx, hash, prove interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Tx", reflect.TypeOf((*MockCometClient)(nil).Tx), ctx, hash, prove) -} From 4601ff5609c5b1e6b832d64a5bd9f0230470be67 Mon Sep 17 00:00:00 2001 From: Gurjot Singh <111540954+gusin13@users.noreply.github.com> Date: Mon, 22 Apr 2024 09:24:39 -0400 Subject: [PATCH 17/85] tests: Add pos-integration E2E Tests (#225) --- proto/babylon/btcstaking/v1/packet.proto | 2 +- test/e2e/btc_staking_e2e_test.go | 23 +- test/e2e/btc_staking_integration_e2e_test.go | 342 ++++++++++++++++++ .../configurer/chain/commands_btcstaking.go | 10 +- .../chain/commands_btcstaking_integration.go | 43 +++ .../chain/queries_btcstaking_integration.go | 66 ++++ test/e2e/configurer/factory.go | 16 + test/e2e/e2e_test.go | 5 + x/btcstaking/types/packet.pb.go | 138 +++---- 9 files changed, 560 insertions(+), 85 deletions(-) create mode 100644 test/e2e/btc_staking_integration_e2e_test.go create mode 100644 test/e2e/configurer/chain/commands_btcstaking_integration.go create mode 100644 test/e2e/configurer/chain/queries_btcstaking_integration.go diff --git a/proto/babylon/btcstaking/v1/packet.proto b/proto/babylon/btcstaking/v1/packet.proto index e049e027b..aac3736e1 100644 --- a/proto/babylon/btcstaking/v1/packet.proto +++ b/proto/babylon/btcstaking/v1/packet.proto @@ -34,7 +34,7 @@ message NewFinalityProvider { // the PK follows encoding in BIP-340 spec in hex format string btc_pk_hex = 4; // pop is the proof of possession of babylon_pk and btc_pk - ProofOfPossession pop = 5; + ProofOfPossessionBTC pop = 5; // master_pub_rand is the master public randomness of the finality provider // encoded as a base58 string string master_pub_rand = 6; diff --git a/test/e2e/btc_staking_e2e_test.go b/test/e2e/btc_staking_e2e_test.go index 9c63c69d6..20ed80621 100644 --- a/test/e2e/btc_staking_e2e_test.go +++ b/test/e2e/btc_staking_e2e_test.go @@ -7,16 +7,9 @@ import ( "math/rand" "time" - "github.com/btcsuite/btcd/btcec/v2" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/wire" - "github.com/stretchr/testify/suite" - sdkmath "cosmossdk.io/math" "cosmossdk.io/x/feegrant" feegrantcli "cosmossdk.io/x/feegrant/client/cli" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/babylonchain/babylon/app/params" "github.com/babylonchain/babylon/crypto/eots" @@ -29,6 +22,12 @@ import ( bstypes "github.com/babylonchain/babylon/x/btcstaking/types" ftypes "github.com/babylonchain/babylon/x/finality/types" itypes "github.com/babylonchain/babylon/x/incentive/types" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/wire" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/suite" ) var ( @@ -109,7 +108,7 @@ func (s *BTCStakingTestSuite) Test1CreateFinalityProviderAndDelegation() { delBTCPKs, pop, stakingTxInfo, - cacheFP.BtcPk, + []*bbn.BIP340PubKey{cacheFP.BtcPk}, stakingTimeBlocks, btcutil.Amount(stakingValue), testStakingInfo.SlashingTx, @@ -501,7 +500,7 @@ func (s *BTCStakingTestSuite) Test6MultisigBTCDelegation() { delBTCPKs, pop, stakingTxInfo, - cacheFP.BtcPk, + []*bbn.BIP340PubKey{cacheFP.BtcPk}, stakingTimeBlocks, btcutil.Amount(stakingValue), testStakingInfo.SlashingTx, @@ -582,7 +581,7 @@ func (s *BTCStakingTestSuite) Test7BTCDelegationFeeGrant() { delBTCPKs, pop, stakingTxInfo, - cacheFP.BtcPk, + []*bbn.BIP340PubKey{cacheFP.BtcPk}, stakingTimeBlocks, btcutil.Amount(stakingValue), testStakingInfo.SlashingTx, @@ -692,7 +691,7 @@ func (s *BTCStakingTestSuite) Test8BTCDelegationFeeGrantTyped() { delBTCPKs, pop, stakingTxInfo, - cacheFP.BtcPk, + []*bbn.BIP340PubKey{cacheFP.BtcPk}, stakingTimeBlocks, btcutil.Amount(stakingValue), testStakingInfo.SlashingTx, @@ -715,7 +714,7 @@ func (s *BTCStakingTestSuite) Test8BTCDelegationFeeGrantTyped() { delBTCPKs, pop, stakingTxInfo, - cacheFP.BtcPk, + []*bbn.BIP340PubKey{cacheFP.BtcPk}, stakingTimeBlocks, btcutil.Amount(stakingValue), testStakingInfo.SlashingTx, diff --git a/test/e2e/btc_staking_integration_e2e_test.go b/test/e2e/btc_staking_integration_e2e_test.go new file mode 100644 index 000000000..e1a699bea --- /dev/null +++ b/test/e2e/btc_staking_integration_e2e_test.go @@ -0,0 +1,342 @@ +package e2e + +import ( + "fmt" + "math" + "strings" + "time" + + "github.com/babylonchain/babylon/crypto/eots" + "github.com/babylonchain/babylon/test/e2e/configurer" + "github.com/babylonchain/babylon/test/e2e/configurer/chain" + "github.com/babylonchain/babylon/test/e2e/initialization" + "github.com/babylonchain/babylon/testutil/datagen" + bbn "github.com/babylonchain/babylon/types" + btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" + bstypes "github.com/babylonchain/babylon/x/btcstaking/types" + bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" + ckpttypes "github.com/babylonchain/babylon/x/checkpointing/types" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/wire" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/stretchr/testify/suite" +) + +type BTCStakingIntegrationTestSuite struct { + suite.Suite + + configurer configurer.Configurer +} + +func (s *BTCStakingIntegrationTestSuite) SetupSuite() { + s.T().Log("setting up e2e integration test suite...") + var ( + err error + ) + + // The e2e test flow is as follows: + // + // 1. Configure 1 chain with some validator nodes + // 2. Execute various e2e tests + s.configurer, err = configurer.NewBTCStakingIntegrationConfigurer(s.T(), true) + + s.Require().NoError(err) + + err = s.configurer.ConfigureChains() + s.Require().NoError(err) + + err = s.configurer.RunSetup() + s.Require().NoError(err) +} + +func (s *BTCStakingIntegrationTestSuite) TearDownSuite() { + err := s.configurer.ClearResources() + s.Require().NoError(err) +} + +func (s *BTCStakingIntegrationTestSuite) Test1RegisterNewConsumerChain() { + chainA := s.configurer.GetChainConfig(0) + chainA.WaitUntilHeight(1) + nonValidatorNode, err := chainA.GetNodeAtIndex(2) + s.NoError(err) + s.registerVerifyConsumerChain(nonValidatorNode) +} + +func (s *BTCStakingIntegrationTestSuite) Test2CreateConsumerChainFinalityProvider() { + chainA := s.configurer.GetChainConfig(0) + chainA.WaitUntilHeight(1) + nonValidatorNode, err := chainA.GetNodeAtIndex(2) + s.NoError(err) + + // get the chain registered in Test1 + chainRegistryList := nonValidatorNode.QueryChainRegistryList(&query.PageRequest{Limit: 1}) + consumerChainId := chainRegistryList.ChainIds[0] + + // create a random num of finality providers from 1 to 5 on the consumer chain + numFPs := datagen.RandomInt(r, 5) + 1 + for i := 0; i < int(numFPs); i++ { + s.createVerifyConsumerChainFP(nonValidatorNode, consumerChainId) + } +} + +func (s *BTCStakingIntegrationTestSuite) Test3RestakeDelegationToMultipleFPs() { + chainA := s.configurer.GetChainConfig(0) + chainA.WaitUntilHeight(1) + nonValidatorNode, err := chainA.GetNodeAtIndex(2) + s.NoError(err) + + // get the chain registered in Test1 + chainRegistryList := nonValidatorNode.QueryChainRegistryList(&query.PageRequest{Limit: 1}) + consumerChainId := chainRegistryList.ChainIds[0] + // get the consumer chain created in Test2 + consumerChainFp := nonValidatorNode.QueryConsumerFinalityProviders(consumerChainId)[0] + + // register a babylon finality provider + babylonFp := s.createVerifyBabylonFP(nonValidatorNode) + + // create a delegation and restake to both Babylon and consumer chain finality providers + // NOTE: this will create delegation in pending state as covenant sigs are not provided + delBtcPk, stakingTxHash := s.createBabylonDelegation(nonValidatorNode, babylonFp, consumerChainFp) + + // check delegation + delegation := nonValidatorNode.QueryBtcDelegation(stakingTxHash) + s.NotNil(delegation) + + // check consumer chain finality provider delegation + czPendingDelSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerChainFp.BtcPk.MarshalHex()) + s.Len(czPendingDelSet, 1) + czPendingDels := czPendingDelSet[0] + s.Len(czPendingDels.Dels, 1) + s.Equal(delBtcPk.SerializeCompressed()[1:], czPendingDels.Dels[0].BtcPk.MustToBTCPK().SerializeCompressed()[1:]) + s.Len(czPendingDels.Dels[0].CovenantSigs, 0) + + // check Babylon finality provider delegation + pendingDelSet := nonValidatorNode.QueryFinalityProviderDelegations(babylonFp.BtcPk.MarshalHex()) + s.Len(pendingDelSet, 1) + pendingDels := pendingDelSet[0] + s.Len(pendingDels.Dels, 1) + s.Equal(delBtcPk.SerializeCompressed()[1:], pendingDels.Dels[0].BtcPk.MustToBTCPK().SerializeCompressed()[1:]) + s.Len(pendingDels.Dels[0].CovenantSigs, 0) +} + +// helper function: register a random chain on Babylon and verify it +func (s *BTCStakingIntegrationTestSuite) registerVerifyConsumerChain(babylonNode *chain.NodeConfig) *bsctypes.ChainRegister { + // Register a random chain on Babylon + randomChain := datagen.GenRandomChainRegister(r) + babylonNode.RegisterConsumerChain(randomChain.ChainId, randomChain.ChainName, randomChain.ChainDescription) + babylonNode.WaitForNextBlock() + + // Query the chain registry to verify the chain was registered + chainRegistry := babylonNode.QueryChainRegistry(randomChain.ChainId) + s.Require().Len(chainRegistry, 1) + s.Require().Equal(randomChain.ChainId, chainRegistry[0].ChainId) + s.Require().Equal(randomChain.ChainName, chainRegistry[0].ChainName) + s.Require().Equal(randomChain.ChainDescription, chainRegistry[0].ChainDescription) + return randomChain +} + +// helper function: create a random consumer chain finality provider on Babylon and verify it +func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerChainFP(babylonNode *chain.NodeConfig, consumerChainId string) *bstypes.FinalityProvider { + /* + create a random consumer finality provider on Babylon + */ + // NOTE: we use the node's secret key as Babylon secret key for the finality provider + czFpBTCSK, _, _ := datagen.GenRandomBTCKeyPair(r) + sr, _, err := eots.NewMasterRandPair(r) + s.NoError(err) + czFp, err := datagen.GenRandomCustomFinalityProvider(r, czFpBTCSK, babylonNode.SecretKey, sr) + s.NoError(err) + babylonNode.CreateConsumerFinalityProvider( + czFp.BabylonPk, czFp.BtcPk, czFp.Pop, czFp.MasterPubRand, consumerChainId, czFp.Description.Moniker, + czFp.Description.Identity, czFp.Description.Website, czFp.Description.SecurityContact, + czFp.Description.Details, czFp.Commission, + ) + + // wait for a block so that above txs take effect + babylonNode.WaitForNextBlock() + + // query the existence of finality provider and assert equivalence + actualFp := babylonNode.QueryConsumerFinalityProvider(consumerChainId, czFp.BtcPk.MarshalHex()) + s.Equal(czFp.Description, actualFp.Description) + s.Equal(czFp.Commission, actualFp.Commission) + s.Equal(czFp.BabylonPk, actualFp.BabylonPk) + s.Equal(czFp.BtcPk, actualFp.BtcPk) + s.Equal(czFp.Pop, actualFp.Pop) + s.Equal(czFp.SlashedBabylonHeight, actualFp.SlashedBabylonHeight) + s.Equal(czFp.SlashedBtcHeight, actualFp.SlashedBtcHeight) + s.Equal(consumerChainId, actualFp.ChainId) + return czFp +} + +// helper function: create a random Babylon finality provider and verify it +func (s *BTCStakingIntegrationTestSuite) createVerifyBabylonFP(babylonNode *chain.NodeConfig) *bstypes.FinalityProviderResponse { + /* + create a random finality provider on Babylon + */ + // NOTE: we use the node's secret key as Babylon secret key for the finality provider + babylonFpBTCSK, _, _ := datagen.GenRandomBTCKeyPair(r) + sr, _, err := eots.NewMasterRandPair(r) + s.NoError(err) + babylonFp, err := datagen.GenRandomCustomFinalityProvider(r, babylonFpBTCSK, babylonNode.SecretKey, sr) + s.NoError(err) + babylonNode.CreateFinalityProvider(babylonFp.BabylonPk, babylonFp.BtcPk, babylonFp.Pop, babylonFp.MasterPubRand, babylonFp.Description.Moniker, babylonFp.Description.Identity, babylonFp.Description.Website, babylonFp.Description.SecurityContact, babylonFp.Description.Details, babylonFp.Commission) + + // wait for a block so that above txs take effect + babylonNode.WaitForNextBlock() + + // query the existence of finality provider and assert equivalence + actualFps := babylonNode.QueryFinalityProviders() + s.Len(actualFps, 1) + s.Equal(babylonFp.Description, actualFps[0].Description) + s.Equal(babylonFp.Commission, actualFps[0].Commission) + s.Equal(babylonFp.BabylonPk, actualFps[0].BabylonPk) + s.Equal(babylonFp.BtcPk, actualFps[0].BtcPk) + s.Equal(babylonFp.Pop, actualFps[0].Pop) + s.Equal(babylonFp.SlashedBabylonHeight, actualFps[0].SlashedBabylonHeight) + s.Equal(babylonFp.SlashedBtcHeight, actualFps[0].SlashedBtcHeight) + + return actualFps[0] +} + +// helper function: create a Babylon delegation and restake to Babylon and consumer chain finality providers +func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNode *chain.NodeConfig, babylonFp *bstypes.FinalityProviderResponse, consumerChainFp *bsctypes.FinalityProviderResponse) (*btcec.PublicKey, string) { + // finalise epochs until the registered epoch of the finality provider + // so that the finality provider can receive BTC delegations + // TODO: it is assumed here that babylonFp is registered after consumerChainFp so + // if we finalize registered epoch of babylonFp the other would also get finalized + // ideally we should get registered epoch of each restaked fp and finalize it. + var ( + startEpoch = uint64(1) + endEpoch = babylonFp.RegisteredEpoch + ) + // wait until the end epoch is sealed + s.Eventually(func() bool { + ch, _ := nonValidatorNode.QueryCurrentHeight() + ce, _ := nonValidatorNode.QueryCurrentEpoch() + fmt.Println("current height", ch) + fmt.Println("current epoch", ce) + resp, err := nonValidatorNode.QueryRawCheckpoint(endEpoch) + if err != nil { + if !strings.Contains(err.Error(), "codespace checkpointing code 1201") { + return false + } + } + return resp.Status == ckpttypes.Sealed + }, time.Minute, time.Second*5) + // finalise these epochs + nonValidatorNode.FinalizeSealedEpochs(startEpoch, endEpoch) + + /* + create a random BTC delegation restaking to Babylon and consumer chain finality providers + */ + + delBbnSk := nonValidatorNode.SecretKey + delBtcSk, delBtcPk, _ := datagen.GenRandomBTCKeyPair(r) + + // BTC staking params, BTC delegation key pairs and PoP + params := nonValidatorNode.QueryBTCStakingParams() + + // minimal required unbonding time + unbondingTime := uint16(initialization.BabylonBtcFinalizationPeriod) + 1 + + // get covenant BTC PKs + covenantBTCPKs := []*btcec.PublicKey{} + for _, covenantPK := range params.CovenantPks { + covenantBTCPKs = append(covenantBTCPKs, covenantPK.MustToBTCPK()) + } + // NOTE: we use the node's secret key as Babylon secret key for the BTC delegation + pop, err := bstypes.NewPoP(delBbnSk, delBtcSk) + s.NoError(err) + // generate staking tx and slashing tx + stakingTimeBlocks := uint16(math.MaxUint16) + testStakingInfo := datagen.GenBTCStakingSlashingInfo( + r, + s.T(), + net, + delBtcSk, + []*btcec.PublicKey{babylonFp.BtcPk.MustToBTCPK(), consumerChainFp.BtcPk.MustToBTCPK()}, + covenantBTCPKs, + covenantQuorum, + stakingTimeBlocks, + stakingValue, + params.SlashingAddress, + params.SlashingRate, + unbondingTime, + ) + + stakingMsgTx := testStakingInfo.StakingTx + stakingTxHash := stakingMsgTx.TxHash().String() + stakingSlashingPathInfo, err := testStakingInfo.StakingInfo.SlashingPathSpendInfo() + s.NoError(err) + + // generate proper delegator sig + delegatorSig, err := testStakingInfo.SlashingTx.Sign( + stakingMsgTx, + datagen.StakingOutIdx, + stakingSlashingPathInfo.GetPkScriptPath(), + delBtcSk, + ) + s.NoError(err) + + // submit staking tx to Bitcoin and get inclusion proof + currentBtcTipResp, err := nonValidatorNode.QueryTip() + s.NoError(err) + currentBtcTip, err := chain.ParseBTCHeaderInfoResponseToInfo(currentBtcTipResp) + s.NoError(err) + + blockWithStakingTx := datagen.CreateBlockWithTransaction(r, currentBtcTip.Header.ToBlockHeader(), stakingMsgTx) + nonValidatorNode.InsertHeader(&blockWithStakingTx.HeaderBytes) + // make block k-deep + for i := 0; i < initialization.BabylonBtcConfirmationPeriod; i++ { + nonValidatorNode.InsertNewEmptyBtcHeader(r) + } + stakingTxInfo := btcctypes.NewTransactionInfoFromSpvProof(blockWithStakingTx.SpvProof) + + // generate BTC undelegation stuff + stkTxHash := testStakingInfo.StakingTx.TxHash() + unbondingValue := stakingValue - datagen.UnbondingTxFee // TODO: parameterise fee + testUnbondingInfo := datagen.GenBTCUnbondingSlashingInfo( + r, + s.T(), + net, + delBtcSk, + []*btcec.PublicKey{babylonFp.BtcPk.MustToBTCPK(), consumerChainFp.BtcPk.MustToBTCPK()}, + covenantBTCPKs, + covenantQuorum, + wire.NewOutPoint(&stkTxHash, datagen.StakingOutIdx), + stakingTimeBlocks, + unbondingValue, + params.SlashingAddress, + params.SlashingRate, + unbondingTime, + ) + delUnbondingSlashingSig, err := testUnbondingInfo.GenDelSlashingTxSig(delBtcSk) + s.NoError(err) + + // submit the message for creating BTC delegation + delBTCPKs := []bbn.BIP340PubKey{*bbn.NewBIP340PubKeyFromBTCPK(delBtcPk)} + nonValidatorNode.CreateBTCDelegation( + delBbnSk.PubKey().(*secp256k1.PubKey), + delBTCPKs, + pop, + stakingTxInfo, + []*bbn.BIP340PubKey{babylonFp.BtcPk, consumerChainFp.BtcPk}, + stakingTimeBlocks, + btcutil.Amount(stakingValue), + testStakingInfo.SlashingTx, + delegatorSig, + testUnbondingInfo.UnbondingTx, + testUnbondingInfo.SlashingTx, + uint16(unbondingTime), + btcutil.Amount(unbondingValue), + delUnbondingSlashingSig, + ) + + // wait for a block so that above txs take effect + nonValidatorNode.WaitForNextBlock() + nonValidatorNode.WaitForNextBlock() + + return delBtcPk, stakingTxHash +} diff --git a/test/e2e/configurer/chain/commands_btcstaking.go b/test/e2e/configurer/chain/commands_btcstaking.go index 9dcdae99b..8cef92397 100644 --- a/test/e2e/configurer/chain/commands_btcstaking.go +++ b/test/e2e/configurer/chain/commands_btcstaking.go @@ -46,7 +46,7 @@ func (n *NodeConfig) CreateBTCDelegation( btcPKs []bbn.BIP340PubKey, pop *bstypes.ProofOfPossessionBTC, stakingTxInfo *btcctypes.TransactionInfo, - fpPK *bbn.BIP340PubKey, + fpPKs []*bbn.BIP340PubKey, stakingTimeBlocks uint16, stakingValue btcutil.Amount, slashingTx *bstypes.BTCSlashingTx, @@ -77,7 +77,11 @@ func (n *NodeConfig) CreateBTCDelegation( stakingTxInfoHex, err := stakingTxInfo.ToHexStr() require.NoError(n.t, err) - fpPKHex := fpPK.MarshalHex() + fpPKHexList := make([]string, len(fpPKs)) + for i, fpPK := range fpPKs { + fpPKHexList[i] = fpPK.MarshalHex() + } + fpPKHexes := strings.Join(fpPKHexList, ",") stakingTimeString := sdkmath.NewUint(uint64(stakingTimeBlocks)).String() stakingValueString := sdkmath.NewInt(int64(stakingValue)).String() @@ -98,7 +102,7 @@ func (n *NodeConfig) CreateBTCDelegation( cmd := []string{ "babylond", "tx", "btcstaking", "create-btc-delegation", - btcPKHexListStr, popHex, stakingTxInfoHex, fpPKHex, stakingTimeString, stakingValueString, slashingTxHex, delegatorSigHex, unbondingTxHex, unbondingSlashingTxHex, unbondingTimeStr, unbondingValueStr, delUnbondingSlashingSigHex, + btcPKHexListStr, popHex, stakingTxInfoHex, fpPKHexes, stakingTimeString, stakingValueString, slashingTxHex, delegatorSigHex, unbondingTxHex, unbondingSlashingTxHex, unbondingTimeStr, unbondingValueStr, delUnbondingSlashingSigHex, fmt.Sprintf("--from=%s", fromWalletName), containers.FlagHome, flagKeyringTest, n.FlagChainID(), "--log_format=json", } diff --git a/test/e2e/configurer/chain/commands_btcstaking_integration.go b/test/e2e/configurer/chain/commands_btcstaking_integration.go new file mode 100644 index 000000000..7130f143c --- /dev/null +++ b/test/e2e/configurer/chain/commands_btcstaking_integration.go @@ -0,0 +1,43 @@ +package chain + +import ( + "encoding/hex" + + sdkmath "cosmossdk.io/math" + bbn "github.com/babylonchain/babylon/types" + bstypes "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/stretchr/testify/require" +) + +func (n *NodeConfig) RegisterConsumerChain(chainId, chainName, chainDesc string) { + n.LogActionF("registering consumer chain on babylon") + + cmd := []string{ + "babylond", "tx", "btcstkconsumer", "register-chain", chainId, chainName, chainDesc, "--from=val", + } + _, _, err := n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) + require.NoError(n.t, err) + n.LogActionF("successfully registered consumer chain on babylon") +} + +func (n *NodeConfig) CreateConsumerFinalityProvider(babylonPK *secp256k1.PubKey, btcPK *bbn.BIP340PubKey, pop *bstypes.ProofOfPossession, masterPubRand, consumerChainId, moniker, identity, website, securityContract, details string, commission *sdkmath.LegacyDec) { + n.LogActionF("creating consumer finality provider") + + // get babylon PK hex + babylonPKBytes, err := babylonPK.Marshal() + require.NoError(n.t, err) + babylonPKHex := hex.EncodeToString(babylonPKBytes) + // get BTC PK hex + btcPKHex := btcPK.MarshalHex() + // get pop hex + popHex, err := pop.ToHexStr() + require.NoError(n.t, err) + + cmd := []string{ + "babylond", "tx", "btcstaking", "create-finality-provider", babylonPKHex, btcPKHex, popHex, masterPubRand, "--from=val", "--consumer-chain-id", consumerChainId, "--moniker", moniker, "--identity", identity, "--website", website, "--security-contact", securityContract, "--details", details, "--commission-rate", commission.String(), + } + _, _, err = n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) + require.NoError(n.t, err) + n.LogActionF("successfully created consumer finality provider") +} diff --git a/test/e2e/configurer/chain/queries_btcstaking_integration.go b/test/e2e/configurer/chain/queries_btcstaking_integration.go new file mode 100644 index 000000000..c48b74226 --- /dev/null +++ b/test/e2e/configurer/chain/queries_btcstaking_integration.go @@ -0,0 +1,66 @@ +package chain + +import ( + "encoding/base64" + "fmt" + "net/url" + "strconv" + + "github.com/babylonchain/babylon/test/e2e/util" + bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/stretchr/testify/require" +) + +func (n *NodeConfig) QueryChainRegistryList(pagination *query.PageRequest) *bsctypes.QueryChainRegistryListResponse { + queryParams := url.Values{} + if pagination != nil { + queryParams.Set("pagination.key", base64.URLEncoding.EncodeToString(pagination.Key)) + queryParams.Set("pagination.limit", strconv.Itoa(int(pagination.Limit))) + } + + bz, err := n.QueryGRPCGateway("/babylon/btcstkconsumer/v1/chain_registry_list", queryParams) + require.NoError(n.t, err) + + var resp bsctypes.QueryChainRegistryListResponse + err = util.Cdc.UnmarshalJSON(bz, &resp) + require.NoError(n.t, err) + + return &resp +} + +func (n *NodeConfig) QueryChainRegistry(consumerChainId string) []*bsctypes.ChainRegister { + path := fmt.Sprintf("/babylon/btcstkconsumer/v1/chains_registry/%s", consumerChainId) + bz, err := n.QueryGRPCGateway(path, url.Values{}) + require.NoError(n.t, err) + + var resp bsctypes.QueryChainsRegistryResponse + err = util.Cdc.UnmarshalJSON(bz, &resp) + require.NoError(n.t, err) + + return resp.ChainsRegister +} + +func (n *NodeConfig) QueryConsumerFinalityProviders(consumerChainId string) []*bsctypes.FinalityProviderResponse { + path := fmt.Sprintf("/babylon/btcstkconsumer/v1/finality_providers/%s", consumerChainId) + bz, err := n.QueryGRPCGateway(path, url.Values{}) + require.NoError(n.t, err) + + var resp bsctypes.QueryFinalityProvidersResponse + err = util.Cdc.UnmarshalJSON(bz, &resp) + require.NoError(n.t, err) + + return resp.FinalityProviders +} + +func (n *NodeConfig) QueryConsumerFinalityProvider(consumerChainId, fpBtcPkHex string) *bsctypes.FinalityProviderResponse { + path := fmt.Sprintf("/babylon/btcstkconsumer/v1/finality_provider/%s/%s", consumerChainId, fpBtcPkHex) + bz, err := n.QueryGRPCGateway(path, url.Values{}) + require.NoError(n.t, err) + + var resp bsctypes.QueryFinalityProviderResponse + err = util.Cdc.UnmarshalJSON(bz, &resp) + require.NoError(n.t, err) + + return resp.FinalityProvider +} diff --git a/test/e2e/configurer/factory.go b/test/e2e/configurer/factory.go index bcac549e5..c029c5ddc 100644 --- a/test/e2e/configurer/factory.go +++ b/test/e2e/configurer/factory.go @@ -195,3 +195,19 @@ func NewBTCStakingConfigurer(t *testing.T, isDebugLogEnabled bool) (Configurer, containerManager, ), nil } + +func NewBTCStakingIntegrationConfigurer(t *testing.T, isDebugLogEnabled bool) (Configurer, error) { + containerManager, err := containers.NewManager(isDebugLogEnabled, false) + if err != nil { + return nil, err + } + + return NewCurrentBranchConfigurer(t, + []*chain.Config{ + // we only need 1 chain for testing BTC Staking Integration + chain.New(t, containerManager, initialization.ChainAID, validatorConfigsChainA, nil), + }, + baseSetup, // base set up + containerManager, + ), nil +} diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 4c877c6c8..976a9c7c4 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -35,3 +35,8 @@ func TestBTCTimestampingPhase2RlyTestSuite(t *testing.T) { func TestBTCStakingTestSuite(t *testing.T) { suite.Run(t, new(BTCStakingTestSuite)) } + +// TestBTCStakingIntegrationTestSuite includes btc staking integration related tests +func TestBTCStakingIntegrationTestSuite(t *testing.T) { + suite.Run(t, new(BTCStakingIntegrationTestSuite)) +} diff --git a/x/btcstaking/types/packet.pb.go b/x/btcstaking/types/packet.pb.go index 33e16b674..960dd2771 100644 --- a/x/btcstaking/types/packet.pb.go +++ b/x/btcstaking/types/packet.pb.go @@ -118,7 +118,7 @@ type NewFinalityProvider struct { // the PK follows encoding in BIP-340 spec in hex format BtcPkHex string `protobuf:"bytes,4,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` // pop is the proof of possession of babylon_pk and btc_pk - Pop *ProofOfPossession `protobuf:"bytes,5,opt,name=pop,proto3" json:"pop,omitempty"` + Pop *ProofOfPossessionBTC `protobuf:"bytes,5,opt,name=pop,proto3" json:"pop,omitempty"` // master_pub_rand is the master public randomness of the finality provider // encoded as a base58 string MasterPubRand string `protobuf:"bytes,6,opt,name=master_pub_rand,json=masterPubRand,proto3" json:"master_pub_rand,omitempty"` @@ -198,7 +198,7 @@ func (m *NewFinalityProvider) GetBtcPkHex() string { return "" } -func (m *NewFinalityProvider) GetPop() *ProofOfPossession { +func (m *NewFinalityProvider) GetPop() *ProofOfPossessionBTC { if m != nil { return m.Pop } @@ -685,74 +685,74 @@ func init() { } var fileDescriptor_3ed0d17ad14d6c0e = []byte{ - // 1059 bytes of a gzipped FileDescriptorProto + // 1060 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x6f, 0xe3, 0x44, 0x10, 0xbf, 0x34, 0xe9, 0x9f, 0x4c, 0x92, 0x36, 0x6c, 0xdb, 0x3b, 0x73, 0x07, 0x69, 0xc9, 0x1d, - 0xa7, 0x00, 0x87, 0x43, 0x0b, 0x1c, 0x12, 0x0f, 0x48, 0x4d, 0x7b, 0x55, 0x2b, 0x0a, 0x8d, 0x9c, - 0x14, 0x24, 0x5e, 0xac, 0xb5, 0xbd, 0x49, 0x56, 0x49, 0xbc, 0x96, 0x77, 0x93, 0x26, 0xdf, 0x02, - 0x24, 0x3e, 0x14, 0x8f, 0xf7, 0x08, 0x6f, 0xa8, 0x7d, 0xe1, 0x63, 0x20, 0x8f, 0xd7, 0x89, 0x5b, - 0x92, 0x0a, 0x78, 0xf4, 0xcc, 0x6f, 0x7e, 0x3b, 0xb3, 0xf3, 0x9b, 0x59, 0x43, 0xd5, 0xa1, 0xce, - 0x74, 0x20, 0xfc, 0xba, 0xa3, 0x5c, 0xa9, 0x68, 0x9f, 0xfb, 0xdd, 0xfa, 0xf8, 0xa0, 0x1e, 0x50, - 0xb7, 0xcf, 0x94, 0x19, 0x84, 0x42, 0x09, 0xb2, 0xab, 0x31, 0xe6, 0x1c, 0x63, 0x8e, 0x0f, 0x9e, - 0x56, 0x5d, 0x21, 0x87, 0x42, 0xd6, 0xdd, 0x70, 0x1a, 0x28, 0x51, 0x97, 0xcc, 0x0d, 0x0e, 0xbf, - 0x7c, 0xdd, 0x3f, 0xa8, 0xf7, 0xd9, 0x54, 0xc6, 0xa1, 0x4f, 0x5f, 0x68, 0xcc, 0x9c, 0xda, 0x61, - 0x8a, 0x1e, 0x24, 0xdf, 0x1a, 0xb5, 0xb7, 0x24, 0x09, 0x11, 0x68, 0xc0, 0xcb, 0xc5, 0x80, 0x54, - 0x3e, 0x88, 0xab, 0xfe, 0x92, 0x85, 0xed, 0x46, 0xfb, 0xb8, 0x15, 0x1b, 0xcf, 0x1b, 0xc7, 0x4d, - 0xac, 0x83, 0x1c, 0xc1, 0x9a, 0xcf, 0xae, 0xed, 0x4e, 0x60, 0x64, 0xf6, 0xb3, 0xb5, 0xc2, 0xe1, - 0xc7, 0xe6, 0xc2, 0x92, 0xcc, 0xef, 0xd9, 0xf5, 0x29, 0xf7, 0xe9, 0x80, 0xab, 0x69, 0x33, 0x14, - 0x63, 0xee, 0xb1, 0xd0, 0x5a, 0xf5, 0xd9, 0xf5, 0x69, 0x40, 0xbe, 0x03, 0x90, 0x03, 0x2a, 0x7b, - 0xcc, 0x8b, 0x68, 0x56, 0x90, 0xc6, 0x5c, 0x42, 0xd3, 0x8a, 0x81, 0xff, 0xa0, 0xca, 0x6b, 0x86, - 0xd3, 0x80, 0x9c, 0x03, 0x50, 0x57, 0xf1, 0x31, 0xb3, 0x3d, 0x36, 0x30, 0xb2, 0x0f, 0x66, 0x75, - 0x84, 0xc0, 0x46, 0xfb, 0xf8, 0x84, 0x0d, 0x58, 0x97, 0x2a, 0x2e, 0x7c, 0x2b, 0x1f, 0x47, 0x9f, - 0xb0, 0x01, 0xb9, 0x80, 0x42, 0x92, 0x59, 0xc4, 0x95, 0x43, 0xae, 0x4f, 0x1e, 0x4e, 0xed, 0x2e, - 0x59, 0x52, 0x59, 0xc4, 0x76, 0x09, 0xc5, 0x91, 0xef, 0x08, 0xdf, 0xd3, 0x74, 0xab, 0x48, 0xf7, - 0x6a, 0x09, 0xdd, 0x95, 0x86, 0xde, 0xe5, 0x2b, 0x24, 0x0c, 0x27, 0x6c, 0x50, 0xfd, 0x2b, 0x0b, - 0xdb, 0x0b, 0xee, 0x95, 0xbc, 0x81, 0x82, 0xc7, 0xa4, 0x1b, 0xf2, 0x20, 0x8a, 0x31, 0x32, 0xfb, - 0x99, 0x5a, 0xe1, 0xf0, 0xb9, 0x19, 0x0b, 0xc6, 0x9c, 0x9f, 0x81, 0x82, 0x31, 0x4f, 0xe6, 0x50, - 0x2b, 0x1d, 0x47, 0x2a, 0x00, 0xae, 0x18, 0x0e, 0xb9, 0x94, 0x11, 0xcb, 0xca, 0x7e, 0xa6, 0x96, - 0xb7, 0x52, 0x16, 0xf2, 0x0d, 0x80, 0x4e, 0xdd, 0x0e, 0xfa, 0x46, 0x16, 0x4f, 0xd9, 0x4b, 0x4e, - 0x89, 0xa5, 0x6b, 0xce, 0xa4, 0x6b, 0x36, 0x47, 0xce, 0xb7, 0x6c, 0x6a, 0xe5, 0x75, 0x48, 0xb3, - 0x4f, 0xde, 0x03, 0x70, 0x94, 0x6b, 0x07, 0x7d, 0xbb, 0xc7, 0x26, 0x46, 0x0e, 0xf9, 0x37, 0x1c, - 0xe5, 0x36, 0xfb, 0x67, 0x6c, 0x42, 0xbe, 0x86, 0x6c, 0x20, 0x02, 0x63, 0x15, 0x69, 0x6b, 0x4b, - 0x2e, 0xa9, 0x19, 0x0a, 0xd1, 0xb9, 0xec, 0x34, 0x85, 0x94, 0x0c, 0x93, 0xb2, 0xa2, 0x20, 0xf2, - 0x12, 0xb6, 0x86, 0x54, 0x2a, 0x16, 0xda, 0xc1, 0xc8, 0xb1, 0x43, 0xea, 0x7b, 0xc6, 0x1a, 0xd2, - 0x97, 0x62, 0x73, 0x73, 0xe4, 0x58, 0xd4, 0xf7, 0xc8, 0x47, 0x50, 0x0e, 0x59, 0x97, 0x47, 0x26, - 0xe6, 0xd9, 0x2c, 0x10, 0x6e, 0xcf, 0x58, 0xdf, 0xcf, 0xd4, 0x72, 0xd6, 0xd6, 0xdc, 0xfe, 0x26, - 0x32, 0x93, 0x2f, 0xe0, 0x71, 0x22, 0x85, 0xa4, 0xe8, 0x1e, 0xe3, 0xdd, 0x9e, 0x32, 0x36, 0x30, - 0x60, 0x47, 0x7b, 0x1b, 0xb1, 0xf3, 0x0c, 0x7d, 0xe4, 0x15, 0x90, 0x59, 0x94, 0x72, 0x93, 0x88, - 0x3c, 0x46, 0x94, 0x93, 0x08, 0xe5, 0x6a, 0xf4, 0xbb, 0xb0, 0xe1, 0xf6, 0x28, 0xf7, 0x6d, 0xee, - 0x19, 0x80, 0xf9, 0xae, 0xe3, 0xf7, 0xb9, 0x57, 0xfd, 0x0a, 0x9e, 0x2c, 0x91, 0xfe, 0xbd, 0x6b, - 0xcc, 0xdc, 0xbd, 0xc6, 0xea, 0x1f, 0x39, 0xd8, 0x5e, 0xa0, 0xf2, 0x87, 0xa3, 0xc8, 0x73, 0xd8, - 0xec, 0x04, 0xb6, 0x06, 0x0c, 0xb8, 0x54, 0x38, 0x96, 0x79, 0xab, 0xd0, 0x09, 0x1a, 0x11, 0xe6, - 0x82, 0x4b, 0x45, 0x3e, 0x80, 0xa2, 0x54, 0x34, 0x54, 0x49, 0x59, 0x59, 0x2c, 0xab, 0x80, 0x36, - 0x5d, 0xd1, 0xfb, 0x00, 0xcc, 0xf7, 0x12, 0x40, 0x0e, 0x01, 0x79, 0xe6, 0x7b, 0xda, 0xfd, 0x0c, - 0xf2, 0x4a, 0x28, 0x3a, 0xb0, 0x25, 0x55, 0xd8, 0xe9, 0x9c, 0xb5, 0x81, 0x86, 0x16, 0xc5, 0x58, - 0xdd, 0x69, 0x5b, 0x4d, 0xb0, 0x7f, 0x45, 0x2b, 0xaf, 0x2d, 0xed, 0x09, 0xd9, 0xd3, 0xb3, 0xa9, - 0xfd, 0xeb, 0xe8, 0x87, 0xc4, 0xd4, 0x9e, 0x44, 0x1d, 0xf3, 0xe2, 0x7a, 0x45, 0x68, 0xcf, 0xa0, - 0x92, 0x77, 0xb1, 0x63, 0x45, 0x6b, 0x67, 0xe6, 0x6d, 0x69, 0x67, 0x8b, 0x77, 0xc9, 0x15, 0x94, - 0x5c, 0x31, 0x66, 0x3e, 0xf5, 0x55, 0x84, 0x95, 0x46, 0x1e, 0xa7, 0xf4, 0xb3, 0x25, 0x02, 0x3c, - 0xd6, 0xd8, 0x23, 0x8f, 0x06, 0x11, 0x13, 0xef, 0xfa, 0x54, 0x8d, 0x42, 0x26, 0xad, 0x62, 0x42, - 0xd3, 0xe2, 0x5d, 0x89, 0x42, 0xd0, 0xc5, 0x88, 0x91, 0x0a, 0x46, 0xca, 0xe6, 0xde, 0x04, 0x9b, - 0x5c, 0xb2, 0xca, 0xda, 0x73, 0x89, 0x8e, 0x73, 0x6f, 0x42, 0x3e, 0x84, 0xcd, 0x78, 0xce, 0xb1, - 0x38, 0x3e, 0x64, 0x46, 0x09, 0x91, 0xa5, 0x99, 0xb5, 0xcd, 0x87, 0x8c, 0xfc, 0x08, 0xef, 0x8c, - 0x7c, 0x6f, 0xd6, 0x53, 0x9b, 0xfb, 0x1d, 0x61, 0x6c, 0xe2, 0xc0, 0x2c, 0x5b, 0x78, 0x8d, 0xf6, - 0xf1, 0x55, 0x2a, 0xe4, 0xdc, 0xef, 0x08, 0xab, 0x3c, 0xba, 0x67, 0x89, 0xce, 0x0f, 0x68, 0x48, - 0x87, 0xd2, 0x1e, 0xb3, 0x10, 0xa7, 0x7f, 0x2b, 0x3e, 0x3f, 0xb6, 0xfe, 0x10, 0x1b, 0xab, 0xbf, - 0xc6, 0x6f, 0xc2, 0x7d, 0xc2, 0x48, 0x18, 0xa9, 0xf4, 0x63, 0x75, 0x15, 0x93, 0xd5, 0x15, 0x37, - 0xe7, 0x35, 0x3c, 0x99, 0x37, 0x67, 0x0e, 0x8e, 0xba, 0xb3, 0x82, 0xe8, 0xdd, 0x99, 0xfb, 0x2a, - 0xf1, 0x46, 0xed, 0x71, 0xe1, 0xd9, 0xac, 0x3d, 0x77, 0xc2, 0x62, 0x95, 0xc6, 0xdb, 0xfe, 0xc5, - 0xb2, 0x0d, 0x9d, 0x74, 0x07, 0xcb, 0x36, 0x12, 0xa2, 0xf4, 0x01, 0x28, 0xec, 0x7b, 0xd2, 0xca, - 0xfd, 0x07, 0x69, 0xad, 0x3e, 0x20, 0xad, 0x0e, 0x3c, 0x9e, 0x4b, 0x2b, 0x15, 0x24, 0x8d, 0xb5, - 0xff, 0xa9, 0xb1, 0x9d, 0x99, 0xc6, 0xe6, 0xc7, 0xc8, 0xea, 0x10, 0x76, 0x16, 0xbd, 0x45, 0xd1, - 0x56, 0x9c, 0x0f, 0x94, 0xdd, 0xa3, 0xb2, 0xa7, 0xe7, 0xbe, 0x34, 0x9b, 0xaa, 0x33, 0x2a, 0x7b, - 0xe4, 0x53, 0xd8, 0x0e, 0x59, 0xc4, 0x1c, 0xe2, 0x8b, 0x8c, 0x6b, 0x40, 0xf6, 0xf5, 0x03, 0x50, - 0x9e, 0xb9, 0x4e, 0xa3, 0x55, 0xd0, 0xea, 0x57, 0x39, 0xec, 0x2e, 0x7c, 0xab, 0xfe, 0xf5, 0x79, - 0x35, 0x28, 0xa7, 0xe5, 0x92, 0x12, 0xc1, 0x66, 0x4a, 0x32, 0x2d, 0xde, 0x6d, 0x5c, 0xfc, 0x76, - 0x53, 0xc9, 0xbc, 0xbd, 0xa9, 0x64, 0xfe, 0xbc, 0xa9, 0x64, 0x7e, 0xbe, 0xad, 0x3c, 0x7a, 0x7b, - 0x5b, 0x79, 0xf4, 0xfb, 0x6d, 0xe5, 0xd1, 0x4f, 0x87, 0x5d, 0xae, 0x7a, 0x23, 0xc7, 0x74, 0xc5, - 0xb0, 0xae, 0x6f, 0x11, 0x57, 0x67, 0xf2, 0x51, 0x9f, 0xa4, 0x7f, 0x70, 0xd4, 0x34, 0x60, 0xd2, - 0x59, 0xc3, 0x3f, 0x9b, 0xcf, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x80, 0xc3, 0x6c, 0xac, 0xa9, - 0x09, 0x00, 0x00, + 0xa7, 0x02, 0x87, 0x43, 0x0b, 0x1c, 0x4f, 0x20, 0x35, 0xe9, 0x55, 0xad, 0x28, 0x34, 0x72, 0x52, + 0x90, 0x78, 0xb1, 0xd6, 0xf6, 0x26, 0x59, 0x25, 0xf1, 0x5a, 0xde, 0x4d, 0x9a, 0x7c, 0x0b, 0x90, + 0xf8, 0x50, 0x3c, 0xde, 0x23, 0xbc, 0xa1, 0xf6, 0x91, 0x2f, 0x81, 0x3c, 0x5e, 0x27, 0x6e, 0x49, + 0x2a, 0xe0, 0xd1, 0x33, 0xbf, 0xf9, 0xcd, 0xcc, 0xce, 0x6f, 0x67, 0x0d, 0x55, 0x87, 0x3a, 0xd3, + 0x81, 0xf0, 0x6b, 0x8e, 0x72, 0xa5, 0xa2, 0x7d, 0xee, 0x77, 0x6b, 0xe3, 0xc3, 0x5a, 0x40, 0xdd, + 0x3e, 0x53, 0x66, 0x10, 0x0a, 0x25, 0xc8, 0xae, 0xc6, 0x98, 0x73, 0x8c, 0x39, 0x3e, 0x7c, 0x5a, + 0x75, 0x85, 0x1c, 0x0a, 0x59, 0x73, 0xc3, 0x69, 0xa0, 0x44, 0x4d, 0x32, 0x37, 0x38, 0xfa, 0xf2, + 0x75, 0xff, 0xb0, 0xd6, 0x67, 0x53, 0x19, 0x87, 0x3e, 0x7d, 0xa1, 0x31, 0x73, 0x6a, 0x87, 0x29, + 0x7a, 0x98, 0x7c, 0x6b, 0xd4, 0xde, 0x92, 0x22, 0x44, 0xa0, 0x01, 0x2f, 0x17, 0x03, 0x52, 0xf5, + 0x20, 0xae, 0xfa, 0x4b, 0x16, 0xb6, 0xeb, 0xed, 0x46, 0x2b, 0x36, 0x9e, 0xd7, 0x1b, 0x4d, 0xec, + 0x83, 0x1c, 0xc3, 0x9a, 0xcf, 0xae, 0xed, 0x4e, 0x60, 0x64, 0xf6, 0xb3, 0x07, 0x85, 0xa3, 0x8f, + 0xcd, 0x85, 0x2d, 0x99, 0xdf, 0xb3, 0xeb, 0x53, 0xee, 0xd3, 0x01, 0x57, 0xd3, 0x66, 0x28, 0xc6, + 0xdc, 0x63, 0xa1, 0xb5, 0xea, 0xb3, 0xeb, 0xd3, 0x80, 0x7c, 0x07, 0x20, 0x07, 0x54, 0xf6, 0x98, + 0x17, 0xd1, 0xac, 0x20, 0x8d, 0xb9, 0x84, 0xa6, 0x15, 0x03, 0xff, 0x41, 0x95, 0xd7, 0x0c, 0xa7, + 0x01, 0x39, 0x07, 0xa0, 0xae, 0xe2, 0x63, 0x66, 0x7b, 0x6c, 0x60, 0x64, 0x1f, 0xac, 0xea, 0x18, + 0x81, 0xf5, 0x76, 0xe3, 0x84, 0x0d, 0x58, 0x97, 0x2a, 0x2e, 0x7c, 0x2b, 0x1f, 0x47, 0x9f, 0xb0, + 0x01, 0xb9, 0x80, 0x42, 0x52, 0x59, 0xc4, 0x95, 0x43, 0xae, 0x4f, 0x1e, 0x2e, 0xed, 0x2e, 0x59, + 0xd2, 0x59, 0xc4, 0x76, 0x09, 0xc5, 0x91, 0xef, 0x08, 0xdf, 0xd3, 0x74, 0xab, 0x48, 0xf7, 0x6a, + 0x09, 0xdd, 0x95, 0x86, 0xde, 0xe5, 0x2b, 0x24, 0x0c, 0x27, 0x6c, 0x50, 0xfd, 0x2b, 0x0b, 0xdb, + 0x0b, 0xce, 0x95, 0xbc, 0x81, 0x82, 0xc7, 0xa4, 0x1b, 0xf2, 0x20, 0x8a, 0x31, 0x32, 0xfb, 0x99, + 0x83, 0xc2, 0xd1, 0x73, 0x33, 0x16, 0x8c, 0x39, 0xcf, 0x81, 0x82, 0x31, 0x4f, 0xe6, 0x50, 0x2b, + 0x1d, 0x47, 0x2a, 0x00, 0xae, 0x18, 0x0e, 0xb9, 0x94, 0x11, 0xcb, 0xca, 0x7e, 0xe6, 0x20, 0x6f, + 0xa5, 0x2c, 0xe4, 0x1b, 0x00, 0x5d, 0xba, 0x1d, 0xf4, 0x8d, 0x2c, 0x66, 0xd9, 0x4b, 0xb2, 0xc4, + 0xd2, 0x35, 0x67, 0xd2, 0x35, 0x9b, 0x23, 0xe7, 0x5b, 0x36, 0xb5, 0xf2, 0x3a, 0xa4, 0xd9, 0x27, + 0xef, 0x01, 0x38, 0xca, 0xb5, 0x83, 0xbe, 0xdd, 0x63, 0x13, 0x23, 0x87, 0xfc, 0x1b, 0x8e, 0x72, + 0x9b, 0xfd, 0x33, 0x36, 0x21, 0x5f, 0x43, 0x36, 0x10, 0x81, 0xb1, 0x8a, 0xb4, 0xcb, 0xce, 0xbc, + 0x19, 0x0a, 0xd1, 0xb9, 0xec, 0x34, 0x85, 0x94, 0x0c, 0x8b, 0xaa, 0xb7, 0x1b, 0x56, 0x14, 0x47, + 0x5e, 0xc2, 0xd6, 0x90, 0x4a, 0xc5, 0x42, 0x3b, 0x18, 0x39, 0x76, 0x48, 0x7d, 0xcf, 0x58, 0xc3, + 0x0c, 0xa5, 0xd8, 0xdc, 0x1c, 0x39, 0x16, 0xf5, 0x3d, 0xf2, 0x11, 0x94, 0x43, 0xd6, 0xe5, 0x91, + 0x89, 0x79, 0x36, 0x0b, 0x84, 0xdb, 0x33, 0xd6, 0xf7, 0x33, 0x07, 0x39, 0x6b, 0x6b, 0x6e, 0x7f, + 0x13, 0x99, 0xc9, 0x17, 0xf0, 0x38, 0x51, 0x43, 0xd2, 0x77, 0x8f, 0xf1, 0x6e, 0x4f, 0x19, 0x1b, + 0x18, 0xb0, 0xa3, 0xbd, 0xf5, 0xd8, 0x79, 0x86, 0x3e, 0xf2, 0x0a, 0xc8, 0x2c, 0x4a, 0xb9, 0x49, + 0x44, 0x1e, 0x23, 0xca, 0x49, 0x84, 0x72, 0x35, 0xfa, 0x5d, 0xd8, 0x70, 0x7b, 0x94, 0xfb, 0x36, + 0xf7, 0x0c, 0xc0, 0x7a, 0xd7, 0xf1, 0xfb, 0xdc, 0xab, 0x7e, 0x05, 0x4f, 0x96, 0xa8, 0xff, 0xde, + 0x49, 0x66, 0xee, 0x9e, 0x64, 0xf5, 0x8f, 0x1c, 0x6c, 0x2f, 0x10, 0xfa, 0xc3, 0x51, 0xe4, 0x39, + 0x6c, 0x76, 0x02, 0x5b, 0x03, 0x06, 0x5c, 0x2a, 0xbc, 0x99, 0x79, 0xab, 0xd0, 0x09, 0xea, 0x11, + 0xe6, 0x82, 0x4b, 0x45, 0x3e, 0x80, 0xa2, 0x54, 0x34, 0x54, 0x49, 0x5b, 0x59, 0x6c, 0xab, 0x80, + 0x36, 0xdd, 0xd1, 0xfb, 0x00, 0xcc, 0xf7, 0x12, 0x40, 0x0e, 0x01, 0x79, 0xe6, 0x7b, 0xda, 0xfd, + 0x0c, 0xf2, 0x4a, 0x28, 0x3a, 0xb0, 0x25, 0x55, 0x38, 0xec, 0x9c, 0xb5, 0x81, 0x86, 0x16, 0xc5, + 0x58, 0x3d, 0x6c, 0x5b, 0x4d, 0x70, 0x7e, 0x45, 0x2b, 0xaf, 0x2d, 0xed, 0x09, 0xd9, 0xd3, 0xd7, + 0x53, 0xfb, 0xd7, 0xd1, 0x0f, 0x89, 0xa9, 0x3d, 0x89, 0x26, 0xe6, 0xc5, 0xfd, 0x8a, 0xd0, 0x9e, + 0x41, 0x25, 0xef, 0xe2, 0xc4, 0x8a, 0xd6, 0xce, 0xcc, 0xdb, 0xd2, 0xce, 0x16, 0xef, 0x92, 0x2b, + 0x28, 0xb9, 0x62, 0xcc, 0x7c, 0xea, 0xab, 0x08, 0x2b, 0x8d, 0x3c, 0x5e, 0xd4, 0xcf, 0x96, 0x68, + 0xb0, 0xa1, 0xb1, 0xc7, 0x1e, 0x0d, 0x22, 0x26, 0xde, 0xf5, 0xa9, 0x1a, 0x85, 0x4c, 0x5a, 0xc5, + 0x84, 0xa6, 0xc5, 0xbb, 0x12, 0x85, 0xa0, 0x9b, 0x11, 0x23, 0x15, 0x8c, 0x94, 0xcd, 0xbd, 0x09, + 0x0e, 0xb9, 0x64, 0x95, 0xb5, 0xe7, 0x12, 0x1d, 0xe7, 0xde, 0x84, 0x7c, 0x08, 0x9b, 0xf1, 0x55, + 0xc7, 0xe6, 0xf8, 0x90, 0x19, 0x25, 0x44, 0x96, 0x66, 0xd6, 0x36, 0x1f, 0x32, 0xf2, 0x23, 0xbc, + 0x33, 0xf2, 0xbd, 0xd9, 0x4c, 0x6d, 0xee, 0x77, 0x84, 0xb1, 0x89, 0x77, 0x66, 0xd9, 0xce, 0xab, + 0xb7, 0x1b, 0x57, 0xa9, 0x90, 0x73, 0xbf, 0x23, 0xac, 0xf2, 0xe8, 0x9e, 0x25, 0xca, 0x1f, 0xd0, + 0x90, 0x0e, 0xa5, 0x3d, 0x66, 0x21, 0x2e, 0x80, 0xad, 0x38, 0x7f, 0x6c, 0xfd, 0x21, 0x36, 0x56, + 0x7f, 0x8d, 0x9f, 0x85, 0xfb, 0x84, 0x91, 0x30, 0x52, 0xe5, 0xc7, 0xea, 0x2a, 0x26, 0xdb, 0x2b, + 0x1e, 0xce, 0x6b, 0x78, 0x32, 0x1f, 0xce, 0x1c, 0x1c, 0x4d, 0x67, 0x05, 0xd1, 0xbb, 0x33, 0xf7, + 0x55, 0xe2, 0x8d, 0xc6, 0xe3, 0xc2, 0xb3, 0xd9, 0x78, 0xee, 0x84, 0xc5, 0x2a, 0x8d, 0x17, 0xfe, + 0x8b, 0x65, 0x4b, 0x3a, 0x99, 0x0e, 0xb6, 0x6d, 0x24, 0x44, 0xe9, 0x04, 0x28, 0xec, 0x7b, 0xd2, + 0xca, 0xfd, 0x07, 0x69, 0xad, 0x3e, 0x20, 0xad, 0x0e, 0x3c, 0x9e, 0x4b, 0x2b, 0x15, 0x24, 0x8d, + 0xb5, 0xff, 0xa9, 0xb1, 0x9d, 0x99, 0xc6, 0xe6, 0x69, 0x64, 0x75, 0x08, 0x3b, 0x8b, 0x9e, 0xa3, + 0x68, 0x2b, 0xce, 0x2f, 0x94, 0xdd, 0xa3, 0xb2, 0xa7, 0xef, 0x7d, 0x69, 0x76, 0xab, 0xce, 0xa8, + 0xec, 0x91, 0x4f, 0x61, 0x3b, 0x64, 0x11, 0x73, 0x88, 0x8f, 0x32, 0xae, 0x01, 0xd9, 0xd7, 0x6f, + 0x40, 0x79, 0xe6, 0x3a, 0x8d, 0x56, 0x41, 0xab, 0x5f, 0xe5, 0xb0, 0xbb, 0xf0, 0xb9, 0xfa, 0xd7, + 0xf9, 0x0e, 0xa0, 0x9c, 0x96, 0x4b, 0x4a, 0x04, 0x9b, 0x29, 0xc9, 0xb4, 0x78, 0xb7, 0x7e, 0xf1, + 0xdb, 0x4d, 0x25, 0xf3, 0xf6, 0xa6, 0x92, 0xf9, 0xf3, 0xa6, 0x92, 0xf9, 0xf9, 0xb6, 0xf2, 0xe8, + 0xed, 0x6d, 0xe5, 0xd1, 0xef, 0xb7, 0x95, 0x47, 0x3f, 0x1d, 0x75, 0xb9, 0xea, 0x8d, 0x1c, 0xd3, + 0x15, 0xc3, 0x9a, 0x3e, 0x45, 0x5c, 0x9d, 0xc9, 0x47, 0x6d, 0x92, 0xfe, 0xc7, 0x51, 0xd3, 0x80, + 0x49, 0x67, 0x0d, 0x7f, 0x6e, 0x3e, 0xff, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x1c, 0xe7, 0x29, + 0xac, 0x09, 0x00, 0x00, } func (m *BTCStakingIBCPacket) Marshal() (dAtA []byte, err error) { @@ -1909,7 +1909,7 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Pop == nil { - m.Pop = &ProofOfPossession{} + m.Pop = &ProofOfPossessionBTC{} } if err := m.Pop.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err From 27f70726017361633a50c22d7ecff89f404bf22c Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Thu, 25 Apr 2024 13:57:35 +0800 Subject: [PATCH 18/85] chore: fix some proto formats for IBC packets (#234) --- proto/babylon/btcstaking/v1/packet.proto | 12 +- test/e2e/btc_staking_integration_e2e_test.go | 4 +- test/e2e/configurer/chain/queries.go | 4 +- x/btcstaking/types/packet.pb.go | 198 ++++++++++++------- 4 files changed, 139 insertions(+), 79 deletions(-) diff --git a/proto/babylon/btcstaking/v1/packet.proto b/proto/babylon/btcstaking/v1/packet.proto index aac3736e1..fc3699d40 100644 --- a/proto/babylon/btcstaking/v1/packet.proto +++ b/proto/babylon/btcstaking/v1/packet.proto @@ -59,6 +59,9 @@ message SlashedFinalityProvider { // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider // the PK follows encoding in BIP-340 spec in hex format string btc_pk_hex = 1; + // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing + // this allows the consumer chain to verify the BTC delegation is indeed slashed + string recovered_fp_btc_sk = 2; } // ActiveBTCDelegation is an IBC packet sent from Babylon to consumer chain @@ -129,13 +132,14 @@ message BTCUndelegationInfo { repeated CovenantAdaptorSignatures covenant_slashing_sigs = 6; } -// SlashedBTCDelegation is an IBC packet sent upon a slashed BTC delegation -// Slashing can happen on both Babylon and consumer chain, so both of them could -// send this packet to each other +// SlashedBTCDelegation is an IBC packet sent from Babylon to consumer chain +// about a slashed BTC delegation restaked to >=1 of this consumer chain's +// finality provider message SlashedBTCDelegation { // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation string staking_tx_hash = 1; - // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing + // recovered_fp_btc_sk is the extracted BTC SK of the finality provider on + // this consumer chain // this allows the consumer chain to verify the BTC delegation is indeed slashed string recovered_fp_btc_sk = 2; } diff --git a/test/e2e/btc_staking_integration_e2e_test.go b/test/e2e/btc_staking_integration_e2e_test.go index e1a699bea..485ab0b8b 100644 --- a/test/e2e/btc_staking_integration_e2e_test.go +++ b/test/e2e/btc_staking_integration_e2e_test.go @@ -1,9 +1,9 @@ package e2e import ( + "errors" "fmt" "math" - "strings" "time" "github.com/babylonchain/babylon/crypto/eots" @@ -219,7 +219,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod fmt.Println("current epoch", ce) resp, err := nonValidatorNode.QueryRawCheckpoint(endEpoch) if err != nil { - if !strings.Contains(err.Error(), "codespace checkpointing code 1201") { + if !errors.Is(err, ckpttypes.ErrCkptDoesNotExist) { return false } } diff --git a/test/e2e/configurer/chain/queries.go b/test/e2e/configurer/chain/queries.go index c0bb049f8..76a6b40c6 100644 --- a/test/e2e/configurer/chain/queries.go +++ b/test/e2e/configurer/chain/queries.go @@ -178,7 +178,9 @@ func (n *NodeConfig) QueryListSnapshots() ([]*cmtabcitypes.Snapshot, error) { func (n *NodeConfig) QueryRawCheckpoint(epoch uint64) (*ct.RawCheckpointWithMetaResponse, error) { path := fmt.Sprintf("babylon/checkpointing/v1/raw_checkpoint/%d", epoch) bz, err := n.QueryGRPCGateway(path, url.Values{}) - require.NoError(n.t, err) + if err != nil { + return nil, err + } var checkpointingResponse ct.QueryRawCheckpointResponse if err := util.Cdc.UnmarshalJSON(bz, &checkpointingResponse); err != nil { diff --git a/x/btcstaking/types/packet.pb.go b/x/btcstaking/types/packet.pb.go index 960dd2771..f26367363 100644 --- a/x/btcstaking/types/packet.pb.go +++ b/x/btcstaking/types/packet.pb.go @@ -246,6 +246,9 @@ type SlashedFinalityProvider struct { // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider // the PK follows encoding in BIP-340 spec in hex format BtcPkHex string `protobuf:"bytes,1,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` + // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing + // this allows the consumer chain to verify the BTC delegation is indeed slashed + RecoveredFpBtcSk string `protobuf:"bytes,2,opt,name=recovered_fp_btc_sk,json=recoveredFpBtcSk,proto3" json:"recovered_fp_btc_sk,omitempty"` } func (m *SlashedFinalityProvider) Reset() { *m = SlashedFinalityProvider{} } @@ -288,6 +291,13 @@ func (m *SlashedFinalityProvider) GetBtcPkHex() string { return "" } +func (m *SlashedFinalityProvider) GetRecoveredFpBtcSk() string { + if m != nil { + return m.RecoveredFpBtcSk + } + return "" +} + // ActiveBTCDelegation is an IBC packet sent from Babylon to consumer chain // upon a BTC delegation newly receives covenant signatures and thus becomes active type ActiveBTCDelegation struct { @@ -555,13 +565,14 @@ func (m *BTCUndelegationInfo) GetCovenantSlashingSigs() []*CovenantAdaptorSignat return nil } -// SlashedBTCDelegation is an IBC packet sent upon a slashed BTC delegation -// Slashing can happen on both Babylon and consumer chain, so both of them could -// send this packet to each other +// SlashedBTCDelegation is an IBC packet sent from Babylon to consumer chain +// about a slashed BTC delegation restaked to >=1 of this consumer chain's +// finality provider type SlashedBTCDelegation struct { // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation StakingTxHash string `protobuf:"bytes,1,opt,name=staking_tx_hash,json=stakingTxHash,proto3" json:"staking_tx_hash,omitempty"` - // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing + // recovered_fp_btc_sk is the extracted BTC SK of the finality provider on + // this consumer chain // this allows the consumer chain to verify the BTC delegation is indeed slashed RecoveredFpBtcSk string `protobuf:"bytes,2,opt,name=recovered_fp_btc_sk,json=recoveredFpBtcSk,proto3" json:"recovered_fp_btc_sk,omitempty"` } @@ -685,74 +696,74 @@ func init() { } var fileDescriptor_3ed0d17ad14d6c0e = []byte{ - // 1060 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x6f, 0xe3, 0x44, - 0x10, 0xbf, 0x34, 0xe9, 0x9f, 0x4c, 0x92, 0x36, 0x6c, 0xdb, 0x3b, 0x73, 0x07, 0x69, 0xc9, 0x1d, - 0xa7, 0x02, 0x87, 0x43, 0x0b, 0x1c, 0x4f, 0x20, 0x35, 0xe9, 0x55, 0xad, 0x28, 0x34, 0x72, 0x52, - 0x90, 0x78, 0xb1, 0xd6, 0xf6, 0x26, 0x59, 0x25, 0xf1, 0x5a, 0xde, 0x4d, 0x9a, 0x7c, 0x0b, 0x90, - 0xf8, 0x50, 0x3c, 0xde, 0x23, 0xbc, 0xa1, 0xf6, 0x91, 0x2f, 0x81, 0x3c, 0x5e, 0x27, 0x6e, 0x49, - 0x2a, 0xe0, 0xd1, 0x33, 0xbf, 0xf9, 0xcd, 0xcc, 0xce, 0x6f, 0x67, 0x0d, 0x55, 0x87, 0x3a, 0xd3, - 0x81, 0xf0, 0x6b, 0x8e, 0x72, 0xa5, 0xa2, 0x7d, 0xee, 0x77, 0x6b, 0xe3, 0xc3, 0x5a, 0x40, 0xdd, - 0x3e, 0x53, 0x66, 0x10, 0x0a, 0x25, 0xc8, 0xae, 0xc6, 0x98, 0x73, 0x8c, 0x39, 0x3e, 0x7c, 0x5a, - 0x75, 0x85, 0x1c, 0x0a, 0x59, 0x73, 0xc3, 0x69, 0xa0, 0x44, 0x4d, 0x32, 0x37, 0x38, 0xfa, 0xf2, - 0x75, 0xff, 0xb0, 0xd6, 0x67, 0x53, 0x19, 0x87, 0x3e, 0x7d, 0xa1, 0x31, 0x73, 0x6a, 0x87, 0x29, - 0x7a, 0x98, 0x7c, 0x6b, 0xd4, 0xde, 0x92, 0x22, 0x44, 0xa0, 0x01, 0x2f, 0x17, 0x03, 0x52, 0xf5, - 0x20, 0xae, 0xfa, 0x4b, 0x16, 0xb6, 0xeb, 0xed, 0x46, 0x2b, 0x36, 0x9e, 0xd7, 0x1b, 0x4d, 0xec, - 0x83, 0x1c, 0xc3, 0x9a, 0xcf, 0xae, 0xed, 0x4e, 0x60, 0x64, 0xf6, 0xb3, 0x07, 0x85, 0xa3, 0x8f, - 0xcd, 0x85, 0x2d, 0x99, 0xdf, 0xb3, 0xeb, 0x53, 0xee, 0xd3, 0x01, 0x57, 0xd3, 0x66, 0x28, 0xc6, - 0xdc, 0x63, 0xa1, 0xb5, 0xea, 0xb3, 0xeb, 0xd3, 0x80, 0x7c, 0x07, 0x20, 0x07, 0x54, 0xf6, 0x98, - 0x17, 0xd1, 0xac, 0x20, 0x8d, 0xb9, 0x84, 0xa6, 0x15, 0x03, 0xff, 0x41, 0x95, 0xd7, 0x0c, 0xa7, - 0x01, 0x39, 0x07, 0xa0, 0xae, 0xe2, 0x63, 0x66, 0x7b, 0x6c, 0x60, 0x64, 0x1f, 0xac, 0xea, 0x18, - 0x81, 0xf5, 0x76, 0xe3, 0x84, 0x0d, 0x58, 0x97, 0x2a, 0x2e, 0x7c, 0x2b, 0x1f, 0x47, 0x9f, 0xb0, - 0x01, 0xb9, 0x80, 0x42, 0x52, 0x59, 0xc4, 0x95, 0x43, 0xae, 0x4f, 0x1e, 0x2e, 0xed, 0x2e, 0x59, - 0xd2, 0x59, 0xc4, 0x76, 0x09, 0xc5, 0x91, 0xef, 0x08, 0xdf, 0xd3, 0x74, 0xab, 0x48, 0xf7, 0x6a, - 0x09, 0xdd, 0x95, 0x86, 0xde, 0xe5, 0x2b, 0x24, 0x0c, 0x27, 0x6c, 0x50, 0xfd, 0x2b, 0x0b, 0xdb, - 0x0b, 0xce, 0x95, 0xbc, 0x81, 0x82, 0xc7, 0xa4, 0x1b, 0xf2, 0x20, 0x8a, 0x31, 0x32, 0xfb, 0x99, - 0x83, 0xc2, 0xd1, 0x73, 0x33, 0x16, 0x8c, 0x39, 0xcf, 0x81, 0x82, 0x31, 0x4f, 0xe6, 0x50, 0x2b, - 0x1d, 0x47, 0x2a, 0x00, 0xae, 0x18, 0x0e, 0xb9, 0x94, 0x11, 0xcb, 0xca, 0x7e, 0xe6, 0x20, 0x6f, - 0xa5, 0x2c, 0xe4, 0x1b, 0x00, 0x5d, 0xba, 0x1d, 0xf4, 0x8d, 0x2c, 0x66, 0xd9, 0x4b, 0xb2, 0xc4, - 0xd2, 0x35, 0x67, 0xd2, 0x35, 0x9b, 0x23, 0xe7, 0x5b, 0x36, 0xb5, 0xf2, 0x3a, 0xa4, 0xd9, 0x27, - 0xef, 0x01, 0x38, 0xca, 0xb5, 0x83, 0xbe, 0xdd, 0x63, 0x13, 0x23, 0x87, 0xfc, 0x1b, 0x8e, 0x72, - 0x9b, 0xfd, 0x33, 0x36, 0x21, 0x5f, 0x43, 0x36, 0x10, 0x81, 0xb1, 0x8a, 0xb4, 0xcb, 0xce, 0xbc, - 0x19, 0x0a, 0xd1, 0xb9, 0xec, 0x34, 0x85, 0x94, 0x0c, 0x8b, 0xaa, 0xb7, 0x1b, 0x56, 0x14, 0x47, - 0x5e, 0xc2, 0xd6, 0x90, 0x4a, 0xc5, 0x42, 0x3b, 0x18, 0x39, 0x76, 0x48, 0x7d, 0xcf, 0x58, 0xc3, - 0x0c, 0xa5, 0xd8, 0xdc, 0x1c, 0x39, 0x16, 0xf5, 0x3d, 0xf2, 0x11, 0x94, 0x43, 0xd6, 0xe5, 0x91, - 0x89, 0x79, 0x36, 0x0b, 0x84, 0xdb, 0x33, 0xd6, 0xf7, 0x33, 0x07, 0x39, 0x6b, 0x6b, 0x6e, 0x7f, - 0x13, 0x99, 0xc9, 0x17, 0xf0, 0x38, 0x51, 0x43, 0xd2, 0x77, 0x8f, 0xf1, 0x6e, 0x4f, 0x19, 0x1b, - 0x18, 0xb0, 0xa3, 0xbd, 0xf5, 0xd8, 0x79, 0x86, 0x3e, 0xf2, 0x0a, 0xc8, 0x2c, 0x4a, 0xb9, 0x49, - 0x44, 0x1e, 0x23, 0xca, 0x49, 0x84, 0x72, 0x35, 0xfa, 0x5d, 0xd8, 0x70, 0x7b, 0x94, 0xfb, 0x36, - 0xf7, 0x0c, 0xc0, 0x7a, 0xd7, 0xf1, 0xfb, 0xdc, 0xab, 0x7e, 0x05, 0x4f, 0x96, 0xa8, 0xff, 0xde, - 0x49, 0x66, 0xee, 0x9e, 0x64, 0xf5, 0x8f, 0x1c, 0x6c, 0x2f, 0x10, 0xfa, 0xc3, 0x51, 0xe4, 0x39, - 0x6c, 0x76, 0x02, 0x5b, 0x03, 0x06, 0x5c, 0x2a, 0xbc, 0x99, 0x79, 0xab, 0xd0, 0x09, 0xea, 0x11, - 0xe6, 0x82, 0x4b, 0x45, 0x3e, 0x80, 0xa2, 0x54, 0x34, 0x54, 0x49, 0x5b, 0x59, 0x6c, 0xab, 0x80, - 0x36, 0xdd, 0xd1, 0xfb, 0x00, 0xcc, 0xf7, 0x12, 0x40, 0x0e, 0x01, 0x79, 0xe6, 0x7b, 0xda, 0xfd, - 0x0c, 0xf2, 0x4a, 0x28, 0x3a, 0xb0, 0x25, 0x55, 0x38, 0xec, 0x9c, 0xb5, 0x81, 0x86, 0x16, 0xc5, - 0x58, 0x3d, 0x6c, 0x5b, 0x4d, 0x70, 0x7e, 0x45, 0x2b, 0xaf, 0x2d, 0xed, 0x09, 0xd9, 0xd3, 0xd7, - 0x53, 0xfb, 0xd7, 0xd1, 0x0f, 0x89, 0xa9, 0x3d, 0x89, 0x26, 0xe6, 0xc5, 0xfd, 0x8a, 0xd0, 0x9e, - 0x41, 0x25, 0xef, 0xe2, 0xc4, 0x8a, 0xd6, 0xce, 0xcc, 0xdb, 0xd2, 0xce, 0x16, 0xef, 0x92, 0x2b, - 0x28, 0xb9, 0x62, 0xcc, 0x7c, 0xea, 0xab, 0x08, 0x2b, 0x8d, 0x3c, 0x5e, 0xd4, 0xcf, 0x96, 0x68, - 0xb0, 0xa1, 0xb1, 0xc7, 0x1e, 0x0d, 0x22, 0x26, 0xde, 0xf5, 0xa9, 0x1a, 0x85, 0x4c, 0x5a, 0xc5, - 0x84, 0xa6, 0xc5, 0xbb, 0x12, 0x85, 0xa0, 0x9b, 0x11, 0x23, 0x15, 0x8c, 0x94, 0xcd, 0xbd, 0x09, - 0x0e, 0xb9, 0x64, 0x95, 0xb5, 0xe7, 0x12, 0x1d, 0xe7, 0xde, 0x84, 0x7c, 0x08, 0x9b, 0xf1, 0x55, - 0xc7, 0xe6, 0xf8, 0x90, 0x19, 0x25, 0x44, 0x96, 0x66, 0xd6, 0x36, 0x1f, 0x32, 0xf2, 0x23, 0xbc, - 0x33, 0xf2, 0xbd, 0xd9, 0x4c, 0x6d, 0xee, 0x77, 0x84, 0xb1, 0x89, 0x77, 0x66, 0xd9, 0xce, 0xab, - 0xb7, 0x1b, 0x57, 0xa9, 0x90, 0x73, 0xbf, 0x23, 0xac, 0xf2, 0xe8, 0x9e, 0x25, 0xca, 0x1f, 0xd0, - 0x90, 0x0e, 0xa5, 0x3d, 0x66, 0x21, 0x2e, 0x80, 0xad, 0x38, 0x7f, 0x6c, 0xfd, 0x21, 0x36, 0x56, - 0x7f, 0x8d, 0x9f, 0x85, 0xfb, 0x84, 0x91, 0x30, 0x52, 0xe5, 0xc7, 0xea, 0x2a, 0x26, 0xdb, 0x2b, - 0x1e, 0xce, 0x6b, 0x78, 0x32, 0x1f, 0xce, 0x1c, 0x1c, 0x4d, 0x67, 0x05, 0xd1, 0xbb, 0x33, 0xf7, - 0x55, 0xe2, 0x8d, 0xc6, 0xe3, 0xc2, 0xb3, 0xd9, 0x78, 0xee, 0x84, 0xc5, 0x2a, 0x8d, 0x17, 0xfe, - 0x8b, 0x65, 0x4b, 0x3a, 0x99, 0x0e, 0xb6, 0x6d, 0x24, 0x44, 0xe9, 0x04, 0x28, 0xec, 0x7b, 0xd2, - 0xca, 0xfd, 0x07, 0x69, 0xad, 0x3e, 0x20, 0xad, 0x0e, 0x3c, 0x9e, 0x4b, 0x2b, 0x15, 0x24, 0x8d, - 0xb5, 0xff, 0xa9, 0xb1, 0x9d, 0x99, 0xc6, 0xe6, 0x69, 0x64, 0x75, 0x08, 0x3b, 0x8b, 0x9e, 0xa3, - 0x68, 0x2b, 0xce, 0x2f, 0x94, 0xdd, 0xa3, 0xb2, 0xa7, 0xef, 0x7d, 0x69, 0x76, 0xab, 0xce, 0xa8, - 0xec, 0x91, 0x4f, 0x61, 0x3b, 0x64, 0x11, 0x73, 0x88, 0x8f, 0x32, 0xae, 0x01, 0xd9, 0xd7, 0x6f, - 0x40, 0x79, 0xe6, 0x3a, 0x8d, 0x56, 0x41, 0xab, 0x5f, 0xe5, 0xb0, 0xbb, 0xf0, 0xb9, 0xfa, 0xd7, - 0xf9, 0x0e, 0xa0, 0x9c, 0x96, 0x4b, 0x4a, 0x04, 0x9b, 0x29, 0xc9, 0xb4, 0x78, 0xb7, 0x7e, 0xf1, - 0xdb, 0x4d, 0x25, 0xf3, 0xf6, 0xa6, 0x92, 0xf9, 0xf3, 0xa6, 0x92, 0xf9, 0xf9, 0xb6, 0xf2, 0xe8, - 0xed, 0x6d, 0xe5, 0xd1, 0xef, 0xb7, 0x95, 0x47, 0x3f, 0x1d, 0x75, 0xb9, 0xea, 0x8d, 0x1c, 0xd3, - 0x15, 0xc3, 0x9a, 0x3e, 0x45, 0x5c, 0x9d, 0xc9, 0x47, 0x6d, 0x92, 0xfe, 0xc7, 0x51, 0xd3, 0x80, - 0x49, 0x67, 0x0d, 0x7f, 0x6e, 0x3e, 0xff, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x1c, 0xe7, 0x29, - 0xac, 0x09, 0x00, 0x00, + // 1061 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x6e, 0xe3, 0x44, + 0x14, 0x6e, 0x9a, 0xf4, 0x27, 0x93, 0xa4, 0x0d, 0x6e, 0xbb, 0x6b, 0x76, 0x21, 0x2d, 0xd9, 0x65, + 0x55, 0x60, 0x71, 0x68, 0x81, 0xbd, 0x03, 0xa9, 0x49, 0xb7, 0x6a, 0x45, 0xa1, 0x91, 0x93, 0x82, + 0xc4, 0x8d, 0x35, 0xb6, 0x27, 0xc9, 0xc8, 0x89, 0x67, 0xe4, 0x99, 0xa4, 0xc9, 0x5b, 0x80, 0xc4, + 0x43, 0x71, 0xb9, 0x97, 0x70, 0x87, 0xda, 0x4b, 0x5e, 0x02, 0xf9, 0x78, 0xfc, 0xd3, 0x90, 0x14, + 0x76, 0x2f, 0x7d, 0xce, 0x77, 0xbe, 0xf3, 0xf7, 0xcd, 0x8c, 0x51, 0xdd, 0xc6, 0xf6, 0x6c, 0xc8, + 0xfc, 0x86, 0x2d, 0x1d, 0x21, 0xb1, 0x47, 0xfd, 0x7e, 0x63, 0x72, 0xd4, 0xe0, 0xd8, 0xf1, 0x88, + 0x34, 0x78, 0xc0, 0x24, 0xd3, 0xf6, 0x14, 0xc6, 0x48, 0x31, 0xc6, 0xe4, 0xe8, 0x49, 0xdd, 0x61, + 0x62, 0xc4, 0x44, 0xc3, 0x09, 0x66, 0x5c, 0xb2, 0x86, 0x20, 0x0e, 0x3f, 0xfe, 0xfa, 0x95, 0x77, + 0xd4, 0xf0, 0xc8, 0x4c, 0x44, 0xa1, 0x4f, 0x9e, 0x2b, 0x4c, 0x4a, 0x6d, 0x13, 0x89, 0x8f, 0xe2, + 0x6f, 0x85, 0xda, 0x5f, 0x52, 0x04, 0xe3, 0x0a, 0xf0, 0x62, 0x31, 0x20, 0x53, 0x0f, 0xe0, 0xea, + 0xbf, 0xe6, 0xd1, 0x4e, 0xb3, 0xdb, 0xea, 0x44, 0xc6, 0x8b, 0x66, 0xab, 0x0d, 0x7d, 0x68, 0x27, + 0x68, 0xdd, 0x27, 0x37, 0x56, 0x8f, 0xeb, 0xb9, 0x83, 0xfc, 0x61, 0xe9, 0xf8, 0x53, 0x63, 0x61, + 0x4b, 0xc6, 0x0f, 0xe4, 0xe6, 0x8c, 0xfa, 0x78, 0x48, 0xe5, 0xac, 0x1d, 0xb0, 0x09, 0x75, 0x49, + 0x60, 0xae, 0xf9, 0xe4, 0xe6, 0x8c, 0x6b, 0xdf, 0x23, 0x24, 0x86, 0x58, 0x0c, 0x88, 0x1b, 0xd2, + 0xac, 0x02, 0x8d, 0xb1, 0x84, 0xa6, 0x13, 0x01, 0xff, 0x45, 0x55, 0x54, 0x0c, 0x67, 0x5c, 0xbb, + 0x40, 0x08, 0x3b, 0x92, 0x4e, 0x88, 0xe5, 0x92, 0xa1, 0x9e, 0x7f, 0xb0, 0xaa, 0x13, 0x00, 0x36, + 0xbb, 0xad, 0x53, 0x32, 0x24, 0x7d, 0x2c, 0x29, 0xf3, 0xcd, 0x62, 0x14, 0x7d, 0x4a, 0x86, 0xda, + 0x25, 0x2a, 0xc5, 0x95, 0x85, 0x5c, 0x05, 0xe0, 0xfa, 0xec, 0xe1, 0xd2, 0xee, 0x93, 0xc5, 0x9d, + 0x85, 0x6c, 0x57, 0xa8, 0x3c, 0xf6, 0x6d, 0xe6, 0xbb, 0x8a, 0x6e, 0x0d, 0xe8, 0x5e, 0x2e, 0xa1, + 0xbb, 0x56, 0xd0, 0xfb, 0x7c, 0xa5, 0x98, 0xe1, 0x94, 0x0c, 0xeb, 0x7f, 0xe7, 0xd1, 0xce, 0x82, + 0xb9, 0x6a, 0xaf, 0x51, 0xc9, 0x25, 0xc2, 0x09, 0x28, 0x0f, 0x63, 0xf4, 0xdc, 0x41, 0xee, 0xb0, + 0x74, 0xfc, 0xcc, 0x88, 0x04, 0x63, 0xa4, 0x39, 0x40, 0x30, 0xc6, 0x69, 0x0a, 0x35, 0xb3, 0x71, + 0x5a, 0x0d, 0x21, 0x87, 0x8d, 0x46, 0x54, 0x88, 0x90, 0x65, 0xf5, 0x20, 0x77, 0x58, 0x34, 0x33, + 0x16, 0xed, 0x5b, 0x84, 0x54, 0xe9, 0x16, 0xf7, 0xf4, 0x3c, 0x64, 0xd9, 0x8f, 0xb3, 0x44, 0xd2, + 0x35, 0x12, 0xe9, 0x1a, 0xed, 0xb1, 0xfd, 0x1d, 0x99, 0x99, 0x45, 0x15, 0xd2, 0xf6, 0xb4, 0x0f, + 0x10, 0xb2, 0xa5, 0x63, 0x71, 0xcf, 0x1a, 0x90, 0xa9, 0x5e, 0x00, 0xfe, 0x4d, 0x5b, 0x3a, 0x6d, + 0xef, 0x9c, 0x4c, 0xb5, 0x6f, 0x50, 0x9e, 0x33, 0xae, 0xaf, 0x01, 0xed, 0xb2, 0x99, 0xb7, 0x03, + 0xc6, 0x7a, 0x57, 0xbd, 0x36, 0x13, 0x82, 0x40, 0x51, 0xcd, 0x6e, 0xcb, 0x0c, 0xe3, 0xb4, 0x17, + 0x68, 0x7b, 0x84, 0x85, 0x24, 0x81, 0xc5, 0xc7, 0xb6, 0x15, 0x60, 0xdf, 0xd5, 0xd7, 0x21, 0x43, + 0x25, 0x32, 0xb7, 0xc7, 0xb6, 0x89, 0x7d, 0x57, 0xfb, 0x04, 0x55, 0x03, 0xd2, 0xa7, 0xa1, 0x89, + 0xb8, 0x16, 0xe1, 0xcc, 0x19, 0xe8, 0x1b, 0x07, 0xb9, 0xc3, 0x82, 0xb9, 0x9d, 0xda, 0x5f, 0x87, + 0x66, 0xed, 0x2b, 0xf4, 0x28, 0x56, 0x43, 0xdc, 0xf7, 0x80, 0xd0, 0xfe, 0x40, 0xea, 0x9b, 0x10, + 0xb0, 0xab, 0xbc, 0xcd, 0xc8, 0x79, 0x0e, 0x3e, 0xed, 0x25, 0xd2, 0x92, 0x28, 0xe9, 0xc4, 0x11, + 0x45, 0x88, 0xa8, 0xc6, 0x11, 0xd2, 0x51, 0xe8, 0xf7, 0xd1, 0xa6, 0x33, 0xc0, 0xd4, 0xb7, 0xa8, + 0xab, 0x23, 0xa8, 0x77, 0x03, 0xbe, 0x2f, 0xdc, 0x7a, 0x0f, 0x3d, 0x5e, 0xa2, 0xfe, 0xb9, 0x49, + 0xe6, 0xe6, 0x26, 0xf9, 0x39, 0xda, 0x09, 0x88, 0xc3, 0x26, 0xd0, 0x61, 0x8f, 0x43, 0x19, 0xc2, + 0x53, 0x0b, 0xad, 0x26, 0xae, 0x33, 0xde, 0x94, 0x4e, 0xc7, 0xab, 0xff, 0x59, 0x40, 0x3b, 0x0b, + 0xce, 0xc5, 0x7f, 0x24, 0x79, 0x86, 0xb6, 0x14, 0x35, 0xf7, 0xac, 0x21, 0x15, 0x12, 0x0e, 0x72, + 0xd1, 0x2c, 0xf5, 0x42, 0xda, 0xb6, 0x77, 0x49, 0x85, 0xd4, 0x3e, 0x42, 0x65, 0x21, 0x71, 0x20, + 0xe3, 0x29, 0xe4, 0x61, 0x0a, 0x25, 0xb0, 0xa9, 0x01, 0x7c, 0x88, 0x10, 0xf1, 0xdd, 0x18, 0x50, + 0x00, 0x40, 0x91, 0xf8, 0xae, 0x72, 0x3f, 0x45, 0x45, 0xc9, 0x24, 0x1e, 0x5a, 0x02, 0x4b, 0xd0, + 0x46, 0xc1, 0xdc, 0x04, 0x43, 0x07, 0x43, 0xac, 0xd2, 0x86, 0x25, 0xa7, 0xb0, 0xee, 0xb2, 0x59, + 0x54, 0x96, 0xee, 0x54, 0xdb, 0x57, 0xa7, 0x59, 0xf9, 0x37, 0xc0, 0x8f, 0x62, 0x53, 0x77, 0x1a, + 0x2e, 0xd8, 0x8d, 0xfa, 0x65, 0x81, 0x95, 0x40, 0x05, 0xed, 0xc3, 0x82, 0xcb, 0xe6, 0x6e, 0xe2, + 0xed, 0x28, 0x67, 0x87, 0xf6, 0xb5, 0x6b, 0x54, 0x09, 0x27, 0xe8, 0x63, 0x5f, 0x86, 0x58, 0xa1, + 0x17, 0xe1, 0x5c, 0x7f, 0xb1, 0x44, 0xb2, 0x2d, 0x85, 0x3d, 0x71, 0x31, 0x0f, 0x99, 0x68, 0xdf, + 0xc7, 0x72, 0x1c, 0x10, 0x61, 0x96, 0x63, 0x9a, 0x0e, 0xed, 0x0b, 0xd0, 0x8d, 0x6a, 0x86, 0x8d, + 0x25, 0x1f, 0x4b, 0x8b, 0xba, 0x53, 0xd0, 0x44, 0xc5, 0xac, 0x2a, 0xcf, 0x15, 0x38, 0x2e, 0xdc, + 0xa9, 0xf6, 0x31, 0xda, 0x8a, 0x6e, 0x06, 0x68, 0x8e, 0x8e, 0x88, 0x5e, 0x01, 0x64, 0x25, 0xb1, + 0x76, 0xe9, 0x88, 0x68, 0x3f, 0xa1, 0xf7, 0xc6, 0xbe, 0x9b, 0xec, 0xd4, 0xa2, 0x7e, 0x8f, 0xe9, + 0x5b, 0x70, 0xc4, 0x96, 0x5d, 0x91, 0xcd, 0x6e, 0xeb, 0x3a, 0x13, 0x72, 0xe1, 0xf7, 0x98, 0x59, + 0x1d, 0xcf, 0x59, 0xc2, 0xfc, 0x1c, 0x07, 0x78, 0x24, 0xac, 0x09, 0x09, 0xe0, 0xbe, 0xd8, 0x8e, + 0xf2, 0x47, 0xd6, 0x1f, 0x23, 0x63, 0xfd, 0xb7, 0xe8, 0x15, 0x99, 0x27, 0x0c, 0x85, 0x91, 0x29, + 0x3f, 0x52, 0x57, 0x39, 0xbe, 0xec, 0xa2, 0xe5, 0xbc, 0x42, 0x8f, 0xd3, 0xe5, 0xa4, 0xe0, 0x70, + 0x3b, 0xab, 0x80, 0xde, 0x4b, 0xdc, 0xd7, 0xb1, 0x37, 0x5c, 0x8f, 0x83, 0x9e, 0x26, 0xeb, 0xb9, + 0x17, 0x16, 0xa9, 0x34, 0x7a, 0x1f, 0x9e, 0x2f, 0xbb, 0xd3, 0xe3, 0xed, 0x40, 0xdb, 0x7a, 0x4c, + 0x94, 0x4d, 0x00, 0xc2, 0x9e, 0x93, 0x56, 0xe1, 0x2d, 0xa4, 0xb5, 0xf6, 0x80, 0xb4, 0x7a, 0xe8, + 0x51, 0x2a, 0xad, 0x4c, 0x90, 0xd0, 0xd7, 0xdf, 0x51, 0x63, 0xbb, 0x89, 0xc6, 0xd2, 0x34, 0xa2, + 0x3e, 0x42, 0xbb, 0x8b, 0x5e, 0xaf, 0xf0, 0x12, 0x4d, 0x0f, 0x94, 0x35, 0xc0, 0x62, 0xa0, 0xce, + 0x7d, 0x25, 0x39, 0x55, 0xe7, 0x58, 0x0c, 0xde, 0xf6, 0x86, 0xa1, 0x68, 0x6f, 0xe1, 0xeb, 0xf6, + 0xbf, 0xf3, 0x1d, 0xa2, 0x6a, 0x56, 0x2e, 0x19, 0x11, 0x6c, 0x65, 0x24, 0xd3, 0xa1, 0xfd, 0xe6, + 0xe5, 0xef, 0xb7, 0xb5, 0xdc, 0x9b, 0xdb, 0x5a, 0xee, 0xaf, 0xdb, 0x5a, 0xee, 0x97, 0xbb, 0xda, + 0xca, 0x9b, 0xbb, 0xda, 0xca, 0x1f, 0x77, 0xb5, 0x95, 0x9f, 0x8f, 0xfb, 0x54, 0x0e, 0xc6, 0xb6, + 0xe1, 0xb0, 0x51, 0x43, 0x4d, 0x11, 0x6e, 0xda, 0xf8, 0xa3, 0x31, 0xcd, 0xfe, 0x12, 0xc9, 0x19, + 0x27, 0xc2, 0x5e, 0x87, 0x7f, 0xa1, 0x2f, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x5b, 0xf2, 0xd6, + 0x9c, 0xdb, 0x09, 0x00, 0x00, } func (m *BTCStakingIBCPacket) Marshal() (dAtA []byte, err error) { @@ -970,6 +981,13 @@ func (m *SlashedFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if len(m.RecoveredFpBtcSk) > 0 { + i -= len(m.RecoveredFpBtcSk) + copy(dAtA[i:], m.RecoveredFpBtcSk) + i = encodeVarintPacket(dAtA, i, uint64(len(m.RecoveredFpBtcSk))) + i-- + dAtA[i] = 0x12 + } if len(m.BtcPkHex) > 0 { i -= len(m.BtcPkHex) copy(dAtA[i:], m.BtcPkHex) @@ -1355,6 +1373,10 @@ func (m *SlashedFinalityProvider) Size() (n int) { if l > 0 { n += 1 + l + sovPacket(uint64(l)) } + l = len(m.RecoveredFpBtcSk) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } return n } @@ -2118,6 +2140,38 @@ func (m *SlashedFinalityProvider) Unmarshal(dAtA []byte) error { } m.BtcPkHex = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RecoveredFpBtcSk", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RecoveredFpBtcSk = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPacket(dAtA[iNdEx:]) From 78120b30a937e77791fad3598e32d243d0bc992b Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Thu, 25 Apr 2024 16:20:37 +0800 Subject: [PATCH 19/85] chore: rename chain to consumer for PoS integration (#233) --- proto/babylon/btcstaking/v1/btcstaking.proto | 4 +- proto/babylon/btcstaking/v1/packet.proto | 4 +- proto/babylon/btcstaking/v1/tx.proto | 4 +- .../btcstkconsumer/v1/btcstkconsumer.proto | 17 +- proto/babylon/btcstkconsumer/v1/query.proto | 66 +- proto/babylon/btcstkconsumer/v1/tx.proto | 24 +- test/e2e/btc_staking_integration_e2e_test.go | 84 +-- .../chain/commands_btcstaking_integration.go | 12 +- .../chain/queries_btcstaking_integration.go | 22 +- testutil/datagen/btcstaking.go | 2 +- testutil/datagen/btcstkconsumer.go | 10 +- x/btcstaking/client/cli/tx.go | 8 +- x/btcstaking/keeper/btc_delegations.go | 4 +- x/btcstaking/keeper/grpc_query.go | 8 +- x/btcstaking/keeper/keeper_test.go | 10 +- x/btcstaking/keeper/msg_server.go | 28 +- x/btcstaking/keeper/restaking_test.go | 36 +- x/btcstaking/types/btcstaking.pb.go | 176 ++--- x/btcstaking/types/errors.go | 2 +- x/btcstaking/types/expected_keepers.go | 6 +- x/btcstaking/types/mocked_keepers.go | 24 +- x/btcstaking/types/packet.pb.go | 156 ++-- x/btcstaking/types/tx.pb.go | 184 ++--- x/btcstkconsumer/client/cli/query.go | 51 +- x/btcstkconsumer/client/cli/tx.go | 31 +- .../keeper/consumer_chain_registry.go | 56 -- .../keeper/consumer_chain_registry_test.go | 44 -- x/btcstkconsumer/keeper/consumer_registry.go | 57 ++ .../keeper/consumer_registry_test.go | 44 ++ .../keeper/finality_provider_registry.go | 12 +- .../keeper/finality_provider_registry_test.go | 41 +- x/btcstkconsumer/keeper/grpc_query.go | 65 +- x/btcstkconsumer/keeper/grpc_query_test.go | 114 +-- x/btcstkconsumer/keeper/msg_server.go | 26 +- x/btcstkconsumer/types/btcstkconsumer.pb.go | 137 ++-- x/btcstkconsumer/types/chain_register.go | 13 +- x/btcstkconsumer/types/codec.go | 4 +- x/btcstkconsumer/types/errors.go | 10 +- x/btcstkconsumer/types/keys.go | 6 +- x/btcstkconsumer/types/query.go | 2 +- x/btcstkconsumer/types/query.pb.go | 684 +++++++++--------- x/btcstkconsumer/types/query.pb.gw.go | 144 ++-- x/btcstkconsumer/types/tx.pb.go | 256 +++---- 43 files changed, 1349 insertions(+), 1339 deletions(-) delete mode 100644 x/btcstkconsumer/keeper/consumer_chain_registry.go delete mode 100644 x/btcstkconsumer/keeper/consumer_chain_registry_test.go create mode 100644 x/btcstkconsumer/keeper/consumer_registry.go create mode 100644 x/btcstkconsumer/keeper/consumer_registry_test.go diff --git a/proto/babylon/btcstaking/v1/btcstaking.proto b/proto/babylon/btcstaking/v1/btcstaking.proto index 2477d4c6b..e031ef165 100644 --- a/proto/babylon/btcstaking/v1/btcstaking.proto +++ b/proto/babylon/btcstaking/v1/btcstaking.proto @@ -33,9 +33,9 @@ message FinalityProvider { // the finality provider is slashed. // if it's 0 then the finality provider is not slashed uint64 slashed_btc_height = 9; - // chain_id is the chain id of the chain the finality provider is operating on. + // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. - string chain_id = 10; + string consumer_id = 10; } // FinalityProviderWithMeta wraps the FinalityProvider with metadata. diff --git a/proto/babylon/btcstaking/v1/packet.proto b/proto/babylon/btcstaking/v1/packet.proto index fc3699d40..fe0830097 100644 --- a/proto/babylon/btcstaking/v1/packet.proto +++ b/proto/babylon/btcstaking/v1/packet.proto @@ -48,9 +48,9 @@ message NewFinalityProvider { // the finality provider is slashed. // if it's 0 then the finality provider is not slashed uint64 slashed_btc_height = 9; - // chain_id is the chain id of the chain the finality provider is operating on. + // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. - string chain_id = 10; + string consumer_id = 10; } // SlashedFinalityProvider is an IBC packet sent from consumer chain to Babylon diff --git a/proto/babylon/btcstaking/v1/tx.proto b/proto/babylon/btcstaking/v1/tx.proto index 9ad4ad3de..14481250f 100644 --- a/proto/babylon/btcstaking/v1/tx.proto +++ b/proto/babylon/btcstaking/v1/tx.proto @@ -51,9 +51,9 @@ message MsgCreateFinalityProvider { bytes btc_pk = 4 [ (gogoproto.customtype) = "github.com/babylonchain/babylon/types.BIP340PubKey" ]; // pop is the proof of possession of btc_pk over the FP signer address. ProofOfPossessionBTC pop = 5; - // chain id is a registered CZ chain id, or Babylon's chain id. + // consumer_id is the ID of the consumer // If it's empty, it's assumed to be Babylon's chain id - string chain_id = 7; + string consumer_id = 7; } // MsgCreateFinalityProviderResponse is the response for MsgCreateFinalityProvider diff --git a/proto/babylon/btcstkconsumer/v1/btcstkconsumer.proto b/proto/babylon/btcstkconsumer/v1/btcstkconsumer.proto index 993f3a3b8..ff42713af 100644 --- a/proto/babylon/btcstkconsumer/v1/btcstkconsumer.proto +++ b/proto/babylon/btcstkconsumer/v1/btcstkconsumer.proto @@ -3,12 +3,13 @@ package babylon.btcstkconsumer.v1; option go_package = "github.com/babylonchain/babylon/x/btcstkconsumer/types"; -// ChainRegister is the registration information of a CZ -message ChainRegister { - // chain_id is the ID of the chain - string chain_id = 1; - // chain_name is the name of the chain - string chain_name = 2; - // chain_description is a description for the chain (can be empty) - string chain_description = 3; +// ConsumerRegister is the registration information of a consumer +message ConsumerRegister { + // consumer_id is the ID of the consumer + // - for Cosmos SDK chains, the consumer ID will be the IBC client ID + string consumer_id = 1; + // consumer_name is the name of the consumer + string consumer_name = 2; + // consumer_description is a description for the consumer (can be empty) + string consumer_description = 3; } \ No newline at end of file diff --git a/proto/babylon/btcstkconsumer/v1/query.proto b/proto/babylon/btcstkconsumer/v1/query.proto index 3b2f9af0e..62b6277a6 100644 --- a/proto/babylon/btcstkconsumer/v1/query.proto +++ b/proto/babylon/btcstkconsumer/v1/query.proto @@ -21,28 +21,28 @@ service Query { rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { option (google.api.http).get = "/babylon/btcstkconsumer/v1/params"; } - // ChainRegistryList queries the list of chains that are registered to Babylon - rpc ChainRegistryList(QueryChainRegistryListRequest) returns (QueryChainRegistryListResponse) { - option (google.api.http).get = "/babylon/btcstkconsumer/v1/chain_registry_list"; + // ConsumerRegistryList queries the list of consumers that are registered to Babylon + rpc ConsumerRegistryList(QueryConsumerRegistryListRequest) returns (QueryConsumerRegistryListResponse) { + option (google.api.http).get = "/babylon/btcstkconsumer/v1/consumer_registry_list"; } - // ChainsRegistry queries the latest info for a given list of chains in Babylon's view - rpc ChainsRegistry(QueryChainsRegistryRequest) returns (QueryChainsRegistryResponse) { - option (google.api.http).get = "/babylon/btcstkconsumer/v1/chains_registry/{chain_ids}"; + // ConsumersRegistry queries the latest info for a given list of consumers in Babylon's view + rpc ConsumersRegistry(QueryConsumersRegistryRequest) returns (QueryConsumersRegistryResponse) { + option (google.api.http).get = "/babylon/btcstkconsumer/v1/consumers_registry/{consumer_ids}"; } - // FinalityProviderChain info about one finality provider's chain id - rpc FinalityProviderChain(QueryFinalityProviderChainRequest) returns (QueryFinalityProviderChainResponse) { - option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_provider_chain/{fp_btc_pk_hex}"; + // FinalityProviderConsumer info about one finality provider's consumer id + rpc FinalityProviderConsumer(QueryFinalityProviderConsumerRequest) returns (QueryFinalityProviderConsumerResponse) { + option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_provider_consumer/{fp_btc_pk_hex}"; } - // FinalityProviders queries all finality providers for a given chain + // FinalityProviders queries all finality providers for a given consumer rpc FinalityProviders(QueryFinalityProvidersRequest) returns (QueryFinalityProvidersResponse) { - option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_providers/{chain_id}"; + option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_providers/{consumer_id}"; } // FinalityProvider info about one finality provider rpc FinalityProvider(QueryFinalityProviderRequest) returns (QueryFinalityProviderResponse) { - option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_provider/{chain_id}/{fp_btc_pk_hex}"; + option (google.api.http).get = "/babylon/btcstkconsumer/v1/finality_provider/{consumer_id}/{fp_btc_pk_hex}"; } } @@ -58,32 +58,32 @@ message QueryParamsResponse { ]; } -// QueryChainRegistryListRequest is request type for the Query/ChainRegistryList RPC method -message QueryChainRegistryListRequest { +// QueryConsumerRegistryListRequest is request type for the Query/ConsumerRegistryList RPC method +message QueryConsumerRegistryListRequest { // pagination defines whether to have the pagination in the request cosmos.base.query.v1beta1.PageRequest pagination = 1; } -// QueryChainRegistryListResponse is response type for the Query/ChainRegistryList RPC method -message QueryChainRegistryListResponse { - // chain_ids are IDs of the chains in ascending alphabetical order - repeated string chain_ids = 1; +// QueryConsumerRegistryListResponse is response type for the Query/ConsumerRegistryList RPC method +message QueryConsumerRegistryListResponse { + // consumer_ids are IDs of the consumers in ascending alphabetical order + repeated string consumer_ids = 1; // pagination defines the pagination in the response cosmos.base.query.v1beta1.PageResponse pagination = 2; } -// QueryChainsRegistryRequest is request type for the Query/ChainsRegistry RPC method. -message QueryChainsRegistryRequest { repeated string chain_ids = 1; } +// QueryConsumersRegistryRequest is request type for the Query/ConsumersRegistry RPC method. +message QueryConsumersRegistryRequest { repeated string consumer_ids = 1; } -// QueryChainsRegistryResponse is response type for the Query/ChainsRegistry RPC method. -message QueryChainsRegistryResponse { - repeated babylon.btcstkconsumer.v1.ChainRegister chains_register = 1; +// QueryConsumersRegistryResponse is response type for the Query/ConsumersRegistry RPC method. +message QueryConsumersRegistryResponse { + repeated babylon.btcstkconsumer.v1.ConsumerRegister consumers_register = 1; } // QueryFinalityProvidersRequest is the request type for the // Query/FinalityProviders RPC method. message QueryFinalityProvidersRequest { - string chain_id = 1; + string consumer_id = 1; // pagination defines an optional pagination for the request. cosmos.base.query.v1beta1.PageRequest pagination = 2; } @@ -100,8 +100,8 @@ message QueryFinalityProvidersResponse { // QueryFinalityProviderRequest requests information about a finality provider message QueryFinalityProviderRequest { - // chain id is the chain id this finality provider is registered to - string chain_id = 1; + // consumer id is the consumer id this finality provider is registered to + string consumer_id = 1; // fp_btc_pk_hex is the hex str of Bitcoin secp256k1 PK of the finality provider string fp_btc_pk_hex = 2; } @@ -140,17 +140,17 @@ message FinalityProviderResponse { uint64 height = 8; // voting_power is the voting power of this finality provider at the given height uint64 voting_power = 9; - // chain_id is the chain id this finality provider is registered to - string chain_id = 10; + // consumer_id is the consumer id this finality provider is registered to + string consumer_id = 10; } -// QueryFinalityProviderChainRequest requests the chain a CZ finality provider belongs to -message QueryFinalityProviderChainRequest { +// QueryFinalityProviderConsumerRequest requests the consumer a CZ finality provider belongs to +message QueryFinalityProviderConsumerRequest { // fp_btc_pk_hex is the hex str of Bitcoin secp256k1 PK of the finality provider string fp_btc_pk_hex = 1; } -// QueryFinalityProviderChainResponse returns the CZ finality provier chain id -message QueryFinalityProviderChainResponse { - string chain_id = 1; +// QueryFinalityProviderConsumerResponse returns the CZ finality provier consumer id +message QueryFinalityProviderConsumerResponse { + string consumer_id = 1; } diff --git a/proto/babylon/btcstkconsumer/v1/tx.proto b/proto/babylon/btcstkconsumer/v1/tx.proto index d351d25e4..bb3c0f1d0 100644 --- a/proto/babylon/btcstkconsumer/v1/tx.proto +++ b/proto/babylon/btcstkconsumer/v1/tx.proto @@ -16,8 +16,8 @@ service Msg { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); - // RegisterChain registers a CZ chain to the btcstkconsumer module. - rpc RegisterChain(MsgRegisterChain) returns (MsgRegisterChainResponse); + // RegisterConsumer registers a CZ consumer to the btcstkconsumer module. + rpc RegisterConsumer(MsgRegisterConsumer) returns (MsgRegisterConsumerResponse); } // MsgUpdateParams is the Msg/UpdateParams request type. @@ -41,18 +41,18 @@ message MsgUpdateParams { // MsgUpdateParams message. message MsgUpdateParamsResponse {} -// MsgRegisterChain defines a message for registering CZ chains to the btcstkconsumer module. -message MsgRegisterChain { +// MsgRegisterConsumer defines a message for registering CZ consumers to the btcstkconsumer module. +message MsgRegisterConsumer { option (cosmos.msg.v1.signer) = "signer"; string signer = 1; - // chain_id is the ID of the chain - string chain_id = 2; - // chain_name is the name of the chain - string chain_name = 3; - // chain_description is a description for the chain (can be empty) - string chain_description = 4; + // consumer_id is the ID of the consumer + string consumer_id = 2; + // consumer_name is the name of the consumer + string consumer_name = 3; + // consumer_description is a description for the consumer (can be empty) + string consumer_description = 4; } -// MsgRegisterChainResponse is the response to the MsgRegisterChain message. -message MsgRegisterChainResponse {} +// MsgRegisterConsumerResponse is the response to the MsgRegisterConsumer message. +message MsgRegisterConsumerResponse {} diff --git a/test/e2e/btc_staking_integration_e2e_test.go b/test/e2e/btc_staking_integration_e2e_test.go index 485ab0b8b..41a7978b7 100644 --- a/test/e2e/btc_staking_integration_e2e_test.go +++ b/test/e2e/btc_staking_integration_e2e_test.go @@ -38,7 +38,7 @@ func (s *BTCStakingIntegrationTestSuite) SetupSuite() { // The e2e test flow is as follows: // - // 1. Configure 1 chain with some validator nodes + // 1. Configure 1 consumer with some validator nodes // 2. Execute various e2e tests s.configurer, err = configurer.NewBTCStakingIntegrationConfigurer(s.T(), true) @@ -56,28 +56,28 @@ func (s *BTCStakingIntegrationTestSuite) TearDownSuite() { s.Require().NoError(err) } -func (s *BTCStakingIntegrationTestSuite) Test1RegisterNewConsumerChain() { +func (s *BTCStakingIntegrationTestSuite) Test1RegisterNewConsumer() { chainA := s.configurer.GetChainConfig(0) chainA.WaitUntilHeight(1) nonValidatorNode, err := chainA.GetNodeAtIndex(2) s.NoError(err) - s.registerVerifyConsumerChain(nonValidatorNode) + s.registerVerifyConsumer(nonValidatorNode) } -func (s *BTCStakingIntegrationTestSuite) Test2CreateConsumerChainFinalityProvider() { +func (s *BTCStakingIntegrationTestSuite) Test2CreateConsumerFinalityProvider() { chainA := s.configurer.GetChainConfig(0) chainA.WaitUntilHeight(1) nonValidatorNode, err := chainA.GetNodeAtIndex(2) s.NoError(err) - // get the chain registered in Test1 - chainRegistryList := nonValidatorNode.QueryChainRegistryList(&query.PageRequest{Limit: 1}) - consumerChainId := chainRegistryList.ChainIds[0] + // get the consumer registered in Test1 + consumerRegistryList := nonValidatorNode.QueryConsumerRegistryList(&query.PageRequest{Limit: 1}) + consumerId := consumerRegistryList.ConsumerIds[0] - // create a random num of finality providers from 1 to 5 on the consumer chain + // create a random num of finality providers from 1 to 5 on the consumer numFPs := datagen.RandomInt(r, 5) + 1 for i := 0; i < int(numFPs); i++ { - s.createVerifyConsumerChainFP(nonValidatorNode, consumerChainId) + s.createVerifyConsumerFP(nonValidatorNode, consumerId) } } @@ -87,25 +87,25 @@ func (s *BTCStakingIntegrationTestSuite) Test3RestakeDelegationToMultipleFPs() { nonValidatorNode, err := chainA.GetNodeAtIndex(2) s.NoError(err) - // get the chain registered in Test1 - chainRegistryList := nonValidatorNode.QueryChainRegistryList(&query.PageRequest{Limit: 1}) - consumerChainId := chainRegistryList.ChainIds[0] - // get the consumer chain created in Test2 - consumerChainFp := nonValidatorNode.QueryConsumerFinalityProviders(consumerChainId)[0] + // get the consumer registered in Test1 + consumerRegistryList := nonValidatorNode.QueryConsumerRegistryList(&query.PageRequest{Limit: 1}) + consumerId := consumerRegistryList.ConsumerIds[0] + // get the consumer created in Test2 + consumerFp := nonValidatorNode.QueryConsumerFinalityProviders(consumerId)[0] // register a babylon finality provider babylonFp := s.createVerifyBabylonFP(nonValidatorNode) - // create a delegation and restake to both Babylon and consumer chain finality providers + // create a delegation and restake to both Babylon and consumer finality providers // NOTE: this will create delegation in pending state as covenant sigs are not provided - delBtcPk, stakingTxHash := s.createBabylonDelegation(nonValidatorNode, babylonFp, consumerChainFp) + delBtcPk, stakingTxHash := s.createBabylonDelegation(nonValidatorNode, babylonFp, consumerFp) // check delegation delegation := nonValidatorNode.QueryBtcDelegation(stakingTxHash) s.NotNil(delegation) - // check consumer chain finality provider delegation - czPendingDelSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerChainFp.BtcPk.MarshalHex()) + // check consumer finality provider delegation + czPendingDelSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) s.Len(czPendingDelSet, 1) czPendingDels := czPendingDelSet[0] s.Len(czPendingDels.Dels, 1) @@ -121,24 +121,24 @@ func (s *BTCStakingIntegrationTestSuite) Test3RestakeDelegationToMultipleFPs() { s.Len(pendingDels.Dels[0].CovenantSigs, 0) } -// helper function: register a random chain on Babylon and verify it -func (s *BTCStakingIntegrationTestSuite) registerVerifyConsumerChain(babylonNode *chain.NodeConfig) *bsctypes.ChainRegister { - // Register a random chain on Babylon - randomChain := datagen.GenRandomChainRegister(r) - babylonNode.RegisterConsumerChain(randomChain.ChainId, randomChain.ChainName, randomChain.ChainDescription) +// helper function: register a random consumer on Babylon and verify it +func (s *BTCStakingIntegrationTestSuite) registerVerifyConsumer(babylonNode *chain.NodeConfig) *bsctypes.ConsumerRegister { + // Register a random consumer on Babylon + randomConsumer := datagen.GenRandomConsumerRegister(r) + babylonNode.RegisterConsumer(randomConsumer.ConsumerId, randomConsumer.ConsumerName, randomConsumer.ConsumerDescription) babylonNode.WaitForNextBlock() - // Query the chain registry to verify the chain was registered - chainRegistry := babylonNode.QueryChainRegistry(randomChain.ChainId) - s.Require().Len(chainRegistry, 1) - s.Require().Equal(randomChain.ChainId, chainRegistry[0].ChainId) - s.Require().Equal(randomChain.ChainName, chainRegistry[0].ChainName) - s.Require().Equal(randomChain.ChainDescription, chainRegistry[0].ChainDescription) - return randomChain + // Query the consumer registry to verify the consumer was registered + consumerRegistry := babylonNode.QueryConsumerRegistry(randomConsumer.ConsumerId) + s.Require().Len(consumerRegistry, 1) + s.Require().Equal(randomConsumer.ConsumerId, consumerRegistry[0].ConsumerId) + s.Require().Equal(randomConsumer.ConsumerName, consumerRegistry[0].ConsumerName) + s.Require().Equal(randomConsumer.ConsumerDescription, consumerRegistry[0].ConsumerDescription) + return randomConsumer } -// helper function: create a random consumer chain finality provider on Babylon and verify it -func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerChainFP(babylonNode *chain.NodeConfig, consumerChainId string) *bstypes.FinalityProvider { +// helper function: create a random consumer finality provider on Babylon and verify it +func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerFP(babylonNode *chain.NodeConfig, consumerId string) *bstypes.FinalityProvider { /* create a random consumer finality provider on Babylon */ @@ -149,7 +149,7 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerChainFP(babylonNode czFp, err := datagen.GenRandomCustomFinalityProvider(r, czFpBTCSK, babylonNode.SecretKey, sr) s.NoError(err) babylonNode.CreateConsumerFinalityProvider( - czFp.BabylonPk, czFp.BtcPk, czFp.Pop, czFp.MasterPubRand, consumerChainId, czFp.Description.Moniker, + czFp.BabylonPk, czFp.BtcPk, czFp.Pop, czFp.MasterPubRand, consumerId, czFp.Description.Moniker, czFp.Description.Identity, czFp.Description.Website, czFp.Description.SecurityContact, czFp.Description.Details, czFp.Commission, ) @@ -158,7 +158,7 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerChainFP(babylonNode babylonNode.WaitForNextBlock() // query the existence of finality provider and assert equivalence - actualFp := babylonNode.QueryConsumerFinalityProvider(consumerChainId, czFp.BtcPk.MarshalHex()) + actualFp := babylonNode.QueryConsumerFinalityProvider(consumerId, czFp.BtcPk.MarshalHex()) s.Equal(czFp.Description, actualFp.Description) s.Equal(czFp.Commission, actualFp.Commission) s.Equal(czFp.BabylonPk, actualFp.BabylonPk) @@ -166,7 +166,7 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerChainFP(babylonNode s.Equal(czFp.Pop, actualFp.Pop) s.Equal(czFp.SlashedBabylonHeight, actualFp.SlashedBabylonHeight) s.Equal(czFp.SlashedBtcHeight, actualFp.SlashedBtcHeight) - s.Equal(consumerChainId, actualFp.ChainId) + s.Equal(consumerId, actualFp.ConsumerId) return czFp } @@ -200,11 +200,11 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyBabylonFP(babylonNode *chai return actualFps[0] } -// helper function: create a Babylon delegation and restake to Babylon and consumer chain finality providers -func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNode *chain.NodeConfig, babylonFp *bstypes.FinalityProviderResponse, consumerChainFp *bsctypes.FinalityProviderResponse) (*btcec.PublicKey, string) { +// helper function: create a Babylon delegation and restake to Babylon and consumer finality providers +func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNode *chain.NodeConfig, babylonFp *bstypes.FinalityProviderResponse, consumerFp *bsctypes.FinalityProviderResponse) (*btcec.PublicKey, string) { // finalise epochs until the registered epoch of the finality provider // so that the finality provider can receive BTC delegations - // TODO: it is assumed here that babylonFp is registered after consumerChainFp so + // TODO: it is assumed here that babylonFp is registered after consumerFp so // if we finalize registered epoch of babylonFp the other would also get finalized // ideally we should get registered epoch of each restaked fp and finalize it. var ( @@ -229,7 +229,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod nonValidatorNode.FinalizeSealedEpochs(startEpoch, endEpoch) /* - create a random BTC delegation restaking to Babylon and consumer chain finality providers + create a random BTC delegation restaking to Babylon and consumer finality providers */ delBbnSk := nonValidatorNode.SecretKey @@ -256,7 +256,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod s.T(), net, delBtcSk, - []*btcec.PublicKey{babylonFp.BtcPk.MustToBTCPK(), consumerChainFp.BtcPk.MustToBTCPK()}, + []*btcec.PublicKey{babylonFp.BtcPk.MustToBTCPK(), consumerFp.BtcPk.MustToBTCPK()}, covenantBTCPKs, covenantQuorum, stakingTimeBlocks, @@ -302,7 +302,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod s.T(), net, delBtcSk, - []*btcec.PublicKey{babylonFp.BtcPk.MustToBTCPK(), consumerChainFp.BtcPk.MustToBTCPK()}, + []*btcec.PublicKey{babylonFp.BtcPk.MustToBTCPK(), consumerFp.BtcPk.MustToBTCPK()}, covenantBTCPKs, covenantQuorum, wire.NewOutPoint(&stkTxHash, datagen.StakingOutIdx), @@ -322,7 +322,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod delBTCPKs, pop, stakingTxInfo, - []*bbn.BIP340PubKey{babylonFp.BtcPk, consumerChainFp.BtcPk}, + []*bbn.BIP340PubKey{babylonFp.BtcPk, consumerFp.BtcPk}, stakingTimeBlocks, btcutil.Amount(stakingValue), testStakingInfo.SlashingTx, diff --git a/test/e2e/configurer/chain/commands_btcstaking_integration.go b/test/e2e/configurer/chain/commands_btcstaking_integration.go index 7130f143c..c91bb62eb 100644 --- a/test/e2e/configurer/chain/commands_btcstaking_integration.go +++ b/test/e2e/configurer/chain/commands_btcstaking_integration.go @@ -10,18 +10,18 @@ import ( "github.com/stretchr/testify/require" ) -func (n *NodeConfig) RegisterConsumerChain(chainId, chainName, chainDesc string) { - n.LogActionF("registering consumer chain on babylon") +func (n *NodeConfig) RegisterConsumer(consumerId, consumerName, consumerDesc string) { + n.LogActionF("registering consumer on babylon") cmd := []string{ - "babylond", "tx", "btcstkconsumer", "register-chain", chainId, chainName, chainDesc, "--from=val", + "babylond", "tx", "btcstkconsumer", "register-consumer", consumerId, consumerName, consumerDesc, "--from=val", } _, _, err := n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) require.NoError(n.t, err) - n.LogActionF("successfully registered consumer chain on babylon") + n.LogActionF("successfully registered consumer on babylon") } -func (n *NodeConfig) CreateConsumerFinalityProvider(babylonPK *secp256k1.PubKey, btcPK *bbn.BIP340PubKey, pop *bstypes.ProofOfPossession, masterPubRand, consumerChainId, moniker, identity, website, securityContract, details string, commission *sdkmath.LegacyDec) { +func (n *NodeConfig) CreateConsumerFinalityProvider(babylonPK *secp256k1.PubKey, btcPK *bbn.BIP340PubKey, pop *bstypes.ProofOfPossession, masterPubRand, consumerId, moniker, identity, website, securityContract, details string, commission *sdkmath.LegacyDec) { n.LogActionF("creating consumer finality provider") // get babylon PK hex @@ -35,7 +35,7 @@ func (n *NodeConfig) CreateConsumerFinalityProvider(babylonPK *secp256k1.PubKey, require.NoError(n.t, err) cmd := []string{ - "babylond", "tx", "btcstaking", "create-finality-provider", babylonPKHex, btcPKHex, popHex, masterPubRand, "--from=val", "--consumer-chain-id", consumerChainId, "--moniker", moniker, "--identity", identity, "--website", website, "--security-contact", securityContract, "--details", details, "--commission-rate", commission.String(), + "babylond", "tx", "btcstaking", "create-finality-provider", babylonPKHex, btcPKHex, popHex, masterPubRand, "--from=val", "--consumer-id", consumerId, "--moniker", moniker, "--identity", identity, "--website", website, "--security-contact", securityContract, "--details", details, "--commission-rate", commission.String(), } _, _, err = n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) require.NoError(n.t, err) diff --git a/test/e2e/configurer/chain/queries_btcstaking_integration.go b/test/e2e/configurer/chain/queries_btcstaking_integration.go index c48b74226..54efd7daa 100644 --- a/test/e2e/configurer/chain/queries_btcstaking_integration.go +++ b/test/e2e/configurer/chain/queries_btcstaking_integration.go @@ -12,37 +12,37 @@ import ( "github.com/stretchr/testify/require" ) -func (n *NodeConfig) QueryChainRegistryList(pagination *query.PageRequest) *bsctypes.QueryChainRegistryListResponse { +func (n *NodeConfig) QueryConsumerRegistryList(pagination *query.PageRequest) *bsctypes.QueryConsumerRegistryListResponse { queryParams := url.Values{} if pagination != nil { queryParams.Set("pagination.key", base64.URLEncoding.EncodeToString(pagination.Key)) queryParams.Set("pagination.limit", strconv.Itoa(int(pagination.Limit))) } - bz, err := n.QueryGRPCGateway("/babylon/btcstkconsumer/v1/chain_registry_list", queryParams) + bz, err := n.QueryGRPCGateway("/babylon/btcstkconsumer/v1/consumer_registry_list", queryParams) require.NoError(n.t, err) - var resp bsctypes.QueryChainRegistryListResponse + var resp bsctypes.QueryConsumerRegistryListResponse err = util.Cdc.UnmarshalJSON(bz, &resp) require.NoError(n.t, err) return &resp } -func (n *NodeConfig) QueryChainRegistry(consumerChainId string) []*bsctypes.ChainRegister { - path := fmt.Sprintf("/babylon/btcstkconsumer/v1/chains_registry/%s", consumerChainId) +func (n *NodeConfig) QueryConsumerRegistry(consumerId string) []*bsctypes.ConsumerRegister { + path := fmt.Sprintf("/babylon/btcstkconsumer/v1/consumers_registry/%s", consumerId) bz, err := n.QueryGRPCGateway(path, url.Values{}) require.NoError(n.t, err) - var resp bsctypes.QueryChainsRegistryResponse + var resp bsctypes.QueryConsumersRegistryResponse err = util.Cdc.UnmarshalJSON(bz, &resp) require.NoError(n.t, err) - return resp.ChainsRegister + return resp.ConsumersRegister } -func (n *NodeConfig) QueryConsumerFinalityProviders(consumerChainId string) []*bsctypes.FinalityProviderResponse { - path := fmt.Sprintf("/babylon/btcstkconsumer/v1/finality_providers/%s", consumerChainId) +func (n *NodeConfig) QueryConsumerFinalityProviders(consumerId string) []*bsctypes.FinalityProviderResponse { + path := fmt.Sprintf("/babylon/btcstkconsumer/v1/finality_providers/%s", consumerId) bz, err := n.QueryGRPCGateway(path, url.Values{}) require.NoError(n.t, err) @@ -53,8 +53,8 @@ func (n *NodeConfig) QueryConsumerFinalityProviders(consumerChainId string) []*b return resp.FinalityProviders } -func (n *NodeConfig) QueryConsumerFinalityProvider(consumerChainId, fpBtcPkHex string) *bsctypes.FinalityProviderResponse { - path := fmt.Sprintf("/babylon/btcstkconsumer/v1/finality_provider/%s/%s", consumerChainId, fpBtcPkHex) +func (n *NodeConfig) QueryConsumerFinalityProvider(consumerId, fpBtcPkHex string) *bsctypes.FinalityProviderResponse { + path := fmt.Sprintf("/babylon/btcstkconsumer/v1/finality_provider/%s/%s", consumerId, fpBtcPkHex) bz, err := n.QueryGRPCGateway(path, url.Values{}) require.NoError(n.t, err) diff --git a/testutil/datagen/btcstaking.go b/testutil/datagen/btcstaking.go index 60a6a30d0..a7d3821dd 100644 --- a/testutil/datagen/btcstaking.go +++ b/testutil/datagen/btcstaking.go @@ -75,7 +75,7 @@ func GenRandomFinalityProviderWithBTCBabylonSKs(r *rand.Rand, btcSK *btcec.Priva BtcPk: bip340PK, Addr: fpAddr.String(), Pop: pop, - ChainId: "", // TODO: parameterise + ConsumerId: "", // TODO: parameterise }, nil } diff --git a/testutil/datagen/btcstkconsumer.go b/testutil/datagen/btcstkconsumer.go index a2f5508d3..38f66e940 100644 --- a/testutil/datagen/btcstkconsumer.go +++ b/testutil/datagen/btcstkconsumer.go @@ -6,10 +6,10 @@ import ( bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" ) -func GenRandomChainRegister(r *rand.Rand) *bsctypes.ChainRegister { - return &bsctypes.ChainRegister{ - ChainId: "test-" + GenRandomHexStr(r, 10), - ChainName: GenRandomHexStr(r, 5), - ChainDescription: "Chain description: " + GenRandomHexStr(r, 15), +func GenRandomConsumerRegister(r *rand.Rand) *bsctypes.ConsumerRegister { + return &bsctypes.ConsumerRegister{ + ConsumerId: "test-" + GenRandomHexStr(r, 10), + ConsumerName: GenRandomHexStr(r, 5), + ConsumerDescription: "Chain description: " + GenRandomHexStr(r, 15), } } diff --git a/x/btcstaking/client/cli/tx.go b/x/btcstaking/client/cli/tx.go index 7ccb5aad2..e4bd4b1cc 100644 --- a/x/btcstaking/client/cli/tx.go +++ b/x/btcstaking/client/cli/tx.go @@ -19,7 +19,7 @@ import ( ) const ( - FlagConsumerChainId = "consumer-chain-id" + FlagConsumerId = "consumer-id" FlagMoniker = "moniker" FlagIdentity = "identity" FlagWebsite = "website" @@ -67,7 +67,7 @@ func NewCreateFinalityProviderCmd() *cobra.Command { fs := cmd.Flags() // get description - chainID, _ := fs.GetString(FlagConsumerChainId) + consumerID, _ := fs.GetString(FlagConsumerId) moniker, _ := fs.GetString(FlagMoniker) identity, _ := fs.GetString(FlagIdentity) website, _ := fs.GetString(FlagWebsite) @@ -105,7 +105,7 @@ func NewCreateFinalityProviderCmd() *cobra.Command { Commission: &rate, BtcPk: btcPK, Pop: pop, - ChainId: chainID, + ConsumerId: consumerID, } return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) @@ -113,7 +113,7 @@ func NewCreateFinalityProviderCmd() *cobra.Command { } fs := cmd.Flags() - fs.String(FlagConsumerChainId, "", "The finality provider's Consumer chain id, if any") + fs.String(FlagConsumerId, "", "The finality provider's consumer ID, if any") fs.String(FlagMoniker, "", "The finality provider's (optional) moniker") fs.String(FlagWebsite, "", "The finality provider's (optional) website") fs.String(FlagSecurityContact, "", "The finality provider's (optional) security contact email") diff --git a/x/btcstaking/keeper/btc_delegations.go b/x/btcstaking/keeper/btc_delegations.go index 7126bf6c1..827ed9149 100644 --- a/x/btcstaking/keeper/btc_delegations.go +++ b/x/btcstaking/keeper/btc_delegations.go @@ -165,8 +165,8 @@ func (k Keeper) validateRestakedFPs(ctx context.Context, fpBTCPKs []bbn.BIP340Pu // ensure the finality provider's registered epoch is finalised restakedToBabylon = true continue - } else if chainID, err := k.bscKeeper.GetConsumerFinalityProviderChain(ctx, &fpBTCPK); err == nil { - fp, err := k.bscKeeper.GetConsumerFinalityProvider(ctx, chainID, &fpBTCPK) + } else if consumerID, err := k.bscKeeper.GetConsumerOfFinalityProvider(ctx, &fpBTCPK); err == nil { + fp, err := k.bscKeeper.GetConsumerFinalityProvider(ctx, consumerID, &fpBTCPK) if err != nil { return false, err } diff --git a/x/btcstaking/keeper/grpc_query.go b/x/btcstaking/keeper/grpc_query.go index 10c88aa7b..d4552b071 100644 --- a/x/btcstaking/keeper/grpc_query.go +++ b/x/btcstaking/keeper/grpc_query.go @@ -72,15 +72,15 @@ func (k Keeper) FinalityProvider(c context.Context, req *types.QueryFinalityProv if err != nil { // Try in the btcstkconsumer module if k.bscKeeper.HasConsumerFinalityProvider(ctx, fpPK) { - fpChain, err := k.bscKeeper.GetConsumerFinalityProviderChain(ctx, fpPK) + fpConsumer, err := k.bscKeeper.GetConsumerOfFinalityProvider(ctx, fpPK) if err != nil { return nil, err } - fp, err := k.bscKeeper.GetConsumerFinalityProvider(ctx, fpChain, fpPK) + fp, err := k.bscKeeper.GetConsumerFinalityProvider(ctx, fpConsumer, fpPK) if err != nil { return nil, err } - // FPs for consumer chains are not stored in the voting power table + // FPs for consumers are not stored in the voting power table fpResp := types.NewFinalityProviderResponse(fp, 0, 0) return &types.QueryFinalityProviderResponse{FinalityProvider: fpResp}, nil } @@ -289,7 +289,7 @@ func (k Keeper) FinalityProviderDelegations(ctx context.Context, req *types.Quer return nil, err } } else if k.bscKeeper.HasConsumerFinalityProvider(ctx, fpPK) { - // this is a consumer chain finality provider + // this is a consumer finality provider btcDels, pageRes, err = k.GetBTCConsumerDelegatorDelegationsResponses(sdkCtx, fpPK, req.Pagination, currentWValue, btcHeight, covenantQuorum) if err != nil { return nil, err diff --git a/x/btcstaking/keeper/keeper_test.go b/x/btcstaking/keeper/keeper_test.go index d5d85f691..eb91029f7 100644 --- a/x/btcstaking/keeper/keeper_test.go +++ b/x/btcstaking/keeper/keeper_test.go @@ -143,7 +143,7 @@ func (h *Helper) CreateFinalityProvider(r *rand.Rand) (*btcec.PrivateKey, *btcec Commission: fp.Commission, BtcPk: fp.BtcPk, Pop: fp.Pop, - ChainId: "", + ConsumerId: "", } _, err = h.MsgServer.CreateFinalityProvider(h.Ctx, &msgNewFp) @@ -151,7 +151,7 @@ func (h *Helper) CreateFinalityProvider(r *rand.Rand) (*btcec.PrivateKey, *btcec return fpSK, fpPK, fp } -func (h *Helper) CreateConsumerChainFinalityProvider(r *rand.Rand, chainID string) (*btcec.PrivateKey, *btcec.PublicKey, *types.FinalityProvider, error) { +func (h *Helper) CreateConsumerFinalityProvider(r *rand.Rand, consumerID string) (*btcec.PrivateKey, *btcec.PublicKey, *types.FinalityProvider, error) { fpSK, fpPK, err := datagen.GenRandomBTCKeyPair(r) if err != nil { return nil, nil, nil, err @@ -160,17 +160,19 @@ func (h *Helper) CreateConsumerChainFinalityProvider(r *rand.Rand, chainID strin if err != nil { return nil, nil, nil, err } - fp.ChainId = chainID + fp.ConsumerId = consumerID registeredEpoch := uint64(10) h.CheckpointingKeeper.EXPECT().GetEpoch(gomock.Eq(h.Ctx)).Return(&etypes.Epoch{EpochNumber: registeredEpoch}).AnyTimes() + fp.ConsumerId = consumerID + msgNewFp := types.MsgCreateFinalityProvider{ Description: fp.Description, Commission: fp.Commission, BtcPk: fp.BtcPk, Pop: fp.Pop, - ChainId: fp.ChainId, + ConsumerId: fp.ConsumerId, } _, err = h.MsgServer.CreateFinalityProvider(h.Ctx, &msgNewFp) if err != nil { diff --git a/x/btcstaking/keeper/msg_server.go b/x/btcstaking/keeper/msg_server.go index 30952ac86..b5e48dbb6 100644 --- a/x/btcstaking/keeper/msg_server.go +++ b/x/btcstaking/keeper/msg_server.go @@ -86,11 +86,11 @@ func (ms msgServer) CreateFinalityProvider(goCtx context.Context, req *types.Msg return nil, types.ErrFpRegistered } - // Default chain id - chainID := req.GetChainId() - if chainID == "" { + // default consumer ID is Babylon's chain ID + consumerID := req.GetConsumerId() + if consumerID == "" { // canonical chain id - chainID = ctx.ChainID() + consumerID = ctx.ChainID() } // all good, add this finality provider @@ -100,19 +100,19 @@ func (ms msgServer) CreateFinalityProvider(goCtx context.Context, req *types.Msg Addr: fpAddr.String(), BtcPk: req.BtcPk, Pop: req.Pop, - ChainId: chainID, + ConsumerId: consumerID, } - if chainID == ctx.ChainID() { + if consumerID == ctx.ChainID() { ms.SetFinalityProvider(ctx, &fp) } else { // ensure finality provider does not already exist if ms.bscKeeper.HasConsumerFinalityProvider(ctx, req.BtcPk) { return nil, types.ErrFpRegistered } - // Check that chain is registered in the btcstkconsumer module - if !ms.bscKeeper.IsConsumerChainRegistered(ctx, chainID) { - return nil, types.ErrChainIDNotRegistered + // Check that consumer is registered in the btcstkconsumer module + if !ms.bscKeeper.IsConsumerRegistered(ctx, consumerID) { + return nil, types.ErrConsumerIDNotRegistered } ms.bscKeeper.SetConsumerFinalityProvider(ctx, &fp) } @@ -226,7 +226,7 @@ func (ms msgServer) CreateBTCDelegation(goCtx context.Context, req *types.MsgCre // - at least 1 one of them is a Babylon finality provider, // - are not slashed, and // - their registered epochs are finalised - // and then check whether the BTC stake is restaked to FPs of consumer chains + // and then check whether the BTC stake is restaked to FPs of consumers // TODO: ensure the BTC delegation does not restake to too many finality providers // (pending concrete design) restakedToConsumers, err := ms.validateRestakedFPs(ctx, req.FpBtcPkList) @@ -476,11 +476,11 @@ func (ms msgServer) CreateBTCDelegation(goCtx context.Context, req *types.MsgCre if err := ms.AddBTCDelegation(ctx, newBTCDel); err != nil { panic(fmt.Errorf("failed to add BTC delegation that has passed verification: %w", err)) } - // if this BTC delegation is restaked to consumer chains' FPs, add it to btcstkconsumer indexes + // if this BTC delegation is restaked to consumers' FPs, add it to btcstkconsumer indexes // TODO: revisit the relationship between BTC staking module and BTC staking consumer module if restakedToConsumers { if err := ms.IndexBTCConsumerDelegation(ctx, newBTCDel); err != nil { - panic(fmt.Errorf("failed to add BTC delegation restaked to consumer chains' finality providers despite it has passed verification: %w", err)) + panic(fmt.Errorf("failed to add BTC delegation restaked to consumers' finality providers despite it has passed verification: %w", err)) } } @@ -520,7 +520,7 @@ func (ms msgServer) AddCovenantSigs(goCtx context.Context, req *types.MsgAddCove return nil, err } - // check whether the BTC stake is restaked to FPs of consumer chains + // check whether the BTC stake is restaked to FPs of consumers _, err = ms.validateRestakedFPs(ctx, btcDel.FpBtcPkList) if err != nil { panic(err) // btcDel has passed verification and this can only be programming error @@ -671,7 +671,7 @@ func (ms msgServer) BTCUndelegate(goCtx context.Context, req *types.MsgBTCUndele return nil, err } - // check whether the BTC stake is restaked to FPs of consumer chains + // check whether the BTC stake is restaked to FPs of consumers _, err = ms.validateRestakedFPs(ctx, btcDel.FpBtcPkList) if err != nil { panic(err) // btcDel has passed verification and this can only be programming error diff --git a/x/btcstaking/keeper/restaking_test.go b/x/btcstaking/keeper/restaking_test.go index 0add2c8e5..ffe07d12a 100644 --- a/x/btcstaking/keeper/restaking_test.go +++ b/x/btcstaking/keeper/restaking_test.go @@ -37,22 +37,22 @@ func FuzzRestaking_RestakedBTCDelegation(f *testing.F) { // generate and insert new Babylon finality provider _, fpPK, _ := h.CreateFinalityProvider(r) /* - ensure that registering a consumer chain finality provider with non-existing - chain ID will fail + ensure that registering a consumer finality provider with non-existing + consumer ID will fail */ - _, _, _, err = h.CreateConsumerChainFinalityProvider(r, "non-existing chain ID") + _, _, _, err = h.CreateConsumerFinalityProvider(r, "non-existing chain ID") h.Error(err) /* - register a new consumer chain and create a new finality provider under it + register a new consumer and create a new finality provider under it ensure it's correctly generated */ - chainRegister := datagen.GenRandomChainRegister(r) - h.BTCStkConsumerKeeper.SetChainRegister(h.Ctx, chainRegister) - _, czFPPK, czFP, err := h.CreateConsumerChainFinalityProvider(r, chainRegister.ChainId) + consumerRegister := datagen.GenRandomConsumerRegister(r) + h.BTCStkConsumerKeeper.SetConsumerRegister(h.Ctx, consumerRegister) + _, czFPPK, czFP, err := h.CreateConsumerFinalityProvider(r, consumerRegister.ConsumerId) h.NoError(err) czFPBTCPK := bbn.NewBIP340PubKeyFromBTCPK(czFPPK) - czFP2, err := h.BTCStkConsumerKeeper.GetConsumerFinalityProvider(h.Ctx, chainRegister.ChainId, czFPBTCPK) + czFP2, err := h.BTCStkConsumerKeeper.GetConsumerFinalityProvider(h.Ctx, consumerRegister.ConsumerId, czFPBTCPK) h.NoError(err) require.Equal(t, czFP, czFP2) @@ -86,7 +86,7 @@ func FuzzRestaking_RestakedBTCDelegation(f *testing.F) { require.True(t, errors.Is(err, types.ErrNoBabylonFPRestaked), err) /* - happy case -- restaking to a Babylon fp and a consumer chain fp + happy case -- restaking to a Babylon fp and a consumer fp */ _, _, _, msgBTCDel, actualDel, err := h.CreateDelegation( r, @@ -110,7 +110,7 @@ func FuzzRestaking_RestakedBTCDelegation(f *testing.F) { }) } -func FuzzFinalityProviderDelegations_RestakingConsumerChains(f *testing.F) { +func FuzzFinalityProviderDelegations_RestakingConsumers(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -128,15 +128,15 @@ func FuzzFinalityProviderDelegations_RestakingConsumerChains(f *testing.F) { changeAddress, err := datagen.GenRandomBTCAddress(r, h.Net) h.NoError(err) - // register a new consumer chain - chainRegister := datagen.GenRandomChainRegister(r) - h.BTCStkConsumerKeeper.SetChainRegister(h.Ctx, chainRegister) + // register a new consumer + consumerRegister := datagen.GenRandomConsumerRegister(r) + h.BTCStkConsumerKeeper.SetConsumerRegister(h.Ctx, consumerRegister) // generate and insert new Babylon finality provider _, fpPK, fp := h.CreateFinalityProvider(r) - // generate and insert new consumer chain finality provider - _, czFPPK, czFP, err := h.CreateConsumerChainFinalityProvider(r, chainRegister.ChainId) + // generate and insert new consumer finality provider + _, czFPPK, czFP, err := h.CreateConsumerFinalityProvider(r, consumerRegister.ConsumerId) h.NoError(err) // Generate a random number of BTC delegations under this finality provider @@ -162,7 +162,7 @@ func FuzzFinalityProviderDelegations_RestakingConsumerChains(f *testing.F) { /* Test BTC delegator delegations under the Babylon finality provider - or the consumer chain finality provider + or the consumer finality provider */ // Generate a page request with a limit and a nil key @@ -170,7 +170,7 @@ func FuzzFinalityProviderDelegations_RestakingConsumerChains(f *testing.F) { limit := datagen.RandomInt(r, len(expectedBtcDelsMap)) + 1 pagination := constructRequestWithLimit(r, limit) - // the tested finality provider is under Babylon or consumer chain + // the tested finality provider is under Babylon or consumer testedFP := fp if datagen.OneInN(r, 2) { testedFP = czFP @@ -193,7 +193,7 @@ func FuzzFinalityProviderDelegations_RestakingConsumerChains(f *testing.F) { btcDel := btcDels.Dels[0] require.Len(t, btcDel.FpBtcPkList, 2) require.Equal(t, fp.BtcPk, &btcDel.FpBtcPkList[0]) // Babylon finality provider - require.Equal(t, czFP.BtcPk, &btcDel.FpBtcPkList[1]) // consumer chain finality provider + require.Equal(t, czFP.BtcPk, &btcDel.FpBtcPkList[1]) // consumer finality provider // Check if the pk exists in the map _, ok := expectedBtcDelsMap[btcDel.BtcPk.MarshalHex()] require.True(t, ok) diff --git a/x/btcstaking/types/btcstaking.pb.go b/x/btcstaking/types/btcstaking.pb.go index 7c66ad022..fc8b3819c 100644 --- a/x/btcstaking/types/btcstaking.pb.go +++ b/x/btcstaking/types/btcstaking.pb.go @@ -90,9 +90,9 @@ type FinalityProvider struct { // the finality provider is slashed. // if it's 0 then the finality provider is not slashed SlashedBtcHeight uint64 `protobuf:"varint,9,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` - // chain_id is the chain id of the chain the finality provider is operating on. + // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. - ChainId string `protobuf:"bytes,10,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ConsumerId string `protobuf:"bytes,10,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` } func (m *FinalityProvider) Reset() { *m = FinalityProvider{} } @@ -163,9 +163,9 @@ func (m *FinalityProvider) GetSlashedBtcHeight() uint64 { return 0 } -func (m *FinalityProvider) GetChainId() string { +func (m *FinalityProvider) GetConsumerId() string { if m != nil { - return m.ChainId + return m.ConsumerId } return "" } @@ -754,83 +754,83 @@ func init() { } var fileDescriptor_3851ae95ccfaf7db = []byte{ - // 1206 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xcf, 0xda, 0x8e, 0x93, 0x3c, 0xdb, 0x8d, 0x3b, 0x4d, 0xd3, 0x4d, 0x23, 0x92, 0x60, 0x4a, - 0x15, 0x41, 0x63, 0xb7, 0x69, 0x41, 0xf4, 0xc0, 0x21, 0x8e, 0x53, 0x6a, 0xb5, 0x4d, 0xcd, 0xda, - 0x29, 0x02, 0x24, 0x56, 0xe3, 0xdd, 0xc9, 0x7a, 0x64, 0x7b, 0x67, 0xd9, 0x19, 0x1b, 0xe7, 0x1b, - 0x70, 0x41, 0xe2, 0xca, 0x9d, 0x8f, 0xd0, 0xcf, 0x80, 0x38, 0x56, 0x3d, 0xa1, 0x1c, 0x22, 0xd4, - 0x9c, 0xf9, 0x0e, 0x68, 0x66, 0xd7, 0xbb, 0xeb, 0x92, 0x94, 0xb6, 0xce, 0xcd, 0xf3, 0xfe, 0xfd, - 0xde, 0xbc, 0xdf, 0xcf, 0x6f, 0x16, 0x6e, 0xb6, 0x71, 0xfb, 0xa8, 0xc7, 0xdc, 0x4a, 0x5b, 0x58, - 0x5c, 0xe0, 0x2e, 0x75, 0x9d, 0xca, 0xf0, 0x4e, 0xe2, 0x54, 0xf6, 0x7c, 0x26, 0x18, 0xba, 0x1a, - 0xc6, 0x95, 0x13, 0x9e, 0xe1, 0x9d, 0xeb, 0x4b, 0x0e, 0x73, 0x98, 0x8a, 0xa8, 0xc8, 0x5f, 0x41, - 0xf0, 0xf5, 0x15, 0x8b, 0xf1, 0x3e, 0xe3, 0x66, 0xe0, 0x08, 0x0e, 0xa1, 0xeb, 0x46, 0x70, 0xaa, - 0xc4, 0x58, 0x6d, 0x22, 0xf0, 0x9d, 0xca, 0x04, 0xda, 0xf5, 0xf5, 0xb3, 0xbb, 0xf2, 0x98, 0x17, - 0x04, 0x94, 0x4e, 0xd3, 0x50, 0x7c, 0x40, 0x5d, 0xdc, 0xa3, 0xe2, 0xa8, 0xe1, 0xb3, 0x21, 0xb5, - 0x89, 0x8f, 0x6e, 0x41, 0x06, 0xdb, 0xb6, 0xaf, 0x6b, 0x1b, 0xda, 0xe6, 0x42, 0x55, 0x7f, 0xf9, - 0x7c, 0x6b, 0x29, 0xc4, 0xde, 0xb1, 0x6d, 0x9f, 0x70, 0xde, 0x14, 0x3e, 0x75, 0x1d, 0x43, 0x45, - 0xa1, 0x3d, 0xc8, 0xd9, 0x84, 0x5b, 0x3e, 0xf5, 0x04, 0x65, 0xae, 0x9e, 0xda, 0xd0, 0x36, 0x73, - 0xdb, 0x1f, 0x95, 0xc3, 0x8c, 0xf8, 0x8e, 0xaa, 0xbf, 0x72, 0x2d, 0x0e, 0x35, 0x92, 0x79, 0xe8, - 0x09, 0x80, 0xc5, 0xfa, 0x7d, 0xca, 0xb9, 0xac, 0x92, 0x56, 0xd0, 0x5b, 0xc7, 0x27, 0xeb, 0xab, - 0x41, 0x21, 0x6e, 0x77, 0xcb, 0x94, 0x55, 0xfa, 0x58, 0x74, 0xca, 0x8f, 0x89, 0x83, 0xad, 0xa3, - 0x1a, 0xb1, 0x5e, 0x3e, 0xdf, 0x82, 0x10, 0xa7, 0x46, 0x2c, 0x23, 0x51, 0x00, 0x3d, 0x81, 0x6c, - 0x5b, 0x58, 0xa6, 0xd7, 0xd5, 0x33, 0x1b, 0xda, 0x66, 0xbe, 0xfa, 0xf9, 0xf1, 0xc9, 0xfa, 0xb6, - 0x43, 0x45, 0x67, 0xd0, 0x2e, 0x5b, 0xac, 0x5f, 0x09, 0x07, 0x63, 0x75, 0x30, 0x75, 0xc7, 0x87, - 0x8a, 0x38, 0xf2, 0x08, 0x2f, 0x57, 0xeb, 0x8d, 0xbb, 0xf7, 0x6e, 0x37, 0x06, 0xed, 0x47, 0xe4, - 0xc8, 0x98, 0x6d, 0x0b, 0xab, 0xd1, 0x45, 0x5f, 0x42, 0xda, 0x63, 0x9e, 0x3e, 0xab, 0x2e, 0xf7, - 0x69, 0xf9, 0x4c, 0x12, 0xcb, 0x0d, 0x9f, 0xb1, 0xc3, 0xa7, 0x87, 0x0d, 0xc6, 0x39, 0x51, 0x5d, - 0x54, 0x5b, 0xbb, 0x86, 0xcc, 0x43, 0xf7, 0x60, 0x99, 0xf7, 0x30, 0xef, 0x10, 0xdb, 0x0c, 0x53, - 0xcd, 0x0e, 0xa1, 0x4e, 0x47, 0xe8, 0xd9, 0x0d, 0x6d, 0x33, 0x63, 0x2c, 0x85, 0xde, 0x6a, 0xe0, - 0x7c, 0xa8, 0x7c, 0xe8, 0x16, 0xa0, 0x28, 0x4b, 0x58, 0xe3, 0x8c, 0x05, 0x95, 0x51, 0x1c, 0x67, - 0x08, 0x2b, 0x8c, 0x5e, 0x81, 0x79, 0x75, 0x1b, 0x93, 0xda, 0x3a, 0xc8, 0xf1, 0x19, 0x73, 0xea, - 0x5c, 0xb7, 0x4b, 0x3f, 0xa7, 0x40, 0x7f, 0x9d, 0xe5, 0x6f, 0xa8, 0xe8, 0x3c, 0x21, 0x02, 0x27, - 0x26, 0xa5, 0x5d, 0xc4, 0xa4, 0x96, 0x21, 0x1b, 0x36, 0x9a, 0x52, 0x8d, 0x86, 0x27, 0xf4, 0x21, - 0xe4, 0x87, 0x4c, 0x50, 0xd7, 0x31, 0x3d, 0xf6, 0x13, 0xf1, 0x15, 0xc3, 0x19, 0x23, 0x17, 0xd8, - 0x1a, 0xd2, 0xf4, 0x86, 0x29, 0x65, 0xde, 0x79, 0x4a, 0xb3, 0x67, 0x4f, 0xa9, 0xf4, 0x4f, 0x16, - 0x0a, 0xd5, 0xd6, 0x6e, 0x8d, 0xf4, 0x88, 0x83, 0x95, 0xf0, 0xee, 0x43, 0x4e, 0x72, 0x48, 0x7c, - 0xf3, 0xad, 0x44, 0x0f, 0x41, 0xb0, 0x34, 0x26, 0x46, 0x97, 0xba, 0x40, 0x91, 0xa5, 0xdf, 0x53, - 0x64, 0xdf, 0xc3, 0xa5, 0x43, 0xcf, 0x0c, 0x1a, 0x32, 0x7b, 0x94, 0xcb, 0xb1, 0xa5, 0xa7, 0xe8, - 0x2a, 0x77, 0xe8, 0x55, 0x65, 0x5f, 0x8f, 0x29, 0x57, 0xf4, 0x71, 0x81, 0x7d, 0x31, 0x39, 0xdf, - 0x9c, 0xb2, 0x85, 0x44, 0x7c, 0x00, 0x40, 0x5c, 0x7b, 0x52, 0xd8, 0x0b, 0xc4, 0xb5, 0x43, 0xf7, - 0x2a, 0x2c, 0x08, 0x26, 0x70, 0xcf, 0xe4, 0x58, 0xe8, 0x73, 0xca, 0x3b, 0xaf, 0x0c, 0x4d, 0xac, - 0x72, 0xc3, 0x3b, 0x9a, 0x62, 0xa4, 0xcf, 0xcb, 0x69, 0x1a, 0x0b, 0xa1, 0xa5, 0x35, 0x52, 0x1c, - 0x87, 0x6e, 0x36, 0x10, 0xde, 0x40, 0x98, 0xd4, 0x1e, 0xa9, 0x7f, 0x42, 0xc1, 0x28, 0x86, 0x9e, - 0xa7, 0xca, 0x51, 0xb7, 0x47, 0x68, 0x1b, 0x72, 0x8a, 0xf7, 0xb0, 0x1a, 0x28, 0x6e, 0x2e, 0x1f, - 0x9f, 0xac, 0x4b, 0xe6, 0x9b, 0xa1, 0xa7, 0x35, 0x32, 0x80, 0x47, 0xbf, 0xd1, 0x0f, 0x50, 0xb0, - 0x03, 0x4d, 0x30, 0xdf, 0xe4, 0xd4, 0xd1, 0x73, 0x2a, 0xeb, 0xfe, 0xf1, 0xc9, 0xfa, 0x67, 0xef, - 0x32, 0xbb, 0x26, 0x75, 0x5c, 0x2c, 0x06, 0x3e, 0x31, 0xf2, 0x51, 0xbd, 0x26, 0x75, 0xd0, 0x01, - 0x14, 0x2c, 0x36, 0x24, 0x2e, 0x76, 0x85, 0x2c, 0xcf, 0xf5, 0xfc, 0x46, 0x7a, 0x33, 0xb7, 0x7d, - 0xfb, 0x1c, 0x96, 0x77, 0xc3, 0xd8, 0x1d, 0x1b, 0x7b, 0x41, 0x85, 0xa0, 0x2a, 0x37, 0xf2, 0xe3, - 0x32, 0x4d, 0xea, 0x70, 0xf4, 0x31, 0x5c, 0x1a, 0xb8, 0x6d, 0xe6, 0xda, 0xea, 0xae, 0xb4, 0x4f, - 0xf4, 0x82, 0x1a, 0x4a, 0x21, 0xb2, 0xb6, 0x68, 0x9f, 0xa0, 0xaf, 0xa1, 0x28, 0x75, 0x31, 0x70, - 0xed, 0x48, 0xf7, 0xfa, 0x25, 0x25, 0xb3, 0x9b, 0xe7, 0x34, 0x50, 0x6d, 0xed, 0x1e, 0x24, 0xa2, - 0x8d, 0xc5, 0xb6, 0xb0, 0x92, 0x06, 0x89, 0xec, 0x61, 0x1f, 0xf7, 0xb9, 0x39, 0x24, 0xbe, 0xda, - 0xd9, 0x8b, 0x01, 0x72, 0x60, 0x7d, 0x16, 0x18, 0x4b, 0xbf, 0x65, 0x60, 0xf1, 0xb5, 0x5a, 0x52, - 0x4b, 0x89, 0xa6, 0x47, 0xc1, 0xde, 0x31, 0x72, 0x71, 0xcb, 0xff, 0xa1, 0x30, 0xf5, 0x36, 0x14, - 0xfe, 0x08, 0xd7, 0x62, 0x0a, 0x63, 0x00, 0x49, 0x66, 0x7a, 0x5a, 0x32, 0xaf, 0x46, 0x95, 0x0f, - 0xc6, 0x85, 0x25, 0xab, 0x0c, 0x96, 0x13, 0xaa, 0x19, 0x37, 0x2c, 0x11, 0x33, 0xd3, 0x22, 0x2e, - 0xc5, 0xf2, 0x09, 0xeb, 0x4a, 0xc0, 0x43, 0x58, 0x8e, 0x65, 0x94, 0xc0, 0xe3, 0xfa, 0xec, 0x7b, - 0xea, 0x69, 0x29, 0xd2, 0x53, 0x0c, 0xc3, 0x91, 0x05, 0xab, 0x11, 0xce, 0xc4, 0x28, 0x83, 0xc5, - 0x92, 0x55, 0x60, 0x37, 0xce, 0x01, 0x8b, 0xaa, 0xd7, 0xdd, 0x43, 0x66, 0xe8, 0xe3, 0x42, 0xc9, - 0xc9, 0xc9, 0x9d, 0x52, 0x6a, 0xc2, 0xb5, 0x78, 0x15, 0x33, 0x3f, 0xde, 0xc9, 0x1c, 0x7d, 0x01, - 0x19, 0x9b, 0xf4, 0xb8, 0xae, 0xbd, 0x11, 0x68, 0x62, 0x91, 0x1b, 0x2a, 0xa3, 0xb4, 0x0f, 0xab, - 0x67, 0x17, 0xad, 0xbb, 0x36, 0x19, 0xa1, 0x0a, 0x2c, 0xc5, 0x8b, 0xc6, 0xec, 0x60, 0xde, 0x09, - 0x6e, 0x24, 0x81, 0xf2, 0xc6, 0xe5, 0x68, 0xe5, 0x3c, 0xc4, 0xbc, 0xa3, 0x9a, 0xfc, 0x5d, 0x83, - 0xc2, 0xc4, 0x85, 0xd0, 0x03, 0x48, 0x4d, 0xfd, 0x58, 0xa6, 0xbc, 0x2e, 0x7a, 0x04, 0x69, 0xa9, - 0x94, 0xd4, 0xb4, 0x4a, 0x91, 0x55, 0x4a, 0xbf, 0x68, 0xb0, 0x72, 0x2e, 0xc9, 0xf2, 0xa1, 0xb2, - 0xd8, 0xf0, 0x02, 0xde, 0x78, 0x8b, 0x0d, 0x1b, 0x5d, 0xf9, 0x07, 0xc6, 0x01, 0x46, 0xa0, 0xbd, - 0x94, 0x1a, 0x5e, 0x0e, 0x47, 0xb8, 0xbc, 0xf4, 0x87, 0x06, 0x2b, 0x4d, 0xd2, 0x23, 0x96, 0xa0, - 0x43, 0x32, 0x96, 0xd6, 0x9e, 0xfc, 0xf2, 0x70, 0x2d, 0x82, 0x6e, 0xc2, 0xe2, 0x6b, 0x2c, 0x04, - 0xef, 0xae, 0x51, 0x98, 0x20, 0x00, 0x19, 0xb0, 0x10, 0x3d, 0x69, 0x53, 0xbe, 0xb1, 0x73, 0xe1, - 0x6b, 0x86, 0xb6, 0xe0, 0x8a, 0x4f, 0xa4, 0x26, 0x7d, 0x62, 0x9b, 0x61, 0x75, 0xde, 0x0d, 0x56, - 0x84, 0x51, 0x8c, 0x5c, 0x0f, 0x64, 0x78, 0xb3, 0xfb, 0xc9, 0x1e, 0x5c, 0x99, 0x90, 0x59, 0x53, - 0x60, 0x31, 0xe0, 0x28, 0x07, 0x73, 0x8d, 0xbd, 0xfd, 0x5a, 0x7d, 0xff, 0xab, 0xe2, 0x0c, 0x02, - 0xc8, 0xee, 0xec, 0xb6, 0xea, 0xcf, 0xf6, 0x8a, 0x1a, 0xca, 0xc3, 0xfc, 0xc1, 0x7e, 0xf5, 0xe9, - 0x7e, 0x6d, 0xaf, 0x56, 0x4c, 0xa1, 0x39, 0x48, 0xef, 0xec, 0x7f, 0x5b, 0x4c, 0x57, 0x1f, 0xff, - 0xf9, 0x6a, 0x4d, 0x7b, 0xf1, 0x6a, 0x4d, 0xfb, 0xfb, 0xd5, 0x9a, 0xf6, 0xeb, 0xe9, 0xda, 0xcc, - 0x8b, 0xd3, 0xb5, 0x99, 0xbf, 0x4e, 0xd7, 0x66, 0xbe, 0xfb, 0xdf, 0xcb, 0x8c, 0x92, 0x5f, 0xef, - 0xea, 0x66, 0xed, 0xac, 0xfa, 0x7a, 0xbf, 0xfb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc4, 0x63, - 0xb8, 0x38, 0x76, 0x0c, 0x00, 0x00, + // 1212 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x6f, 0x13, 0xc7, + 0x1b, 0xce, 0xda, 0x8e, 0x43, 0xde, 0xb5, 0x89, 0x19, 0x42, 0x58, 0x88, 0x7e, 0x49, 0x7e, 0x2e, + 0x45, 0x51, 0x4b, 0x6c, 0x08, 0xb4, 0x2a, 0x87, 0x1e, 0xe2, 0x38, 0x14, 0x0b, 0x08, 0xee, 0xda, + 0xa1, 0x6a, 0x2b, 0x75, 0x35, 0xde, 0x9d, 0xac, 0x47, 0xb6, 0x77, 0xb6, 0x3b, 0x63, 0xd7, 0xf9, + 0x06, 0xbd, 0x54, 0xea, 0xb5, 0xf7, 0x7e, 0x04, 0x3e, 0x43, 0xd5, 0x23, 0xe2, 0x54, 0xe5, 0x10, + 0x55, 0x70, 0xea, 0xa1, 0xdf, 0xa1, 0x9a, 0xd9, 0xf5, 0xee, 0x9a, 0x26, 0x14, 0x30, 0x37, 0xcf, + 0xfb, 0xef, 0x79, 0xe7, 0x7d, 0x1e, 0xbf, 0xb3, 0x70, 0xbd, 0x83, 0x3b, 0x47, 0x7d, 0xe6, 0x55, + 0x3b, 0xc2, 0xe6, 0x02, 0xf7, 0xa8, 0xe7, 0x56, 0x47, 0xb7, 0x52, 0xa7, 0x8a, 0x1f, 0x30, 0xc1, + 0xd0, 0xa5, 0x28, 0xae, 0x92, 0xf2, 0x8c, 0x6e, 0x5d, 0x5d, 0x76, 0x99, 0xcb, 0x54, 0x44, 0x55, + 0xfe, 0x0a, 0x83, 0xaf, 0x5e, 0xb1, 0x19, 0x1f, 0x30, 0x6e, 0x85, 0x8e, 0xf0, 0x10, 0xb9, 0xae, + 0x85, 0xa7, 0x6a, 0x82, 0xd5, 0x21, 0x02, 0xdf, 0xaa, 0x4e, 0xa1, 0x5d, 0x5d, 0x3f, 0xbd, 0x2b, + 0x9f, 0xf9, 0x61, 0x40, 0xf9, 0xaf, 0x2c, 0x94, 0xee, 0x51, 0x0f, 0xf7, 0xa9, 0x38, 0x6a, 0x06, + 0x6c, 0x44, 0x1d, 0x12, 0xa0, 0x1b, 0x90, 0xc3, 0x8e, 0x13, 0x18, 0xda, 0x86, 0xb6, 0xb9, 0x58, + 0x33, 0x9e, 0x3f, 0xdd, 0x5a, 0x8e, 0xb0, 0x77, 0x1c, 0x27, 0x20, 0x9c, 0xb7, 0x44, 0x40, 0x3d, + 0xd7, 0x54, 0x51, 0x68, 0x0f, 0x74, 0x87, 0x70, 0x3b, 0xa0, 0xbe, 0xa0, 0xcc, 0x33, 0x32, 0x1b, + 0xda, 0xa6, 0xbe, 0xfd, 0x41, 0x25, 0xca, 0x48, 0xee, 0xa8, 0xfa, 0xab, 0xd4, 0x93, 0x50, 0x33, + 0x9d, 0x87, 0x1e, 0x01, 0xd8, 0x6c, 0x30, 0xa0, 0x9c, 0xcb, 0x2a, 0x59, 0x05, 0xbd, 0x75, 0x7c, + 0xb2, 0xbe, 0x1a, 0x16, 0xe2, 0x4e, 0xaf, 0x42, 0x59, 0x75, 0x80, 0x45, 0xb7, 0xf2, 0x90, 0xb8, + 0xd8, 0x3e, 0xaa, 0x13, 0xfb, 0xf9, 0xd3, 0x2d, 0x88, 0x70, 0xea, 0xc4, 0x36, 0x53, 0x05, 0xd0, + 0x23, 0xc8, 0x77, 0x84, 0x6d, 0xf9, 0x3d, 0x23, 0xb7, 0xa1, 0x6d, 0x16, 0x6a, 0x9f, 0x1e, 0x9f, + 0xac, 0x6f, 0xbb, 0x54, 0x74, 0x87, 0x9d, 0x8a, 0xcd, 0x06, 0xd5, 0x68, 0x30, 0x76, 0x17, 0x53, + 0x6f, 0x72, 0xa8, 0x8a, 0x23, 0x9f, 0xf0, 0x4a, 0xad, 0xd1, 0xbc, 0x7d, 0xe7, 0x66, 0x73, 0xd8, + 0x79, 0x40, 0x8e, 0xcc, 0xf9, 0x8e, 0xb0, 0x9b, 0x3d, 0xf4, 0x39, 0x64, 0x7d, 0xe6, 0x1b, 0xf3, + 0xea, 0x72, 0x1f, 0x57, 0x4e, 0x25, 0xb1, 0xd2, 0x0c, 0x18, 0x3b, 0x7c, 0x7c, 0xd8, 0x64, 0x9c, + 0x13, 0xd5, 0x45, 0xad, 0xbd, 0x6b, 0xca, 0x3c, 0x74, 0x07, 0x56, 0x78, 0x1f, 0xf3, 0x2e, 0x71, + 0xac, 0x28, 0xd5, 0xea, 0x12, 0xea, 0x76, 0x85, 0x91, 0xdf, 0xd0, 0x36, 0x73, 0xe6, 0x72, 0xe4, + 0xad, 0x85, 0xce, 0xfb, 0xca, 0x87, 0x6e, 0x00, 0x8a, 0xb3, 0x84, 0x3d, 0xc9, 0x58, 0x54, 0x19, + 0xa5, 0x49, 0x86, 0xb0, 0xa3, 0xe8, 0x75, 0xd0, 0x6d, 0xe6, 0xf1, 0xe1, 0x80, 0x04, 0x16, 0x75, + 0x0c, 0x90, 0x13, 0x94, 0x23, 0x09, 0x4d, 0x0d, 0xa7, 0xfc, 0x63, 0x06, 0x8c, 0x57, 0xb9, 0xfe, + 0x8a, 0x8a, 0xee, 0x23, 0x22, 0x70, 0x6a, 0x5e, 0xda, 0xfb, 0x98, 0xd7, 0x0a, 0xe4, 0xa3, 0x76, + 0x33, 0xaa, 0xdd, 0xe8, 0x84, 0xfe, 0x0f, 0x85, 0x11, 0x13, 0xd4, 0x73, 0x2d, 0x9f, 0xfd, 0x40, + 0x02, 0xc5, 0x73, 0xce, 0xd4, 0x43, 0x5b, 0x53, 0x9a, 0x5e, 0x33, 0xab, 0xdc, 0x5b, 0xcf, 0x6a, + 0xfe, 0xf4, 0x59, 0x95, 0xff, 0xce, 0x43, 0xb1, 0xd6, 0xde, 0xad, 0x93, 0x3e, 0x71, 0xb1, 0x92, + 0xdf, 0x5d, 0xd0, 0x25, 0x93, 0x24, 0xb0, 0xde, 0x48, 0xfa, 0x10, 0x06, 0x4b, 0x63, 0x6a, 0x74, + 0x99, 0xf7, 0x28, 0xb5, 0xec, 0x3b, 0x4a, 0xed, 0x5b, 0x38, 0x7f, 0xe8, 0x5b, 0x61, 0x43, 0x56, + 0x9f, 0x72, 0x39, 0xb6, 0xec, 0x0c, 0x5d, 0xe9, 0x87, 0x7e, 0x4d, 0xf6, 0xf5, 0x90, 0x72, 0x45, + 0x1f, 0x17, 0x38, 0x10, 0xd3, 0xf3, 0xd5, 0x95, 0x2d, 0x22, 0xe2, 0x7f, 0x00, 0xc4, 0x73, 0xa6, + 0xe5, 0xbd, 0x48, 0x3c, 0x27, 0x72, 0xaf, 0xc2, 0xa2, 0x60, 0x02, 0xf7, 0x2d, 0x8e, 0x85, 0xb1, + 0xa0, 0xbc, 0xe7, 0x94, 0xa1, 0x85, 0x55, 0x6e, 0x74, 0x47, 0x4b, 0x8c, 0x8d, 0x73, 0x72, 0x9a, + 0xe6, 0x62, 0x64, 0x69, 0x8f, 0x15, 0xc7, 0x91, 0x9b, 0x0d, 0x85, 0x3f, 0x14, 0x16, 0x75, 0xc6, + 0xea, 0xff, 0x50, 0x34, 0x4b, 0x91, 0xe7, 0xb1, 0x72, 0x34, 0x9c, 0x31, 0xda, 0x06, 0x5d, 0xf1, + 0x1e, 0x55, 0x03, 0xc5, 0xcd, 0x85, 0xe3, 0x93, 0x75, 0xc9, 0x7c, 0x2b, 0xf2, 0xb4, 0xc7, 0x26, + 0xf0, 0xf8, 0x37, 0xfa, 0x0e, 0x8a, 0x4e, 0xa8, 0x09, 0x16, 0x58, 0x9c, 0xba, 0x86, 0xae, 0xb2, + 0xee, 0x1e, 0x9f, 0xac, 0x7f, 0xf2, 0x36, 0xb3, 0x6b, 0x51, 0xd7, 0xc3, 0x62, 0x18, 0x10, 0xb3, + 0x10, 0xd7, 0x6b, 0x51, 0x17, 0x1d, 0x40, 0xd1, 0x66, 0x23, 0xe2, 0x61, 0x4f, 0xc8, 0xf2, 0xdc, + 0x28, 0x6c, 0x64, 0x37, 0xf5, 0xed, 0x9b, 0x67, 0xb0, 0xbc, 0x1b, 0xc5, 0xee, 0x38, 0xd8, 0x0f, + 0x2b, 0x84, 0x55, 0xb9, 0x59, 0x98, 0x94, 0x69, 0x51, 0x97, 0xa3, 0x0f, 0xe1, 0xfc, 0xd0, 0xeb, + 0x30, 0xcf, 0x51, 0x77, 0xa5, 0x03, 0x62, 0x14, 0xd5, 0x50, 0x8a, 0xb1, 0xb5, 0x4d, 0x07, 0x04, + 0x7d, 0x09, 0x25, 0xa9, 0x8b, 0xa1, 0xe7, 0xc4, 0xba, 0x37, 0xce, 0x2b, 0x99, 0x5d, 0x3f, 0xa3, + 0x81, 0x5a, 0x7b, 0xf7, 0x20, 0x15, 0x6d, 0x2e, 0x75, 0x84, 0x9d, 0x36, 0x48, 0x64, 0x1f, 0x07, + 0x78, 0xc0, 0xad, 0x11, 0x09, 0xd4, 0xe6, 0x5e, 0x0a, 0x91, 0x43, 0xeb, 0x93, 0xd0, 0x58, 0xfe, + 0x25, 0x07, 0x4b, 0xaf, 0xd4, 0x92, 0x5a, 0x4a, 0x35, 0x3d, 0x0e, 0xf7, 0x8e, 0xa9, 0x27, 0x2d, + 0xff, 0x8b, 0xc2, 0xcc, 0x9b, 0x50, 0xf8, 0x3d, 0x5c, 0x4e, 0x28, 0x4c, 0x00, 0x24, 0x99, 0xd9, + 0x59, 0xc9, 0xbc, 0x14, 0x57, 0x3e, 0x98, 0x14, 0x96, 0xac, 0x32, 0x58, 0x49, 0xa9, 0x66, 0xd2, + 0xb0, 0x44, 0xcc, 0xcd, 0x8a, 0xb8, 0x9c, 0xc8, 0x27, 0xaa, 0x2b, 0x01, 0x0f, 0x61, 0x25, 0x91, + 0x51, 0x0a, 0x8f, 0x1b, 0xf3, 0xef, 0xa8, 0xa7, 0xe5, 0x58, 0x4f, 0x09, 0x0c, 0x47, 0x36, 0xac, + 0xc6, 0x38, 0x53, 0xa3, 0x0c, 0x17, 0x4b, 0x5e, 0x81, 0x5d, 0x3b, 0x03, 0x2c, 0xae, 0xde, 0xf0, + 0x0e, 0x99, 0x69, 0x4c, 0x0a, 0xa5, 0x27, 0x27, 0x77, 0x4a, 0xb9, 0x05, 0x97, 0x93, 0x55, 0xcc, + 0x82, 0x64, 0x27, 0x73, 0xf4, 0x19, 0xe4, 0x1c, 0xd2, 0xe7, 0x86, 0xf6, 0x5a, 0xa0, 0xa9, 0x45, + 0x6e, 0xaa, 0x8c, 0xf2, 0x3e, 0xac, 0x9e, 0x5e, 0xb4, 0xe1, 0x39, 0x64, 0x8c, 0xaa, 0xb0, 0x9c, + 0x2c, 0x1a, 0xab, 0x8b, 0x79, 0x37, 0xbc, 0x91, 0x04, 0x2a, 0x98, 0x17, 0xe2, 0x95, 0x73, 0x1f, + 0xf3, 0xae, 0x6a, 0xf2, 0x57, 0x0d, 0x8a, 0x53, 0x17, 0x42, 0xf7, 0x20, 0x33, 0xf3, 0x63, 0x99, + 0xf1, 0x7b, 0xe8, 0x01, 0x64, 0xa5, 0x52, 0x32, 0xb3, 0x2a, 0x45, 0x56, 0x29, 0xff, 0xa4, 0xc1, + 0x95, 0x33, 0x49, 0x96, 0x0f, 0x95, 0xcd, 0x46, 0xef, 0xe1, 0x8d, 0xb7, 0xd9, 0xa8, 0xd9, 0x93, + 0x7f, 0x60, 0x1c, 0x62, 0x84, 0xda, 0xcb, 0xa8, 0xe1, 0xe9, 0x38, 0xc6, 0xe5, 0xe5, 0xdf, 0x34, + 0xb8, 0xd2, 0x22, 0x7d, 0x62, 0x0b, 0x3a, 0x22, 0x13, 0x69, 0xed, 0xc9, 0x2f, 0x0f, 0xcf, 0x26, + 0xe8, 0x3a, 0x2c, 0xbd, 0xc2, 0x42, 0xf8, 0xee, 0x9a, 0xc5, 0x29, 0x02, 0x90, 0x09, 0x8b, 0xf1, + 0x93, 0x36, 0xe3, 0x1b, 0xbb, 0x10, 0xbd, 0x66, 0x68, 0x0b, 0x2e, 0x06, 0x44, 0x6a, 0x32, 0x20, + 0x8e, 0x15, 0x55, 0xe7, 0xbd, 0x70, 0x45, 0x98, 0xa5, 0xd8, 0x75, 0x4f, 0x86, 0xb7, 0x7a, 0x1f, + 0xed, 0xc1, 0xc5, 0x29, 0x99, 0xb5, 0x04, 0x16, 0x43, 0x8e, 0x74, 0x58, 0x68, 0xee, 0xed, 0xd7, + 0x1b, 0xfb, 0x5f, 0x94, 0xe6, 0x10, 0x40, 0x7e, 0x67, 0xb7, 0xdd, 0x78, 0xb2, 0x57, 0xd2, 0x50, + 0x01, 0xce, 0x1d, 0xec, 0xd7, 0x1e, 0xef, 0xd7, 0xf7, 0xea, 0xa5, 0x0c, 0x5a, 0x80, 0xec, 0xce, + 0xfe, 0xd7, 0xa5, 0x6c, 0xed, 0xe1, 0xef, 0x2f, 0xd6, 0xb4, 0x67, 0x2f, 0xd6, 0xb4, 0x3f, 0x5f, + 0xac, 0x69, 0x3f, 0xbf, 0x5c, 0x9b, 0x7b, 0xf6, 0x72, 0x6d, 0xee, 0x8f, 0x97, 0x6b, 0x73, 0xdf, + 0xfc, 0xe7, 0x65, 0xc6, 0xe9, 0x6f, 0x78, 0x75, 0xb3, 0x4e, 0x5e, 0x7d, 0xc3, 0xdf, 0xfe, 0x27, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x7c, 0x57, 0x12, 0x7c, 0x0c, 0x00, 0x00, } func (m *FinalityProvider) Marshal() (dAtA []byte, err error) { @@ -853,10 +853,10 @@ func (m *FinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintBtcstaking(dAtA, i, uint64(len(m.ChainId))) + if len(m.ConsumerId) > 0 { + i -= len(m.ConsumerId) + copy(dAtA[i:], m.ConsumerId) + i = encodeVarintBtcstaking(dAtA, i, uint64(len(m.ConsumerId))) i-- dAtA[i] = 0x52 } @@ -1484,7 +1484,7 @@ func (m *FinalityProvider) Size() (n int) { if m.SlashedBtcHeight != 0 { n += 1 + sovBtcstaking(uint64(m.SlashedBtcHeight)) } - l = len(m.ChainId) + l = len(m.ConsumerId) if l > 0 { n += 1 + l + sovBtcstaking(uint64(l)) } @@ -1957,7 +1957,7 @@ func (m *FinalityProvider) Unmarshal(dAtA []byte) error { } case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -1985,7 +1985,7 @@ func (m *FinalityProvider) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ConsumerId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/x/btcstaking/types/errors.go b/x/btcstaking/types/errors.go index 32e4eba69..6a4a86462 100644 --- a/x/btcstaking/types/errors.go +++ b/x/btcstaking/types/errors.go @@ -31,6 +31,6 @@ var ( ErrVotingPowerTableNotUpdated = errorsmod.Register(ModuleName, 1122, "voting power table has not been updated") ErrVotingPowerDistCacheNotFound = errorsmod.Register(ModuleName, 1123, "the voting power distribution cache is not found") ErrParamsNotFound = errorsmod.Register(ModuleName, 1124, "the parameters are not found") - ErrChainIDNotRegistered = errorsmod.Register(ModuleName, 1125, "CZ chain not registered") + ErrConsumerIDNotRegistered = errorsmod.Register(ModuleName, 1125, "Consumer is not registered") ErrNoBabylonFPRestaked = errorsmod.Register(ModuleName, 1126, "the BTC delegation request does not restake to any Babylon finality provider") ) diff --git a/x/btcstaking/types/expected_keepers.go b/x/btcstaking/types/expected_keepers.go index 39764b40b..f217e9043 100644 --- a/x/btcstaking/types/expected_keepers.go +++ b/x/btcstaking/types/expected_keepers.go @@ -27,9 +27,9 @@ type CheckpointingKeeper interface { } type BTCStkConsumerKeeper interface { - IsConsumerChainRegistered(ctx context.Context, chainID string) bool + IsConsumerRegistered(ctx context.Context, consumerID string) bool HasConsumerFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) bool - GetConsumerFinalityProviderChain(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) - GetConsumerFinalityProvider(ctx context.Context, chainID string, fpBTCPK *bbn.BIP340PubKey) (*FinalityProvider, error) + GetConsumerOfFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) + GetConsumerFinalityProvider(ctx context.Context, consumerID string, fpBTCPK *bbn.BIP340PubKey) (*FinalityProvider, error) SetConsumerFinalityProvider(ctx context.Context, fp *FinalityProvider) } diff --git a/x/btcstaking/types/mocked_keepers.go b/x/btcstaking/types/mocked_keepers.go index 3012d06ca..71804bf57 100644 --- a/x/btcstaking/types/mocked_keepers.go +++ b/x/btcstaking/types/mocked_keepers.go @@ -221,19 +221,19 @@ func (mr *MockBTCStkConsumerKeeperMockRecorder) GetConsumerFinalityProvider(ctx, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConsumerFinalityProvider", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).GetConsumerFinalityProvider), ctx, chainID, fpBTCPK) } -// GetConsumerFinalityProviderChain mocks base method. -func (m *MockBTCStkConsumerKeeper) GetConsumerFinalityProviderChain(ctx context.Context, fpBTCPK *types.BIP340PubKey) (string, error) { +// GetConsumerOfFinalityProvider mocks base method. +func (m *MockBTCStkConsumerKeeper) GetConsumerOfFinalityProvider(ctx context.Context, fpBTCPK *types.BIP340PubKey) (string, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetConsumerFinalityProviderChain", ctx, fpBTCPK) + ret := m.ctrl.Call(m, "GetConsumerOfFinalityProvider", ctx, fpBTCPK) ret0, _ := ret[0].(string) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetConsumerFinalityProviderChain indicates an expected call of GetConsumerFinalityProviderChain. -func (mr *MockBTCStkConsumerKeeperMockRecorder) GetConsumerFinalityProviderChain(ctx, fpBTCPK interface{}) *gomock.Call { +// GetConsumerOfFinalityProvider indicates an expected call of GetConsumerOfFinalityProvider. +func (mr *MockBTCStkConsumerKeeperMockRecorder) GetConsumerOfFinalityProvider(ctx, fpBTCPK interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConsumerFinalityProviderChain", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).GetConsumerFinalityProviderChain), ctx, fpBTCPK) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConsumerOfFinalityProvider", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).GetConsumerOfFinalityProvider), ctx, fpBTCPK) } // HasConsumerFinalityProvider mocks base method. @@ -250,18 +250,18 @@ func (mr *MockBTCStkConsumerKeeperMockRecorder) HasConsumerFinalityProvider(ctx, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasConsumerFinalityProvider", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).HasConsumerFinalityProvider), ctx, fpBTCPK) } -// IsConsumerChainRegistered mocks base method. -func (m *MockBTCStkConsumerKeeper) IsConsumerChainRegistered(ctx context.Context, chainID string) bool { +// IsConsumerRegistered mocks base method. +func (m *MockBTCStkConsumerKeeper) IsConsumerRegistered(ctx context.Context, chainID string) bool { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IsConsumerChainRegistered", ctx, chainID) + ret := m.ctrl.Call(m, "IsConsumerRegistered", ctx, chainID) ret0, _ := ret[0].(bool) return ret0 } -// IsConsumerChainRegistered indicates an expected call of IsConsumerChainRegistered. -func (mr *MockBTCStkConsumerKeeperMockRecorder) IsConsumerChainRegistered(ctx, chainID interface{}) *gomock.Call { +// IsConsumerRegistered indicates an expected call of IsConsumerRegistered. +func (mr *MockBTCStkConsumerKeeperMockRecorder) IsConsumerRegistered(ctx, chainID interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsConsumerChainRegistered", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).IsConsumerChainRegistered), ctx, chainID) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsConsumerRegistered", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).IsConsumerRegistered), ctx, chainID) } // SetConsumerFinalityProvider mocks base method. diff --git a/x/btcstaking/types/packet.pb.go b/x/btcstaking/types/packet.pb.go index f26367363..562c8a30d 100644 --- a/x/btcstaking/types/packet.pb.go +++ b/x/btcstaking/types/packet.pb.go @@ -132,9 +132,9 @@ type NewFinalityProvider struct { // the finality provider is slashed. // if it's 0 then the finality provider is not slashed SlashedBtcHeight uint64 `protobuf:"varint,9,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` - // chain_id is the chain id of the chain the finality provider is operating on. + // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. - ChainId string `protobuf:"bytes,10,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ConsumerId string `protobuf:"bytes,10,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` } func (m *NewFinalityProvider) Reset() { *m = NewFinalityProvider{} } @@ -233,9 +233,9 @@ func (m *NewFinalityProvider) GetSlashedBtcHeight() uint64 { return 0 } -func (m *NewFinalityProvider) GetChainId() string { +func (m *NewFinalityProvider) GetConsumerId() string { if m != nil { - return m.ChainId + return m.ConsumerId } return "" } @@ -696,74 +696,74 @@ func init() { } var fileDescriptor_3ed0d17ad14d6c0e = []byte{ - // 1061 bytes of a gzipped FileDescriptorProto + // 1064 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x6e, 0xe3, 0x44, - 0x14, 0x6e, 0x9a, 0xf4, 0x27, 0x93, 0xa4, 0x0d, 0x6e, 0xbb, 0x6b, 0x76, 0x21, 0x2d, 0xd9, 0x65, - 0x55, 0x60, 0x71, 0x68, 0x81, 0xbd, 0x03, 0xa9, 0x49, 0xb7, 0x6a, 0x45, 0xa1, 0x91, 0x93, 0x82, - 0xc4, 0x8d, 0x35, 0xb6, 0x27, 0xc9, 0xc8, 0x89, 0x67, 0xe4, 0x99, 0xa4, 0xc9, 0x5b, 0x80, 0xc4, - 0x43, 0x71, 0xb9, 0x97, 0x70, 0x87, 0xda, 0x4b, 0x5e, 0x02, 0xf9, 0x78, 0xfc, 0xd3, 0x90, 0x14, - 0x76, 0x2f, 0x7d, 0xce, 0x77, 0xbe, 0xf3, 0xf7, 0xcd, 0x8c, 0x51, 0xdd, 0xc6, 0xf6, 0x6c, 0xc8, - 0xfc, 0x86, 0x2d, 0x1d, 0x21, 0xb1, 0x47, 0xfd, 0x7e, 0x63, 0x72, 0xd4, 0xe0, 0xd8, 0xf1, 0x88, - 0x34, 0x78, 0xc0, 0x24, 0xd3, 0xf6, 0x14, 0xc6, 0x48, 0x31, 0xc6, 0xe4, 0xe8, 0x49, 0xdd, 0x61, - 0x62, 0xc4, 0x44, 0xc3, 0x09, 0x66, 0x5c, 0xb2, 0x86, 0x20, 0x0e, 0x3f, 0xfe, 0xfa, 0x95, 0x77, - 0xd4, 0xf0, 0xc8, 0x4c, 0x44, 0xa1, 0x4f, 0x9e, 0x2b, 0x4c, 0x4a, 0x6d, 0x13, 0x89, 0x8f, 0xe2, - 0x6f, 0x85, 0xda, 0x5f, 0x52, 0x04, 0xe3, 0x0a, 0xf0, 0x62, 0x31, 0x20, 0x53, 0x0f, 0xe0, 0xea, - 0xbf, 0xe6, 0xd1, 0x4e, 0xb3, 0xdb, 0xea, 0x44, 0xc6, 0x8b, 0x66, 0xab, 0x0d, 0x7d, 0x68, 0x27, - 0x68, 0xdd, 0x27, 0x37, 0x56, 0x8f, 0xeb, 0xb9, 0x83, 0xfc, 0x61, 0xe9, 0xf8, 0x53, 0x63, 0x61, - 0x4b, 0xc6, 0x0f, 0xe4, 0xe6, 0x8c, 0xfa, 0x78, 0x48, 0xe5, 0xac, 0x1d, 0xb0, 0x09, 0x75, 0x49, - 0x60, 0xae, 0xf9, 0xe4, 0xe6, 0x8c, 0x6b, 0xdf, 0x23, 0x24, 0x86, 0x58, 0x0c, 0x88, 0x1b, 0xd2, - 0xac, 0x02, 0x8d, 0xb1, 0x84, 0xa6, 0x13, 0x01, 0xff, 0x45, 0x55, 0x54, 0x0c, 0x67, 0x5c, 0xbb, - 0x40, 0x08, 0x3b, 0x92, 0x4e, 0x88, 0xe5, 0x92, 0xa1, 0x9e, 0x7f, 0xb0, 0xaa, 0x13, 0x00, 0x36, - 0xbb, 0xad, 0x53, 0x32, 0x24, 0x7d, 0x2c, 0x29, 0xf3, 0xcd, 0x62, 0x14, 0x7d, 0x4a, 0x86, 0xda, - 0x25, 0x2a, 0xc5, 0x95, 0x85, 0x5c, 0x05, 0xe0, 0xfa, 0xec, 0xe1, 0xd2, 0xee, 0x93, 0xc5, 0x9d, - 0x85, 0x6c, 0x57, 0xa8, 0x3c, 0xf6, 0x6d, 0xe6, 0xbb, 0x8a, 0x6e, 0x0d, 0xe8, 0x5e, 0x2e, 0xa1, - 0xbb, 0x56, 0xd0, 0xfb, 0x7c, 0xa5, 0x98, 0xe1, 0x94, 0x0c, 0xeb, 0x7f, 0xe7, 0xd1, 0xce, 0x82, - 0xb9, 0x6a, 0xaf, 0x51, 0xc9, 0x25, 0xc2, 0x09, 0x28, 0x0f, 0x63, 0xf4, 0xdc, 0x41, 0xee, 0xb0, - 0x74, 0xfc, 0xcc, 0x88, 0x04, 0x63, 0xa4, 0x39, 0x40, 0x30, 0xc6, 0x69, 0x0a, 0x35, 0xb3, 0x71, - 0x5a, 0x0d, 0x21, 0x87, 0x8d, 0x46, 0x54, 0x88, 0x90, 0x65, 0xf5, 0x20, 0x77, 0x58, 0x34, 0x33, - 0x16, 0xed, 0x5b, 0x84, 0x54, 0xe9, 0x16, 0xf7, 0xf4, 0x3c, 0x64, 0xd9, 0x8f, 0xb3, 0x44, 0xd2, - 0x35, 0x12, 0xe9, 0x1a, 0xed, 0xb1, 0xfd, 0x1d, 0x99, 0x99, 0x45, 0x15, 0xd2, 0xf6, 0xb4, 0x0f, - 0x10, 0xb2, 0xa5, 0x63, 0x71, 0xcf, 0x1a, 0x90, 0xa9, 0x5e, 0x00, 0xfe, 0x4d, 0x5b, 0x3a, 0x6d, - 0xef, 0x9c, 0x4c, 0xb5, 0x6f, 0x50, 0x9e, 0x33, 0xae, 0xaf, 0x01, 0xed, 0xb2, 0x99, 0xb7, 0x03, - 0xc6, 0x7a, 0x57, 0xbd, 0x36, 0x13, 0x82, 0x40, 0x51, 0xcd, 0x6e, 0xcb, 0x0c, 0xe3, 0xb4, 0x17, - 0x68, 0x7b, 0x84, 0x85, 0x24, 0x81, 0xc5, 0xc7, 0xb6, 0x15, 0x60, 0xdf, 0xd5, 0xd7, 0x21, 0x43, - 0x25, 0x32, 0xb7, 0xc7, 0xb6, 0x89, 0x7d, 0x57, 0xfb, 0x04, 0x55, 0x03, 0xd2, 0xa7, 0xa1, 0x89, - 0xb8, 0x16, 0xe1, 0xcc, 0x19, 0xe8, 0x1b, 0x07, 0xb9, 0xc3, 0x82, 0xb9, 0x9d, 0xda, 0x5f, 0x87, - 0x66, 0xed, 0x2b, 0xf4, 0x28, 0x56, 0x43, 0xdc, 0xf7, 0x80, 0xd0, 0xfe, 0x40, 0xea, 0x9b, 0x10, - 0xb0, 0xab, 0xbc, 0xcd, 0xc8, 0x79, 0x0e, 0x3e, 0xed, 0x25, 0xd2, 0x92, 0x28, 0xe9, 0xc4, 0x11, - 0x45, 0x88, 0xa8, 0xc6, 0x11, 0xd2, 0x51, 0xe8, 0xf7, 0xd1, 0xa6, 0x33, 0xc0, 0xd4, 0xb7, 0xa8, - 0xab, 0x23, 0xa8, 0x77, 0x03, 0xbe, 0x2f, 0xdc, 0x7a, 0x0f, 0x3d, 0x5e, 0xa2, 0xfe, 0xb9, 0x49, - 0xe6, 0xe6, 0x26, 0xf9, 0x39, 0xda, 0x09, 0x88, 0xc3, 0x26, 0xd0, 0x61, 0x8f, 0x43, 0x19, 0xc2, - 0x53, 0x0b, 0xad, 0x26, 0xae, 0x33, 0xde, 0x94, 0x4e, 0xc7, 0xab, 0xff, 0x59, 0x40, 0x3b, 0x0b, - 0xce, 0xc5, 0x7f, 0x24, 0x79, 0x86, 0xb6, 0x14, 0x35, 0xf7, 0xac, 0x21, 0x15, 0x12, 0x0e, 0x72, - 0xd1, 0x2c, 0xf5, 0x42, 0xda, 0xb6, 0x77, 0x49, 0x85, 0xd4, 0x3e, 0x42, 0x65, 0x21, 0x71, 0x20, - 0xe3, 0x29, 0xe4, 0x61, 0x0a, 0x25, 0xb0, 0xa9, 0x01, 0x7c, 0x88, 0x10, 0xf1, 0xdd, 0x18, 0x50, - 0x00, 0x40, 0x91, 0xf8, 0xae, 0x72, 0x3f, 0x45, 0x45, 0xc9, 0x24, 0x1e, 0x5a, 0x02, 0x4b, 0xd0, - 0x46, 0xc1, 0xdc, 0x04, 0x43, 0x07, 0x43, 0xac, 0xd2, 0x86, 0x25, 0xa7, 0xb0, 0xee, 0xb2, 0x59, - 0x54, 0x96, 0xee, 0x54, 0xdb, 0x57, 0xa7, 0x59, 0xf9, 0x37, 0xc0, 0x8f, 0x62, 0x53, 0x77, 0x1a, - 0x2e, 0xd8, 0x8d, 0xfa, 0x65, 0x81, 0x95, 0x40, 0x05, 0xed, 0xc3, 0x82, 0xcb, 0xe6, 0x6e, 0xe2, - 0xed, 0x28, 0x67, 0x87, 0xf6, 0xb5, 0x6b, 0x54, 0x09, 0x27, 0xe8, 0x63, 0x5f, 0x86, 0x58, 0xa1, - 0x17, 0xe1, 0x5c, 0x7f, 0xb1, 0x44, 0xb2, 0x2d, 0x85, 0x3d, 0x71, 0x31, 0x0f, 0x99, 0x68, 0xdf, - 0xc7, 0x72, 0x1c, 0x10, 0x61, 0x96, 0x63, 0x9a, 0x0e, 0xed, 0x0b, 0xd0, 0x8d, 0x6a, 0x86, 0x8d, - 0x25, 0x1f, 0x4b, 0x8b, 0xba, 0x53, 0xd0, 0x44, 0xc5, 0xac, 0x2a, 0xcf, 0x15, 0x38, 0x2e, 0xdc, - 0xa9, 0xf6, 0x31, 0xda, 0x8a, 0x6e, 0x06, 0x68, 0x8e, 0x8e, 0x88, 0x5e, 0x01, 0x64, 0x25, 0xb1, - 0x76, 0xe9, 0x88, 0x68, 0x3f, 0xa1, 0xf7, 0xc6, 0xbe, 0x9b, 0xec, 0xd4, 0xa2, 0x7e, 0x8f, 0xe9, - 0x5b, 0x70, 0xc4, 0x96, 0x5d, 0x91, 0xcd, 0x6e, 0xeb, 0x3a, 0x13, 0x72, 0xe1, 0xf7, 0x98, 0x59, - 0x1d, 0xcf, 0x59, 0xc2, 0xfc, 0x1c, 0x07, 0x78, 0x24, 0xac, 0x09, 0x09, 0xe0, 0xbe, 0xd8, 0x8e, - 0xf2, 0x47, 0xd6, 0x1f, 0x23, 0x63, 0xfd, 0xb7, 0xe8, 0x15, 0x99, 0x27, 0x0c, 0x85, 0x91, 0x29, - 0x3f, 0x52, 0x57, 0x39, 0xbe, 0xec, 0xa2, 0xe5, 0xbc, 0x42, 0x8f, 0xd3, 0xe5, 0xa4, 0xe0, 0x70, - 0x3b, 0xab, 0x80, 0xde, 0x4b, 0xdc, 0xd7, 0xb1, 0x37, 0x5c, 0x8f, 0x83, 0x9e, 0x26, 0xeb, 0xb9, - 0x17, 0x16, 0xa9, 0x34, 0x7a, 0x1f, 0x9e, 0x2f, 0xbb, 0xd3, 0xe3, 0xed, 0x40, 0xdb, 0x7a, 0x4c, - 0x94, 0x4d, 0x00, 0xc2, 0x9e, 0x93, 0x56, 0xe1, 0x2d, 0xa4, 0xb5, 0xf6, 0x80, 0xb4, 0x7a, 0xe8, - 0x51, 0x2a, 0xad, 0x4c, 0x90, 0xd0, 0xd7, 0xdf, 0x51, 0x63, 0xbb, 0x89, 0xc6, 0xd2, 0x34, 0xa2, - 0x3e, 0x42, 0xbb, 0x8b, 0x5e, 0xaf, 0xf0, 0x12, 0x4d, 0x0f, 0x94, 0x35, 0xc0, 0x62, 0xa0, 0xce, - 0x7d, 0x25, 0x39, 0x55, 0xe7, 0x58, 0x0c, 0xde, 0xf6, 0x86, 0xa1, 0x68, 0x6f, 0xe1, 0xeb, 0xf6, - 0xbf, 0xf3, 0x1d, 0xa2, 0x6a, 0x56, 0x2e, 0x19, 0x11, 0x6c, 0x65, 0x24, 0xd3, 0xa1, 0xfd, 0xe6, - 0xe5, 0xef, 0xb7, 0xb5, 0xdc, 0x9b, 0xdb, 0x5a, 0xee, 0xaf, 0xdb, 0x5a, 0xee, 0x97, 0xbb, 0xda, - 0xca, 0x9b, 0xbb, 0xda, 0xca, 0x1f, 0x77, 0xb5, 0x95, 0x9f, 0x8f, 0xfb, 0x54, 0x0e, 0xc6, 0xb6, - 0xe1, 0xb0, 0x51, 0x43, 0x4d, 0x11, 0x6e, 0xda, 0xf8, 0xa3, 0x31, 0xcd, 0xfe, 0x12, 0xc9, 0x19, - 0x27, 0xc2, 0x5e, 0x87, 0x7f, 0xa1, 0x2f, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x5b, 0xf2, 0xd6, - 0x9c, 0xdb, 0x09, 0x00, 0x00, + 0x14, 0x6e, 0x9a, 0xb4, 0xdb, 0x9c, 0x24, 0x6d, 0x70, 0xdb, 0x5d, 0x6b, 0x17, 0xd2, 0x92, 0x5d, + 0x56, 0x05, 0x16, 0x87, 0x16, 0xd8, 0x3b, 0x90, 0x9a, 0x74, 0xab, 0x56, 0x14, 0x1a, 0x39, 0x29, + 0x48, 0xdc, 0x58, 0x63, 0x7b, 0x92, 0x8c, 0x9c, 0x78, 0x46, 0x9e, 0x71, 0x9a, 0xbc, 0x05, 0x48, + 0x3c, 0x14, 0x97, 0x7b, 0x09, 0x77, 0xa8, 0x7d, 0x02, 0xde, 0x00, 0x79, 0x3c, 0xfe, 0x69, 0x49, + 0x0a, 0xcb, 0x65, 0xce, 0xf9, 0xce, 0x77, 0xfe, 0xbe, 0x33, 0x0e, 0x34, 0x6d, 0x64, 0xcf, 0xc7, + 0xd4, 0x6f, 0xd9, 0xc2, 0xe1, 0x02, 0x79, 0xc4, 0x1f, 0xb6, 0xa6, 0x87, 0x2d, 0x86, 0x1c, 0x0f, + 0x0b, 0x83, 0x05, 0x54, 0x50, 0x6d, 0x57, 0x61, 0x8c, 0x0c, 0x63, 0x4c, 0x0f, 0x9f, 0x36, 0x1d, + 0xca, 0x27, 0x94, 0xb7, 0x9c, 0x60, 0xce, 0x04, 0x6d, 0x71, 0xec, 0xb0, 0xa3, 0xaf, 0x5e, 0x7b, + 0x87, 0x2d, 0x0f, 0xcf, 0x79, 0x1c, 0xfa, 0xf4, 0x85, 0xc2, 0x64, 0xd4, 0x36, 0x16, 0xe8, 0x30, + 0xf9, 0xad, 0x50, 0x7b, 0x4b, 0x8a, 0xa0, 0x4c, 0x01, 0x5e, 0x2e, 0x06, 0xe4, 0xea, 0x91, 0xb8, + 0xe6, 0x2f, 0x45, 0xd8, 0x6e, 0xf7, 0x3b, 0xbd, 0xd8, 0x78, 0xde, 0xee, 0x74, 0x65, 0x1f, 0xda, + 0x31, 0xac, 0xfb, 0xf8, 0xda, 0x1a, 0x30, 0xbd, 0xb0, 0x5f, 0x3c, 0xa8, 0x1c, 0x7d, 0x62, 0x2c, + 0x6c, 0xc9, 0xf8, 0x1e, 0x5f, 0x9f, 0x12, 0x1f, 0x8d, 0x89, 0x98, 0x77, 0x03, 0x3a, 0x25, 0x2e, + 0x0e, 0xcc, 0x35, 0x1f, 0x5f, 0x9f, 0x32, 0xed, 0x3b, 0x00, 0x3e, 0x46, 0x7c, 0x84, 0xdd, 0x88, + 0x66, 0x55, 0xd2, 0x18, 0x4b, 0x68, 0x7a, 0x31, 0xf0, 0x1f, 0x54, 0x65, 0xc5, 0x70, 0xca, 0xb4, + 0x73, 0x00, 0xe4, 0x08, 0x32, 0xc5, 0x96, 0x8b, 0xc7, 0x7a, 0xf1, 0xc1, 0xaa, 0x8e, 0x25, 0xb0, + 0xdd, 0xef, 0x9c, 0xe0, 0x31, 0x1e, 0x22, 0x41, 0xa8, 0x6f, 0x96, 0xe3, 0xe8, 0x13, 0x3c, 0xd6, + 0x2e, 0xa0, 0x92, 0x54, 0x16, 0x71, 0x95, 0x24, 0xd7, 0xa7, 0x0f, 0x97, 0x76, 0x97, 0x2c, 0xe9, + 0x2c, 0x62, 0xbb, 0x84, 0x6a, 0xe8, 0xdb, 0xd4, 0x77, 0x15, 0xdd, 0x9a, 0xa4, 0x7b, 0xb5, 0x84, + 0xee, 0x4a, 0x41, 0xef, 0xf2, 0x55, 0x12, 0x86, 0x13, 0x3c, 0x6e, 0xfe, 0x55, 0x84, 0xed, 0x05, + 0x73, 0xd5, 0xde, 0x40, 0xc5, 0xc5, 0xdc, 0x09, 0x08, 0x8b, 0x62, 0xf4, 0xc2, 0x7e, 0xe1, 0xa0, + 0x72, 0xf4, 0xdc, 0x88, 0x05, 0x63, 0x64, 0x39, 0xa4, 0x60, 0x8c, 0x93, 0x0c, 0x6a, 0xe6, 0xe3, + 0xb4, 0x06, 0x80, 0x43, 0x27, 0x13, 0xc2, 0x79, 0xc4, 0xb2, 0xba, 0x5f, 0x38, 0x28, 0x9b, 0x39, + 0x8b, 0xf6, 0x0d, 0x80, 0x2a, 0xdd, 0x62, 0x9e, 0x5e, 0x94, 0x59, 0xf6, 0x92, 0x2c, 0xb1, 0x74, + 0x8d, 0x54, 0xba, 0x46, 0x37, 0xb4, 0xbf, 0xc5, 0x73, 0xb3, 0xac, 0x42, 0xba, 0x9e, 0xf6, 0x3e, + 0x80, 0x2d, 0x1c, 0x8b, 0x79, 0xd6, 0x08, 0xcf, 0xf4, 0x92, 0xe4, 0xdf, 0xb0, 0x85, 0xd3, 0xf5, + 0xce, 0xf0, 0x4c, 0xfb, 0x1a, 0x8a, 0x8c, 0x32, 0x7d, 0x4d, 0xd2, 0x2e, 0x9b, 0x79, 0x37, 0xa0, + 0x74, 0x70, 0x39, 0xe8, 0x52, 0xce, 0xb1, 0x2c, 0xaa, 0xdd, 0xef, 0x98, 0x51, 0x9c, 0xf6, 0x12, + 0xb6, 0x26, 0x88, 0x0b, 0x1c, 0x58, 0x2c, 0xb4, 0xad, 0x00, 0xf9, 0xae, 0xbe, 0x2e, 0x33, 0xd4, + 0x62, 0x73, 0x37, 0xb4, 0x4d, 0xe4, 0xbb, 0xda, 0xc7, 0x50, 0x0f, 0xf0, 0x90, 0x44, 0x26, 0xec, + 0x5a, 0x98, 0x51, 0x67, 0xa4, 0x3f, 0xda, 0x2f, 0x1c, 0x94, 0xcc, 0xad, 0xcc, 0xfe, 0x26, 0x32, + 0x6b, 0x5f, 0xc2, 0xe3, 0x44, 0x0d, 0x49, 0xdf, 0x23, 0x4c, 0x86, 0x23, 0xa1, 0x6f, 0xc8, 0x80, + 0x1d, 0xe5, 0x6d, 0xc7, 0xce, 0x33, 0xe9, 0xd3, 0x5e, 0x81, 0x96, 0x46, 0x09, 0x27, 0x89, 0x28, + 0xcb, 0x88, 0x7a, 0x12, 0x21, 0x1c, 0x85, 0xde, 0x83, 0x8a, 0x43, 0x7d, 0x1e, 0x4e, 0x70, 0x60, + 0x11, 0x57, 0x87, 0x64, 0xe8, 0xb1, 0xe9, 0xdc, 0x6d, 0x0e, 0xe0, 0xc9, 0x92, 0x1b, 0xb8, 0x37, + 0xcf, 0xc2, 0xbd, 0x79, 0x7e, 0x06, 0xdb, 0x01, 0x76, 0xe8, 0x54, 0xf6, 0x39, 0x60, 0xb2, 0x18, + 0xee, 0xa9, 0xb5, 0xd6, 0x53, 0xd7, 0x29, 0x6b, 0x0b, 0xa7, 0xe7, 0x35, 0xff, 0x28, 0xc1, 0xf6, + 0x82, 0xeb, 0xf8, 0x97, 0x24, 0xcf, 0x61, 0x53, 0x51, 0x33, 0xcf, 0x1a, 0x13, 0x2e, 0xe4, 0x39, + 0x97, 0xcd, 0xca, 0x20, 0xa2, 0xed, 0x7a, 0x17, 0x84, 0x0b, 0xed, 0x43, 0xa8, 0x72, 0x81, 0x02, + 0x91, 0xcc, 0xa2, 0x28, 0x67, 0x51, 0x91, 0x36, 0x35, 0x86, 0x0f, 0x00, 0xb0, 0xef, 0x26, 0x80, + 0x92, 0x04, 0x94, 0xb1, 0xef, 0x2a, 0xf7, 0x33, 0x28, 0x0b, 0x2a, 0xd0, 0xd8, 0xe2, 0x48, 0x48, + 0x85, 0x94, 0xcc, 0x0d, 0x69, 0xe8, 0x21, 0x19, 0xab, 0x14, 0x62, 0x89, 0x99, 0x5c, 0x7a, 0xd5, + 0x2c, 0x2b, 0x4b, 0x7f, 0x16, 0x4d, 0x58, 0x4e, 0x5d, 0xf9, 0x1f, 0x49, 0x3f, 0x24, 0xa6, 0xfe, + 0x2c, 0x5a, 0xb3, 0x1b, 0xf7, 0x4b, 0x03, 0x2b, 0x85, 0x72, 0x32, 0x94, 0x6b, 0xae, 0x9a, 0x3b, + 0xa9, 0xb7, 0xa7, 0x9c, 0x3d, 0x32, 0xd4, 0xae, 0xa0, 0x16, 0x4d, 0xd0, 0x47, 0xbe, 0x88, 0xb0, + 0x5c, 0x2f, 0xcb, 0xeb, 0xfe, 0x7c, 0x89, 0x70, 0x3b, 0x0a, 0x7b, 0xec, 0x22, 0x16, 0x31, 0x91, + 0xa1, 0x8f, 0x44, 0x18, 0x60, 0x6e, 0x56, 0x13, 0x9a, 0x1e, 0x19, 0x72, 0xa9, 0x1e, 0xd5, 0x0c, + 0x0d, 0x05, 0x0b, 0x85, 0x45, 0xdc, 0x99, 0x94, 0x45, 0xcd, 0xac, 0x2b, 0xcf, 0xa5, 0x74, 0x9c, + 0xbb, 0x33, 0xed, 0x23, 0xd8, 0x8c, 0xdf, 0x07, 0xd9, 0x1c, 0x99, 0x60, 0xbd, 0x26, 0x91, 0xb5, + 0xd4, 0xda, 0x27, 0x13, 0xac, 0xfd, 0x08, 0xef, 0x85, 0xbe, 0x9b, 0xee, 0xd4, 0x22, 0xfe, 0x80, + 0xea, 0x9b, 0xf2, 0xd0, 0x96, 0x3d, 0x94, 0xed, 0x7e, 0xe7, 0x2a, 0x17, 0x72, 0xee, 0x0f, 0xa8, + 0x59, 0x0f, 0xef, 0x59, 0xa2, 0xfc, 0x0c, 0x05, 0x68, 0xc2, 0xad, 0x29, 0x0e, 0xe4, 0xab, 0xb1, + 0x15, 0xe7, 0x8f, 0xad, 0x3f, 0xc4, 0xc6, 0xe6, 0xaf, 0xf1, 0xb7, 0xe4, 0x3e, 0x61, 0x24, 0x8c, + 0x5c, 0xf9, 0xb1, 0xba, 0xaa, 0xc9, 0x93, 0x17, 0x2f, 0xe7, 0x35, 0x3c, 0xc9, 0x96, 0x93, 0x81, + 0xa3, 0xed, 0xac, 0x4a, 0xf4, 0x6e, 0xea, 0xbe, 0x4a, 0xbc, 0xd1, 0x7a, 0x1c, 0x78, 0x96, 0xae, + 0xe7, 0x4e, 0x58, 0xac, 0xd2, 0xf8, 0x2b, 0xf1, 0x62, 0xd9, 0xcb, 0x9e, 0x6c, 0x47, 0xb6, 0xad, + 0x27, 0x44, 0xf9, 0x04, 0x52, 0xd8, 0xf7, 0xa4, 0x55, 0x7a, 0x07, 0x69, 0xad, 0x3d, 0x20, 0xad, + 0x01, 0x3c, 0xce, 0xa4, 0x95, 0x0b, 0xe2, 0xfa, 0xfa, 0xff, 0xd4, 0xd8, 0x4e, 0xaa, 0xb1, 0x2c, + 0x0d, 0x6f, 0x4e, 0x60, 0x67, 0xd1, 0x37, 0x2c, 0x7a, 0x4a, 0xb3, 0x83, 0xb2, 0x46, 0x88, 0x8f, + 0xd4, 0xdd, 0xd7, 0xd2, 0xab, 0x3a, 0x43, 0x7c, 0xf4, 0xae, 0x2f, 0x0c, 0x81, 0xdd, 0x85, 0xdf, + 0xb8, 0xff, 0x9c, 0xef, 0x00, 0xea, 0x79, 0xb9, 0xe4, 0x44, 0xb0, 0x99, 0x93, 0x4c, 0x8f, 0x0c, + 0xdb, 0x17, 0xbf, 0xdd, 0x34, 0x0a, 0x6f, 0x6f, 0x1a, 0x85, 0x3f, 0x6f, 0x1a, 0x85, 0x9f, 0x6f, + 0x1b, 0x2b, 0x6f, 0x6f, 0x1b, 0x2b, 0xbf, 0xdf, 0x36, 0x56, 0x7e, 0x3a, 0x1a, 0x12, 0x31, 0x0a, + 0x6d, 0xc3, 0xa1, 0x93, 0x96, 0x9a, 0xa2, 0x33, 0x42, 0xc4, 0x4f, 0x7e, 0xb4, 0x66, 0xf9, 0x3f, + 0x46, 0x62, 0xce, 0x30, 0xb7, 0xd7, 0xe5, 0x3f, 0xa2, 0x2f, 0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, + 0x77, 0x8b, 0x8b, 0xe5, 0xe1, 0x09, 0x00, 0x00, } func (m *BTCStakingIBCPacket) Marshal() (dAtA []byte, err error) { @@ -879,10 +879,10 @@ func (m *NewFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintPacket(dAtA, i, uint64(len(m.ChainId))) + if len(m.ConsumerId) > 0 { + i -= len(m.ConsumerId) + copy(dAtA[i:], m.ConsumerId) + i = encodeVarintPacket(dAtA, i, uint64(len(m.ConsumerId))) i-- dAtA[i] = 0x52 } @@ -1356,7 +1356,7 @@ func (m *NewFinalityProvider) Size() (n int) { if m.SlashedBtcHeight != 0 { n += 1 + sovPacket(uint64(m.SlashedBtcHeight)) } - l = len(m.ChainId) + l = len(m.ConsumerId) if l > 0 { n += 1 + l + sovPacket(uint64(l)) } @@ -2028,7 +2028,7 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { } case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2056,7 +2056,7 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ConsumerId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/x/btcstaking/types/tx.pb.go b/x/btcstaking/types/tx.pb.go index 7006b33b6..3166c18b4 100644 --- a/x/btcstaking/types/tx.pb.go +++ b/x/btcstaking/types/tx.pb.go @@ -48,9 +48,9 @@ type MsgCreateFinalityProvider struct { BtcPk *github_com_babylonchain_babylon_types.BIP340PubKey `protobuf:"bytes,4,opt,name=btc_pk,json=btcPk,proto3,customtype=github.com/babylonchain/babylon/types.BIP340PubKey" json:"btc_pk,omitempty"` // pop is the proof of possession of btc_pk over the FP signer address. Pop *ProofOfPossessionBTC `protobuf:"bytes,5,opt,name=pop,proto3" json:"pop,omitempty"` - // chain id is a registered CZ chain id, or Babylon's chain id. + // consumer_id is the ID of the consumer // If it's empty, it's assumed to be Babylon's chain id - ChainId string `protobuf:"bytes,7,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ConsumerId string `protobuf:"bytes,7,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` } func (m *MsgCreateFinalityProvider) Reset() { *m = MsgCreateFinalityProvider{} } @@ -107,9 +107,9 @@ func (m *MsgCreateFinalityProvider) GetPop() *ProofOfPossessionBTC { return nil } -func (m *MsgCreateFinalityProvider) GetChainId() string { +func (m *MsgCreateFinalityProvider) GetConsumerId() string { if m != nil { - return m.ChainId + return m.ConsumerId } return "" } @@ -864,87 +864,87 @@ func init() { func init() { proto.RegisterFile("babylon/btcstaking/v1/tx.proto", fileDescriptor_4baddb53e97f38f2) } var fileDescriptor_4baddb53e97f38f2 = []byte{ - // 1277 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6f, 0x13, 0xc7, - 0x17, 0xcf, 0xc6, 0x89, 0x21, 0xcf, 0x71, 0x92, 0xef, 0x10, 0x82, 0xb3, 0x5f, 0xb0, 0x1d, 0x43, - 0x21, 0x50, 0xb2, 0x26, 0xa1, 0xa0, 0x12, 0xd4, 0x03, 0x4e, 0x82, 0x40, 0xc5, 0xaa, 0xb5, 0x76, - 0x7a, 0x68, 0x0f, 0xd6, 0x7a, 0x77, 0xb2, 0x1e, 0xd9, 0xde, 0x59, 0xed, 0x4c, 0x2c, 0x47, 0x95, - 0xaa, 0x0a, 0xf5, 0x5a, 0xa9, 0x52, 0xa5, 0x1e, 0xfa, 0x57, 0x70, 0xe0, 0x4f, 0xa8, 0x2a, 0x8e, - 0x88, 0x53, 0x95, 0x43, 0x54, 0x41, 0x25, 0xfe, 0x82, 0x9e, 0x5b, 0xed, 0xec, 0x4f, 0xa7, 0xde, - 0x92, 0x60, 0x6e, 0xde, 0x99, 0xcf, 0xfb, 0xbc, 0xf7, 0x3e, 0xef, 0xbd, 0x99, 0x31, 0xe4, 0x5b, - 0x5a, 0xeb, 0xa0, 0x4b, 0xad, 0x72, 0x8b, 0xeb, 0x8c, 0x6b, 0x1d, 0x62, 0x99, 0xe5, 0xfe, 0x7a, - 0x99, 0x0f, 0x14, 0xdb, 0xa1, 0x9c, 0xa2, 0xf3, 0xfe, 0xbe, 0x12, 0xed, 0x2b, 0xfd, 0x75, 0x79, - 0xd1, 0xa4, 0x26, 0x15, 0x88, 0xb2, 0xfb, 0xcb, 0x03, 0xcb, 0xcb, 0x3a, 0x65, 0x3d, 0xca, 0x9a, - 0xde, 0x86, 0xf7, 0xe1, 0x6f, 0x5d, 0xf0, 0xbe, 0xca, 0x3d, 0x26, 0xf8, 0x7b, 0xcc, 0xf4, 0x37, - 0x4a, 0xa3, 0x03, 0xb0, 0x35, 0x47, 0xeb, 0x05, 0xc6, 0x37, 0x63, 0x18, 0xbd, 0x8d, 0xf5, 0x8e, - 0x4d, 0x89, 0xc5, 0x5d, 0xd8, 0xd0, 0x82, 0x8f, 0xbe, 0xe2, 0xbb, 0x8a, 0xd8, 0x5a, 0x98, 0x6b, - 0xeb, 0xc1, 0xb7, 0x8f, 0x2a, 0x24, 0xf8, 0xa5, 0xb6, 0x07, 0x28, 0xfd, 0x94, 0x82, 0xe5, 0x2a, - 0x33, 0xb7, 0x1c, 0xac, 0x71, 0xfc, 0x90, 0x58, 0x5a, 0x97, 0xf0, 0x83, 0x9a, 0x43, 0xfb, 0xc4, - 0xc0, 0x0e, 0xba, 0x09, 0x53, 0x9a, 0x61, 0x38, 0x39, 0xa9, 0x28, 0xad, 0xce, 0x54, 0x72, 0xaf, - 0x9e, 0xaf, 0x2d, 0xfa, 0xf9, 0x3e, 0x30, 0x0c, 0x07, 0x33, 0x56, 0xe7, 0x0e, 0xb1, 0x4c, 0x55, - 0xa0, 0xd0, 0x0e, 0x64, 0x0c, 0xcc, 0x74, 0x87, 0xd8, 0x9c, 0x50, 0x2b, 0x37, 0x59, 0x94, 0x56, - 0x33, 0x1b, 0x97, 0x15, 0xdf, 0x22, 0xd2, 0x55, 0x04, 0xaa, 0x6c, 0x47, 0x50, 0x35, 0x6e, 0x87, - 0xaa, 0x00, 0x3a, 0xed, 0xf5, 0x08, 0x63, 0x2e, 0x4b, 0x4a, 0xb8, 0x5e, 0x3b, 0x3c, 0x2a, 0xfc, - 0xdf, 0x23, 0x62, 0x46, 0x47, 0x21, 0xb4, 0xdc, 0xd3, 0x78, 0x5b, 0x79, 0x82, 0x4d, 0x4d, 0x3f, - 0xd8, 0xc6, 0xfa, 0xab, 0xe7, 0x6b, 0xe0, 0xfb, 0xd9, 0xc6, 0xba, 0x1a, 0x23, 0x40, 0x55, 0x48, - 0xb7, 0xb8, 0xde, 0xb4, 0x3b, 0xb9, 0xa9, 0xa2, 0xb4, 0x3a, 0x5b, 0xb9, 0x7b, 0x78, 0x54, 0xd8, - 0x30, 0x09, 0x6f, 0xef, 0xb7, 0x14, 0x9d, 0xf6, 0xca, 0xbe, 0x42, 0x7a, 0x5b, 0x23, 0x56, 0xf0, - 0x51, 0xe6, 0x07, 0x36, 0x66, 0x4a, 0xe5, 0x71, 0xed, 0xf6, 0x27, 0xb7, 0x6a, 0xfb, 0xad, 0xcf, - 0xf1, 0x81, 0x3a, 0xdd, 0xe2, 0x7a, 0xad, 0x83, 0x3e, 0x83, 0x94, 0x4d, 0xed, 0xdc, 0xb4, 0x48, - 0xee, 0x63, 0x65, 0x64, 0xe3, 0x28, 0x35, 0x87, 0xd2, 0xbd, 0x2f, 0xf6, 0x6a, 0x94, 0x31, 0x2c, - 0xa2, 0xa8, 0x34, 0xb6, 0x54, 0xd7, 0x0e, 0x2d, 0xc3, 0x59, 0xe1, 0xa9, 0x49, 0x8c, 0xdc, 0x19, - 0x37, 0x35, 0xf5, 0x8c, 0xf8, 0x7e, 0x6c, 0x6c, 0xce, 0x3c, 0x7d, 0xfb, 0xec, 0x86, 0x50, 0xb2, - 0x74, 0x19, 0x56, 0x12, 0x8b, 0xa2, 0x62, 0x66, 0x53, 0x8b, 0xe1, 0xd2, 0xdf, 0x12, 0x5c, 0xa8, - 0x32, 0x73, 0xc7, 0x20, 0x7c, 0xcc, 0xc2, 0x9d, 0x0f, 0x25, 0x72, 0x6b, 0x36, 0x1b, 0xa4, 0x7a, - 0xac, 0x9e, 0xa9, 0x0f, 0x52, 0xcf, 0xa9, 0x31, 0xeb, 0x19, 0x97, 0x69, 0x05, 0x0a, 0x09, 0x02, - 0x84, 0x22, 0xfd, 0x76, 0x06, 0x96, 0x42, 0x29, 0x2b, 0x8d, 0xad, 0x6d, 0xdc, 0xc5, 0xa6, 0x26, - 0xe2, 0xba, 0x07, 0x19, 0x37, 0x07, 0xec, 0x34, 0x4f, 0x24, 0x15, 0x78, 0x60, 0x77, 0x31, 0x68, - 0x82, 0xc9, 0xf7, 0x6c, 0x82, 0xa8, 0x25, 0x53, 0x1f, 0xa2, 0x25, 0xbf, 0x86, 0xb9, 0x3d, 0xbb, - 0xe9, 0x31, 0x36, 0xbb, 0x84, 0xf1, 0xdc, 0x54, 0x31, 0x35, 0x06, 0x6d, 0x66, 0xcf, 0xae, 0xb8, - 0xc4, 0x4f, 0x08, 0xe3, 0x68, 0x05, 0x66, 0xfd, 0x9c, 0x9a, 0x9c, 0xf4, 0xb0, 0x68, 0xfc, 0xac, - 0x9a, 0xf1, 0xd7, 0x1a, 0xa4, 0x87, 0xd1, 0x65, 0xc8, 0x06, 0x90, 0xbe, 0xd6, 0xdd, 0xc7, 0xb9, - 0x74, 0x51, 0x5a, 0x4d, 0xa9, 0x81, 0xdd, 0x97, 0xee, 0x1a, 0x7a, 0x04, 0x10, 0xf2, 0x0c, 0x44, - 0xeb, 0x67, 0x36, 0xae, 0xc7, 0x95, 0x8b, 0x9d, 0x70, 0xfd, 0x75, 0xa5, 0xe1, 0x68, 0x16, 0xd3, - 0x74, 0xb7, 0x50, 0x8f, 0xad, 0x3d, 0xaa, 0xce, 0x04, 0x0e, 0x07, 0x68, 0x03, 0x32, 0xac, 0xab, - 0xb1, 0xb6, 0x4f, 0x75, 0x56, 0x48, 0xf8, 0xbf, 0xc3, 0xa3, 0x42, 0xb6, 0xd2, 0xd8, 0xaa, 0xfb, - 0x3b, 0x8d, 0x81, 0x0a, 0x2c, 0xfc, 0x8d, 0x28, 0x2c, 0x19, 0x5e, 0xe5, 0xa9, 0xd3, 0x0c, 0xad, - 0x19, 0x31, 0x73, 0x33, 0xc2, 0xfc, 0xde, 0xe1, 0x51, 0xe1, 0xce, 0x69, 0xa4, 0xaa, 0x13, 0xd3, - 0xd2, 0xf8, 0xbe, 0x83, 0xd5, 0xc5, 0x90, 0x38, 0xf0, 0x5d, 0x27, 0x26, 0xfa, 0x08, 0xe6, 0xf6, - 0xad, 0x16, 0xb5, 0x8c, 0x50, 0x38, 0x10, 0xc2, 0x65, 0xc3, 0x55, 0x21, 0xdd, 0x0a, 0xcc, 0xc6, - 0x60, 0x83, 0x5c, 0x46, 0xcc, 0x5f, 0x26, 0x02, 0x0d, 0xd0, 0x35, 0x98, 0x8f, 0x20, 0x9e, 0xbe, - 0xb3, 0x42, 0xdf, 0xc8, 0x81, 0xa7, 0xf0, 0x0e, 0x9c, 0x8f, 0x80, 0x71, 0x85, 0xb2, 0x49, 0x0a, - 0x9d, 0x0b, 0xf1, 0xd1, 0x22, 0x7a, 0x2a, 0x41, 0x31, 0xd2, 0x6a, 0x04, 0xa3, 0xab, 0xda, 0xdc, - 0xb8, 0xaa, 0x5d, 0x0a, 0x5d, 0xec, 0x1e, 0x8f, 0xa1, 0x4e, 0xcc, 0xcd, 0x05, 0x77, 0xc8, 0xe3, - 0xe3, 0x59, 0x2a, 0x42, 0x7e, 0xf4, 0x1c, 0x87, 0xa3, 0xfe, 0xd7, 0x24, 0xa0, 0x2a, 0x33, 0x1f, - 0x18, 0xc6, 0x16, 0xed, 0x63, 0x4b, 0xb3, 0x78, 0x9d, 0x98, 0x0c, 0x2d, 0x41, 0x9a, 0x11, 0xd3, - 0xc2, 0xfe, 0x84, 0xab, 0xfe, 0x17, 0x7a, 0x08, 0x93, 0xc1, 0x81, 0xf7, 0xde, 0x93, 0x32, 0x69, - 0x77, 0xd0, 0x55, 0x98, 0x8f, 0x1a, 0xbb, 0xd9, 0xd6, 0x58, 0xdb, 0xbb, 0xb3, 0xd4, 0x6c, 0xd8, - 0xb2, 0x8f, 0x34, 0xd6, 0x46, 0xab, 0xb0, 0x10, 0x2b, 0x8a, 0xab, 0x22, 0xf3, 0xe6, 0x54, 0x9d, - 0x8b, 0x1a, 0x55, 0x44, 0xac, 0xc3, 0x42, 0xbc, 0x29, 0x84, 0xe0, 0xd3, 0xe3, 0x0a, 0x3e, 0x17, - 0xeb, 0x29, 0xb7, 0x41, 0xef, 0x83, 0x1c, 0x86, 0x73, 0xdc, 0x1b, 0xcb, 0xa5, 0x45, 0x60, 0x17, - 0x02, 0xc4, 0xee, 0x90, 0x2d, 0xdb, 0xcc, 0xb8, 0xe5, 0xf1, 0x85, 0x2c, 0x5d, 0x04, 0xf9, 0xdf, - 0xb2, 0x87, 0x55, 0xf9, 0x55, 0x82, 0x85, 0x2a, 0x33, 0x2b, 0x8d, 0xad, 0x5d, 0xcb, 0xaf, 0x39, - 0x4e, 0xac, 0xc9, 0x08, 0x2d, 0x27, 0x47, 0x69, 0x39, 0x4a, 0xa1, 0xd4, 0x07, 0x56, 0x68, 0x38, - 0x49, 0x19, 0x72, 0xc7, 0xb3, 0x08, 0x53, 0xfc, 0x45, 0x82, 0x8b, 0x55, 0x66, 0xd6, 0x71, 0x17, - 0xeb, 0x9c, 0xf4, 0x71, 0xd0, 0xc8, 0x3b, 0xee, 0x55, 0x64, 0xe9, 0xe3, 0xa7, 0xbb, 0x06, 0xe7, - 0x1c, 0xac, 0xd3, 0x3e, 0x76, 0xb0, 0xd1, 0xf4, 0x8f, 0x7a, 0xe6, 0x5f, 0x1e, 0xea, 0x42, 0xb8, - 0xf5, 0xd0, 0x3d, 0xb6, 0xeb, 0x9d, 0xe1, 0xc0, 0xaf, 0xc2, 0x95, 0xff, 0x8a, 0x2d, 0x4c, 0xe2, - 0x67, 0x09, 0xe6, 0xab, 0xcc, 0xdc, 0xb5, 0x0d, 0x8d, 0xe3, 0x9a, 0x78, 0x97, 0xa2, 0xbb, 0x30, - 0xa3, 0xed, 0xf3, 0x36, 0x75, 0x08, 0x3f, 0x78, 0xe7, 0xfd, 0x18, 0x41, 0xd1, 0x7d, 0x48, 0x7b, - 0x2f, 0x5b, 0xff, 0x86, 0xbc, 0x94, 0x74, 0x43, 0x0a, 0x50, 0x65, 0xea, 0xc5, 0x51, 0x61, 0x42, - 0xf5, 0x4d, 0x36, 0xe7, 0xdc, 0xe8, 0x23, 0xb2, 0xd2, 0xb2, 0x78, 0xe5, 0xc4, 0xe3, 0x0a, 0x62, - 0xde, 0xf8, 0x33, 0x0d, 0xa9, 0x2a, 0x33, 0xd1, 0xf7, 0x12, 0x2c, 0x25, 0xbc, 0x60, 0x6f, 0x25, - 0xb8, 0x4e, 0x7c, 0x5e, 0xc9, 0x9f, 0x9e, 0xd6, 0x22, 0x08, 0x07, 0x7d, 0x0b, 0x8b, 0x23, 0x1f, - 0x63, 0x4a, 0x32, 0xe3, 0x28, 0xbc, 0x7c, 0xf7, 0x74, 0xf8, 0xd0, 0xff, 0x37, 0x70, 0x6e, 0xd4, - 0x3b, 0x67, 0xed, 0x5d, 0x09, 0x0d, 0xc1, 0xe5, 0x3b, 0xa7, 0x82, 0x87, 0xce, 0x29, 0xcc, 0x1f, - 0x3f, 0x79, 0xaf, 0x27, 0x33, 0x1d, 0x83, 0xca, 0xeb, 0x27, 0x86, 0x86, 0x0e, 0x09, 0x64, 0x87, - 0x0f, 0x95, 0x6b, 0xc9, 0x1c, 0x43, 0x40, 0xb9, 0x7c, 0x42, 0x60, 0xe8, 0xea, 0x07, 0x09, 0x96, - 0x93, 0xa7, 0xfb, 0x76, 0x32, 0x5d, 0xa2, 0x91, 0x7c, 0xff, 0x3d, 0x8c, 0xc2, 0x78, 0xf6, 0x60, - 0x76, 0x68, 0x4e, 0xaf, 0x26, 0x93, 0xc5, 0x71, 0xb2, 0x72, 0x32, 0x5c, 0xe0, 0x47, 0x9e, 0xfe, - 0xee, 0xed, 0xb3, 0x1b, 0x52, 0xe5, 0xc9, 0x8b, 0xd7, 0x79, 0xe9, 0xe5, 0xeb, 0xbc, 0xf4, 0xc7, - 0xeb, 0xbc, 0xf4, 0xe3, 0x9b, 0xfc, 0xc4, 0xcb, 0x37, 0xf9, 0x89, 0xdf, 0xdf, 0xe4, 0x27, 0xbe, - 0x7a, 0xe7, 0x9d, 0x39, 0x88, 0xff, 0xf1, 0x14, 0xc7, 0x6e, 0x2b, 0x2d, 0xfe, 0x78, 0xde, 0xfe, - 0x27, 0x00, 0x00, 0xff, 0xff, 0x47, 0x71, 0x56, 0xef, 0x94, 0x0f, 0x00, 0x00, + // 1279 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x6f, 0x13, 0x47, + 0x14, 0xcf, 0xc6, 0x89, 0x69, 0x9e, 0xe3, 0x24, 0x1d, 0x42, 0x70, 0xb6, 0x60, 0x3b, 0x86, 0x42, + 0xa0, 0x64, 0x4d, 0x42, 0x41, 0x25, 0xa8, 0x07, 0x9c, 0x04, 0x81, 0x8a, 0x55, 0x6b, 0xed, 0xf4, + 0xd0, 0x1e, 0xac, 0xf5, 0xee, 0x64, 0x3d, 0xb2, 0xbd, 0xb3, 0xda, 0x19, 0x5b, 0x8e, 0x2a, 0x55, + 0x15, 0xea, 0xb5, 0x52, 0x4f, 0x95, 0xda, 0x4f, 0xc1, 0x81, 0x8f, 0x50, 0x55, 0x1c, 0x11, 0xa7, + 0x2a, 0x87, 0xa8, 0x82, 0x4a, 0x7c, 0x82, 0x9e, 0x5b, 0xed, 0xec, 0x5f, 0xa7, 0xde, 0x92, 0x10, + 0x6e, 0xde, 0x99, 0xdf, 0xfb, 0xbd, 0xf7, 0x7e, 0xef, 0xbd, 0x99, 0x31, 0xe4, 0x5b, 0x5a, 0x6b, + 0xbf, 0x4b, 0xad, 0x72, 0x8b, 0xeb, 0x8c, 0x6b, 0x1d, 0x62, 0x99, 0xe5, 0xc1, 0x7a, 0x99, 0x0f, + 0x15, 0xdb, 0xa1, 0x9c, 0xa2, 0x73, 0xfe, 0xbe, 0x12, 0xed, 0x2b, 0x83, 0x75, 0x79, 0xd1, 0xa4, + 0x26, 0x15, 0x88, 0xb2, 0xfb, 0xcb, 0x03, 0xcb, 0xcb, 0x3a, 0x65, 0x3d, 0xca, 0x9a, 0xde, 0x86, + 0xf7, 0xe1, 0x6f, 0x9d, 0xf7, 0xbe, 0xca, 0x3d, 0x26, 0xf8, 0x7b, 0xcc, 0xf4, 0x37, 0x4a, 0xe3, + 0x03, 0xb0, 0x35, 0x47, 0xeb, 0x05, 0xc6, 0x37, 0x62, 0x18, 0xbd, 0x8d, 0xf5, 0x8e, 0x4d, 0x89, + 0xc5, 0x5d, 0xd8, 0xc8, 0x82, 0x8f, 0xbe, 0xec, 0xbb, 0x8a, 0xd8, 0x5a, 0x98, 0x6b, 0xeb, 0xc1, + 0xb7, 0x8f, 0x2a, 0x24, 0xf8, 0xa5, 0xb6, 0x07, 0x28, 0xfd, 0x92, 0x82, 0xe5, 0x2a, 0x33, 0xb7, + 0x1c, 0xac, 0x71, 0xfc, 0x80, 0x58, 0x5a, 0x97, 0xf0, 0xfd, 0x9a, 0x43, 0x07, 0xc4, 0xc0, 0x0e, + 0xba, 0x01, 0x53, 0x9a, 0x61, 0x38, 0x39, 0xa9, 0x28, 0xad, 0xce, 0x54, 0x72, 0x2f, 0x9f, 0xad, + 0x2d, 0xfa, 0xf9, 0xde, 0x37, 0x0c, 0x07, 0x33, 0x56, 0xe7, 0x0e, 0xb1, 0x4c, 0x55, 0xa0, 0xd0, + 0x0e, 0x64, 0x0c, 0xcc, 0x74, 0x87, 0xd8, 0x9c, 0x50, 0x2b, 0x37, 0x59, 0x94, 0x56, 0x33, 0x1b, + 0x97, 0x14, 0xdf, 0x22, 0xd2, 0x55, 0x04, 0xaa, 0x6c, 0x47, 0x50, 0x35, 0x6e, 0x87, 0xaa, 0x00, + 0x3a, 0xed, 0xf5, 0x08, 0x63, 0x2e, 0x4b, 0x4a, 0xb8, 0x5e, 0x3b, 0x38, 0x2c, 0x7c, 0xe4, 0x11, + 0x31, 0xa3, 0xa3, 0x10, 0x5a, 0xee, 0x69, 0xbc, 0xad, 0x3c, 0xc6, 0xa6, 0xa6, 0xef, 0x6f, 0x63, + 0xfd, 0xe5, 0xb3, 0x35, 0xf0, 0xfd, 0x6c, 0x63, 0x5d, 0x8d, 0x11, 0xa0, 0x2a, 0xa4, 0x5b, 0x5c, + 0x6f, 0xda, 0x9d, 0xdc, 0x54, 0x51, 0x5a, 0x9d, 0xad, 0xdc, 0x39, 0x38, 0x2c, 0x6c, 0x98, 0x84, + 0xb7, 0xfb, 0x2d, 0x45, 0xa7, 0xbd, 0xb2, 0xaf, 0x90, 0xde, 0xd6, 0x88, 0x15, 0x7c, 0x94, 0xf9, + 0xbe, 0x8d, 0x99, 0x52, 0x79, 0x54, 0xbb, 0xf5, 0xe9, 0xcd, 0x5a, 0xbf, 0xf5, 0x05, 0xde, 0x57, + 0xa7, 0x5b, 0x5c, 0xaf, 0x75, 0xd0, 0xe7, 0x90, 0xb2, 0xa9, 0x9d, 0x9b, 0x16, 0xc9, 0x7d, 0xa2, + 0x8c, 0x6d, 0x1c, 0xa5, 0xe6, 0x50, 0xba, 0xf7, 0xe5, 0x5e, 0x8d, 0x32, 0x86, 0x45, 0x14, 0x95, + 0xc6, 0x96, 0xea, 0xda, 0xa1, 0x02, 0x64, 0x74, 0x6a, 0xb1, 0x7e, 0x0f, 0x3b, 0x4d, 0x62, 0xe4, + 0xce, 0xb8, 0xd9, 0xb9, 0xe1, 0x7a, 0x4b, 0x8f, 0x8c, 0xcd, 0x99, 0x27, 0x6f, 0x9e, 0x5e, 0x17, + 0x7a, 0x96, 0x2e, 0xc1, 0x4a, 0x62, 0x69, 0x54, 0xcc, 0x6c, 0x6a, 0x31, 0x5c, 0xfa, 0x47, 0x82, + 0xf3, 0x55, 0x66, 0xee, 0x18, 0x84, 0x9f, 0xb2, 0x7c, 0xe7, 0x42, 0xa1, 0xdc, 0xca, 0xcd, 0x06, + 0x09, 0x1f, 0xa9, 0x6a, 0xea, 0xbd, 0x54, 0x75, 0xea, 0x94, 0x55, 0x8d, 0xcb, 0xb4, 0x02, 0x85, + 0x04, 0x01, 0x42, 0x91, 0x7e, 0x3f, 0x03, 0x4b, 0xa1, 0x94, 0x95, 0xc6, 0xd6, 0x36, 0xee, 0x62, + 0x53, 0x13, 0x71, 0xdd, 0x85, 0x8c, 0x9b, 0x03, 0x76, 0x9a, 0xc7, 0x92, 0x0a, 0x3c, 0xb0, 0xbb, + 0x18, 0xb4, 0xc2, 0xe4, 0x3b, 0xb6, 0x42, 0xd4, 0x98, 0xa9, 0xf7, 0xd1, 0x98, 0xdf, 0xc0, 0xdc, + 0x9e, 0xdd, 0xf4, 0x18, 0x9b, 0x5d, 0xc2, 0x78, 0x6e, 0xaa, 0x98, 0x3a, 0x05, 0x6d, 0x66, 0xcf, + 0xae, 0xb8, 0xc4, 0x8f, 0x09, 0xe3, 0x68, 0x05, 0x66, 0xfd, 0x9c, 0x9a, 0x9c, 0xf4, 0xb0, 0x68, + 0xff, 0xac, 0x9a, 0xf1, 0xd7, 0x1a, 0xa4, 0x87, 0xd1, 0x25, 0xc8, 0x06, 0x90, 0x81, 0xd6, 0xed, + 0xe3, 0x5c, 0xba, 0x28, 0xad, 0xa6, 0xd4, 0xc0, 0xee, 0x2b, 0x77, 0x0d, 0x3d, 0x04, 0x08, 0x79, + 0x86, 0xa2, 0xfb, 0x33, 0x1b, 0xd7, 0xe2, 0xca, 0xc5, 0xce, 0xb9, 0xc1, 0xba, 0xd2, 0x70, 0x34, + 0x8b, 0x69, 0xba, 0x5b, 0xa8, 0x47, 0xd6, 0x1e, 0x55, 0x67, 0x02, 0x87, 0x43, 0xb4, 0x01, 0x19, + 0xd6, 0xd5, 0x58, 0xdb, 0xa7, 0xfa, 0x40, 0x48, 0xf8, 0xe1, 0xc1, 0x61, 0x21, 0x5b, 0x69, 0x6c, + 0xd5, 0xfd, 0x9d, 0xc6, 0x50, 0x05, 0x16, 0xfe, 0x46, 0x14, 0x96, 0x0c, 0xaf, 0xf2, 0xd4, 0x69, + 0x86, 0xd6, 0x8c, 0x98, 0xb9, 0x19, 0x61, 0x7e, 0xf7, 0xe0, 0xb0, 0x70, 0xfb, 0x24, 0x52, 0xd5, + 0x89, 0x69, 0x69, 0xbc, 0xef, 0x60, 0x75, 0x31, 0x24, 0x0e, 0x7c, 0xd7, 0x89, 0x89, 0x3e, 0x86, + 0xb9, 0xbe, 0xd5, 0xa2, 0x96, 0x11, 0x0a, 0x07, 0x42, 0xb8, 0x6c, 0xb8, 0x2a, 0xa4, 0x5b, 0x81, + 0xd9, 0x18, 0x6c, 0x98, 0xcb, 0x88, 0xf9, 0xcb, 0x44, 0xa0, 0x21, 0xba, 0x0a, 0xf3, 0x11, 0xc4, + 0xd3, 0x77, 0x56, 0xe8, 0x1b, 0x39, 0xf0, 0x14, 0xde, 0x81, 0x73, 0x11, 0x30, 0xae, 0x50, 0x36, + 0x49, 0xa1, 0xb3, 0x21, 0x3e, 0x5a, 0x44, 0x4f, 0x24, 0x28, 0x46, 0x5a, 0x8d, 0x61, 0x74, 0x55, + 0x9b, 0x3b, 0xad, 0x6a, 0x17, 0x43, 0x17, 0xbb, 0x47, 0x63, 0xa8, 0x13, 0x73, 0x73, 0xc1, 0x1d, + 0xf2, 0xf8, 0x78, 0x96, 0x8a, 0x90, 0x1f, 0x3f, 0xc7, 0xe1, 0xa8, 0xff, 0x3d, 0x09, 0xa8, 0xca, + 0xcc, 0xfb, 0x86, 0xb1, 0x45, 0x07, 0xd8, 0xd2, 0x2c, 0x5e, 0x27, 0x26, 0x43, 0x4b, 0x90, 0x66, + 0xc4, 0xb4, 0xb0, 0x3f, 0xe1, 0xaa, 0xff, 0x85, 0x1e, 0xc0, 0x64, 0x70, 0xe0, 0xbd, 0xf3, 0xa4, + 0x4c, 0xda, 0x1d, 0x74, 0x05, 0xe6, 0xa3, 0xc6, 0x6e, 0xb6, 0x35, 0xd6, 0xf6, 0x6e, 0x2e, 0x35, + 0x1b, 0xb6, 0xec, 0x43, 0x8d, 0xb5, 0xd1, 0x2a, 0x2c, 0xc4, 0x8a, 0xe2, 0xaa, 0xc8, 0xbc, 0x39, + 0x55, 0xe7, 0xa2, 0x46, 0x15, 0x11, 0xeb, 0xb0, 0x10, 0x6f, 0x0a, 0x21, 0xf8, 0xf4, 0x69, 0x05, + 0x9f, 0x8b, 0xf5, 0x94, 0xdb, 0xa0, 0xf7, 0x40, 0x0e, 0xc3, 0x39, 0xea, 0x8d, 0xe5, 0xd2, 0x22, + 0xb0, 0xf3, 0x01, 0x62, 0x77, 0xc4, 0x96, 0x6d, 0x66, 0xdc, 0xf2, 0xf8, 0x42, 0x96, 0x2e, 0x80, + 0xfc, 0x5f, 0xd9, 0xc3, 0xaa, 0xfc, 0x26, 0xc1, 0x42, 0x95, 0x99, 0x95, 0xc6, 0xd6, 0xae, 0xe5, + 0xd7, 0x1c, 0x27, 0xd6, 0x64, 0x8c, 0x96, 0x93, 0xe3, 0xb4, 0x1c, 0xa7, 0x50, 0xea, 0x3d, 0x2b, + 0x34, 0x9a, 0xa4, 0x0c, 0xb9, 0xa3, 0x59, 0x84, 0x29, 0xfe, 0x2a, 0xc1, 0x85, 0x2a, 0x33, 0xeb, + 0xb8, 0x8b, 0x75, 0x4e, 0x06, 0x38, 0x68, 0xe4, 0x1d, 0xf7, 0x2a, 0xb2, 0xf4, 0xd3, 0xa7, 0xbb, + 0x06, 0x67, 0x1d, 0xac, 0xd3, 0x01, 0x76, 0xb0, 0xd1, 0xf4, 0x8f, 0x7a, 0xe6, 0x5f, 0x1e, 0xea, + 0x42, 0xb8, 0xf5, 0xc0, 0x3d, 0xb6, 0xeb, 0x9d, 0xd1, 0xc0, 0xaf, 0xc0, 0xe5, 0xff, 0x8b, 0x2d, + 0x4c, 0xe2, 0x67, 0x09, 0xe6, 0xab, 0xcc, 0xdc, 0xb5, 0x0d, 0x8d, 0xe3, 0x9a, 0x78, 0x9d, 0xa2, + 0x3b, 0x30, 0xa3, 0xf5, 0x79, 0x9b, 0x3a, 0x84, 0xef, 0xbf, 0xf5, 0x7e, 0x8c, 0xa0, 0xe8, 0x1e, + 0xa4, 0xbd, 0xf7, 0xad, 0x7f, 0x43, 0x5e, 0x4c, 0xba, 0x21, 0x05, 0xa8, 0x32, 0xf5, 0xfc, 0xb0, + 0x30, 0xa1, 0xfa, 0x26, 0x9b, 0x73, 0x6e, 0xf4, 0x11, 0x59, 0x69, 0x59, 0xbc, 0x72, 0xe2, 0x71, + 0x05, 0x31, 0x6f, 0xfc, 0x95, 0x86, 0x54, 0x95, 0x99, 0xe8, 0x07, 0x09, 0x96, 0x12, 0xde, 0xb1, + 0x37, 0x13, 0x5c, 0x27, 0x3e, 0xaf, 0xe4, 0xcf, 0x4e, 0x6a, 0x11, 0x84, 0x83, 0xbe, 0x83, 0xc5, + 0xb1, 0x8f, 0x31, 0x25, 0x99, 0x71, 0x1c, 0x5e, 0xbe, 0x73, 0x32, 0x7c, 0xe8, 0xff, 0x5b, 0x38, + 0x3b, 0xee, 0x9d, 0xb3, 0xf6, 0xb6, 0x84, 0x46, 0xe0, 0xf2, 0xed, 0x13, 0xc1, 0x43, 0xe7, 0x14, + 0xe6, 0x8f, 0x9e, 0xbc, 0xd7, 0x92, 0x99, 0x8e, 0x40, 0xe5, 0xf5, 0x63, 0x43, 0x43, 0x87, 0x04, + 0xb2, 0xa3, 0x87, 0xca, 0xd5, 0x64, 0x8e, 0x11, 0xa0, 0x5c, 0x3e, 0x26, 0x30, 0x74, 0xf5, 0xa3, + 0x04, 0xcb, 0xc9, 0xd3, 0x7d, 0x2b, 0x99, 0x2e, 0xd1, 0x48, 0xbe, 0xf7, 0x0e, 0x46, 0x61, 0x3c, + 0x7b, 0x30, 0x3b, 0x32, 0xa7, 0x57, 0x92, 0xc9, 0xe2, 0x38, 0x59, 0x39, 0x1e, 0x2e, 0xf0, 0x23, + 0x4f, 0x7f, 0xff, 0xe6, 0xe9, 0x75, 0xa9, 0xf2, 0xf8, 0xf9, 0xab, 0xbc, 0xf4, 0xe2, 0x55, 0x5e, + 0xfa, 0xf3, 0x55, 0x5e, 0xfa, 0xe9, 0x75, 0x7e, 0xe2, 0xc5, 0xeb, 0xfc, 0xc4, 0x1f, 0xaf, 0xf3, + 0x13, 0x5f, 0xbf, 0xf5, 0xce, 0x1c, 0xc6, 0xff, 0x7e, 0x8a, 0x63, 0xb7, 0x95, 0x16, 0x7f, 0x3f, + 0x6f, 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x89, 0x5b, 0x7a, 0x90, 0x9a, 0x0f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1279,10 +1279,10 @@ func (m *MsgCreateFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, erro _ = i var l int _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintTx(dAtA, i, uint64(len(m.ChainId))) + if len(m.ConsumerId) > 0 { + i -= len(m.ConsumerId) + copy(dAtA[i:], m.ConsumerId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ConsumerId))) i-- dAtA[i] = 0x3a } @@ -1970,7 +1970,7 @@ func (m *MsgCreateFinalityProvider) Size() (n int) { l = m.Pop.Size() n += 1 + l + sovTx(uint64(l)) } - l = len(m.ChainId) + l = len(m.ConsumerId) if l > 0 { n += 1 + l + sovTx(uint64(l)) } @@ -2434,7 +2434,7 @@ func (m *MsgCreateFinalityProvider) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2462,7 +2462,7 @@ func (m *MsgCreateFinalityProvider) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ConsumerId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/x/btcstkconsumer/client/cli/query.go b/x/btcstkconsumer/client/cli/query.go index 54057e1b0..c7eab5e24 100644 --- a/x/btcstkconsumer/client/cli/query.go +++ b/x/btcstkconsumer/client/cli/query.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -22,19 +23,19 @@ func GetQueryCmd(queryRoute string) *cobra.Command { } cmd.AddCommand(CmdQueryParams()) - cmd.AddCommand(CmdRegisteredChain()) - cmd.AddCommand(CmdRegisteredChains()) - cmd.AddCommand(CmdFinalityProviderChain()) + cmd.AddCommand(CmdRegisteredConsumer()) + cmd.AddCommand(CmdRegisteredConsumers()) + cmd.AddCommand(CmdFinalityProviderConsumer()) cmd.AddCommand(CmdFinalityProvider()) cmd.AddCommand(CmdFinalityProviders()) return cmd } -func CmdRegisteredChains() *cobra.Command { +func CmdRegisteredConsumers() *cobra.Command { cmd := &cobra.Command{ - Use: "registered-chains", - Short: "retrieve list of registered chains", + Use: "registered-consumers", + Short: "retrieve list of registered consumers", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) @@ -46,7 +47,7 @@ func CmdRegisteredChains() *cobra.Command { return err } - res, err := queryClient.ChainRegistryList(cmd.Context(), &types.QueryChainRegistryListRequest{ + res, err := queryClient.ConsumerRegistryList(cmd.Context(), &types.QueryConsumerRegistryListRequest{ Pagination: pageReq, }) if err != nil { @@ -58,23 +59,23 @@ func CmdRegisteredChains() *cobra.Command { } flags.AddQueryFlagsToCmd(cmd) - flags.AddPaginationFlagsToCmd(cmd, "registered-chains") + flags.AddPaginationFlagsToCmd(cmd, "registered-consumers") return cmd } -func CmdRegisteredChain() *cobra.Command { +func CmdRegisteredConsumer() *cobra.Command { cmd := &cobra.Command{ - Use: "registered-chain ", - Short: "retrieve a given registered chain's info", + Use: "registered-consumer ", + Short: "retrieve a given registered consumer's info", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) queryClient := types.NewQueryClient(clientCtx) - res, err := queryClient.ChainsRegistry( + res, err := queryClient.ConsumersRegistry( cmd.Context(), - &types.QueryChainsRegistryRequest{ - ChainIds: []string{args[0]}, + &types.QueryConsumersRegistryRequest{ + ConsumerIds: []string{args[0]}, }, ) if err != nil { @@ -90,17 +91,17 @@ func CmdRegisteredChain() *cobra.Command { return cmd } -func CmdFinalityProviderChain() *cobra.Command { +func CmdFinalityProviderConsumer() *cobra.Command { cmd := &cobra.Command{ - Use: "finality-provider-chain ", - Short: "retrieve a given CZ finality provider's registered chain id", + Use: "finality-provider-consumer ", + Short: "retrieve a given CZ finality provider's registered consumer id", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) queryClient := types.NewQueryClient(clientCtx) - res, err := queryClient.FinalityProviderChain( + res, err := queryClient.FinalityProviderConsumer( cmd.Context(), - &types.QueryFinalityProviderChainRequest{ + &types.QueryFinalityProviderConsumerRequest{ FpBtcPkHex: args[0], }, ) @@ -119,8 +120,8 @@ func CmdFinalityProviderChain() *cobra.Command { func CmdFinalityProvider() *cobra.Command { cmd := &cobra.Command{ - Use: "finality-provider ", - Short: "retrieve a given chain's finality provider", + Use: "finality-provider ", + Short: "retrieve a given consumer's finality provider", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) @@ -129,7 +130,7 @@ func CmdFinalityProvider() *cobra.Command { cmd.Context(), &types.QueryFinalityProviderRequest{ FpBtcPkHex: args[1], - ChainId: args[0], + ConsumerId: args[0], }, ) if err != nil { @@ -147,8 +148,8 @@ func CmdFinalityProvider() *cobra.Command { func CmdFinalityProviders() *cobra.Command { cmd := &cobra.Command{ - Use: "finality-providers ", - Short: "retrieve a given chain's all finality providers", + Use: "finality-providers ", + Short: "retrieve a given consumer's all finality providers", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) @@ -161,7 +162,7 @@ func CmdFinalityProviders() *cobra.Command { } res, err := queryClient.FinalityProviders(cmd.Context(), &types.QueryFinalityProvidersRequest{ - ChainId: args[0], + ConsumerId: args[0], Pagination: pageReq, }) if err != nil { diff --git a/x/btcstkconsumer/client/cli/tx.go b/x/btcstkconsumer/client/cli/tx.go index 15de14cab..7757c6927 100644 --- a/x/btcstkconsumer/client/cli/tx.go +++ b/x/btcstkconsumer/client/cli/tx.go @@ -2,9 +2,10 @@ package cli import ( "fmt" - "github.com/cosmos/cosmos-sdk/client/flags" "strings" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/spf13/cobra" @@ -23,19 +24,19 @@ func GetTxCmd() *cobra.Command { } cmd.AddCommand( - NewRegisterChainCmd(), + NewRegisterConsumerCmd(), ) return cmd } -func NewRegisterChainCmd() *cobra.Command { +func NewRegisterConsumerCmd() *cobra.Command { cmd := &cobra.Command{ - Use: "register-chain [description]", + Use: "register-consumer [description]", Args: cobra.RangeArgs(2, 3), - Short: "Registers a CZ chain", + Short: "Registers a CZ consumer", Long: strings.TrimSpace( - `Registers a CZ chain.`, + `Registers a CZ consumer.`, ), RunE: func(cmd *cobra.Command, args []string) error { clientCtx, err := client.GetClientTxContext(cmd) @@ -44,24 +45,24 @@ func NewRegisterChainCmd() *cobra.Command { } // get description - chainId := args[0] - if chainId == "" { - return fmt.Errorf("chain's id cannot be empty") + consumerId := args[0] + if consumerId == "" { + return fmt.Errorf("consumer's id cannot be empty") } name := args[1] if name == "" { - return fmt.Errorf("chain's name cannot be empty") + return fmt.Errorf("consumer's name cannot be empty") } description := "" if len(args) == 3 { description = args[2] } - msg := types.MsgRegisterChain{ - Signer: clientCtx.FromAddress.String(), - ChainId: chainId, - ChainName: name, - ChainDescription: description, + msg := types.MsgRegisterConsumer{ + Signer: clientCtx.FromAddress.String(), + ConsumerId: consumerId, + ConsumerName: name, + ConsumerDescription: description, } return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) diff --git a/x/btcstkconsumer/keeper/consumer_chain_registry.go b/x/btcstkconsumer/keeper/consumer_chain_registry.go deleted file mode 100644 index 45441471c..000000000 --- a/x/btcstkconsumer/keeper/consumer_chain_registry.go +++ /dev/null @@ -1,56 +0,0 @@ -package keeper - -import ( - "context" - "github.com/cosmos/cosmos-sdk/runtime" - - "cosmossdk.io/store/prefix" - "github.com/babylonchain/babylon/x/btcstkconsumer/types" -) - -func (k Keeper) SetChainRegister(ctx context.Context, chainRegister *types.ChainRegister) { - store := k.chainRegistryStore(ctx) - store.Set([]byte(chainRegister.ChainId), k.cdc.MustMarshal(chainRegister)) -} - -// IsChainRegistered returns whether the chain register exists for a given ID -func (k Keeper) IsConsumerChainRegistered(ctx context.Context, chainID string) bool { - store := k.chainRegistryStore(ctx) - return store.Has([]byte(chainID)) -} - -// GetChainRegister returns the ChainRegister struct for a chain with a given ID. -func (k Keeper) GetChainRegister(ctx context.Context, chainID string) (*types.ChainRegister, error) { - if !k.IsConsumerChainRegistered(ctx, chainID) { - return nil, types.ErrChainNotRegistered - } - - store := k.chainRegistryStore(ctx) - chainRegisterBytes := store.Get([]byte(chainID)) - var chainRegister types.ChainRegister - k.cdc.MustUnmarshal(chainRegisterBytes, &chainRegister) - return &chainRegister, nil -} - -// GetAllRegisteredChainIDs gets all chain IDs that registered to Babylon -func (k Keeper) GetAllRegisteredChainIDs(ctx context.Context) []string { - chainIDs := []string{} - iter := k.chainRegistryStore(ctx).Iterator(nil, nil) - defer iter.Close() - - for ; iter.Valid(); iter.Next() { - chainIDBytes := iter.Key() - chainID := string(chainIDBytes) - chainIDs = append(chainIDs, chainID) - } - return chainIDs -} - -// chainRegistryStore stores the information of registered CZ chains -// prefix: ConsumerChainRegisterKey -// key: chainID -// value: ChainRegister -func (k Keeper) chainRegistryStore(ctx context.Context) prefix.Store { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - return prefix.NewStore(storeAdapter, types.ConsumerChainRegisterKey) -} diff --git a/x/btcstkconsumer/keeper/consumer_chain_registry_test.go b/x/btcstkconsumer/keeper/consumer_chain_registry_test.go deleted file mode 100644 index 8ab7210cf..000000000 --- a/x/btcstkconsumer/keeper/consumer_chain_registry_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package keeper_test - -import ( - "math/rand" - "testing" - - "github.com/babylonchain/babylon/app" - "github.com/babylonchain/babylon/testutil/datagen" - "github.com/stretchr/testify/require" -) - -func FuzzChainRegistry(f *testing.F) { - datagen.AddRandomSeedsToFuzzer(f, 10) - - f.Fuzz(func(t *testing.T, seed int64) { - r := rand.New(rand.NewSource(seed)) - - babylonApp := app.Setup(t, false) - zcKeeper := babylonApp.BTCStkConsumerKeeper - ctx := babylonApp.NewContext(false) - - // generate a random chain register - chainRegister := datagen.GenRandomChainRegister(r) - - // check that the chain is not registered - isRegistered := zcKeeper.IsConsumerChainRegistered(ctx, chainRegister.ChainId) - require.False(t, isRegistered) - - // Check that the chain is not registered - chainRegister2, err := zcKeeper.GetChainRegister(ctx, chainRegister.ChainId) - require.Error(t, err) - require.Nil(t, chainRegister2) - - // Register the chain - zcKeeper.SetChainRegister(ctx, chainRegister) - - // check that the chain is registered - chainRegister2, err = zcKeeper.GetChainRegister(ctx, chainRegister.ChainId) - require.NoError(t, err) - require.Equal(t, chainRegister.ChainId, chainRegister2.ChainId) - require.Equal(t, chainRegister.ChainName, chainRegister2.ChainName) - require.Equal(t, chainRegister.ChainDescription, chainRegister2.ChainDescription) - }) -} diff --git a/x/btcstkconsumer/keeper/consumer_registry.go b/x/btcstkconsumer/keeper/consumer_registry.go new file mode 100644 index 000000000..8267eacfa --- /dev/null +++ b/x/btcstkconsumer/keeper/consumer_registry.go @@ -0,0 +1,57 @@ +package keeper + +import ( + "context" + + "github.com/cosmos/cosmos-sdk/runtime" + + "cosmossdk.io/store/prefix" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" +) + +func (k Keeper) SetConsumerRegister(ctx context.Context, consumerRegister *types.ConsumerRegister) { + store := k.consumerRegistryStore(ctx) + store.Set([]byte(consumerRegister.ConsumerId), k.cdc.MustMarshal(consumerRegister)) +} + +// IsConsumerRegistered returns whether the consumer register exists for a given ID +func (k Keeper) IsConsumerRegistered(ctx context.Context, consumerID string) bool { + store := k.consumerRegistryStore(ctx) + return store.Has([]byte(consumerID)) +} + +// GetConsumerRegister returns the ConsumerRegister struct for a consumer with a given ID. +func (k Keeper) GetConsumerRegister(ctx context.Context, consumerID string) (*types.ConsumerRegister, error) { + if !k.IsConsumerRegistered(ctx, consumerID) { + return nil, types.ErrConsumerNotRegistered + } + + store := k.consumerRegistryStore(ctx) + consumerRegisterBytes := store.Get([]byte(consumerID)) + var consumerRegister types.ConsumerRegister + k.cdc.MustUnmarshal(consumerRegisterBytes, &consumerRegister) + return &consumerRegister, nil +} + +// GetAllRegisteredConsumerIDs gets all consumer IDs that registered to Babylon +func (k Keeper) GetAllRegisteredConsumerIDs(ctx context.Context) []string { + consumerIDs := []string{} + iter := k.consumerRegistryStore(ctx).Iterator(nil, nil) + defer iter.Close() + + for ; iter.Valid(); iter.Next() { + consumerIDBytes := iter.Key() + consumerID := string(consumerIDBytes) + consumerIDs = append(consumerIDs, consumerID) + } + return consumerIDs +} + +// consumerRegistryStore stores the information of registered CZ consumers +// prefix: ConsumerRegisterKey +// key: consumerID +// value: ConsumerRegister +func (k Keeper) consumerRegistryStore(ctx context.Context) prefix.Store { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + return prefix.NewStore(storeAdapter, types.ConsumerRegisterKey) +} diff --git a/x/btcstkconsumer/keeper/consumer_registry_test.go b/x/btcstkconsumer/keeper/consumer_registry_test.go new file mode 100644 index 000000000..a7f1b6417 --- /dev/null +++ b/x/btcstkconsumer/keeper/consumer_registry_test.go @@ -0,0 +1,44 @@ +package keeper_test + +import ( + "math/rand" + "testing" + + "github.com/babylonchain/babylon/app" + "github.com/babylonchain/babylon/testutil/datagen" + "github.com/stretchr/testify/require" +) + +func FuzzConsumerRegistry(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + + babylonApp := app.Setup(t, false) + zcKeeper := babylonApp.BTCStkConsumerKeeper + ctx := babylonApp.NewContext(false) + + // generate a random consumer register + consumerRegister := datagen.GenRandomConsumerRegister(r) + + // check that the consumer is not registered + isRegistered := zcKeeper.IsConsumerRegistered(ctx, consumerRegister.ConsumerId) + require.False(t, isRegistered) + + // Check that the consumer is not registered + consumerRegister2, err := zcKeeper.GetConsumerRegister(ctx, consumerRegister.ConsumerId) + require.Error(t, err) + require.Nil(t, consumerRegister2) + + // Register the consumer + zcKeeper.SetConsumerRegister(ctx, consumerRegister) + + // check that the consumer is registered + consumerRegister2, err = zcKeeper.GetConsumerRegister(ctx, consumerRegister.ConsumerId) + require.NoError(t, err) + require.Equal(t, consumerRegister.ConsumerId, consumerRegister2.ConsumerId) + require.Equal(t, consumerRegister.ConsumerName, consumerRegister2.ConsumerName) + require.Equal(t, consumerRegister.ConsumerDescription, consumerRegister2.ConsumerDescription) + }) +} diff --git a/x/btcstkconsumer/keeper/finality_provider_registry.go b/x/btcstkconsumer/keeper/finality_provider_registry.go index ce63fe45b..6f1302d30 100644 --- a/x/btcstkconsumer/keeper/finality_provider_registry.go +++ b/x/btcstkconsumer/keeper/finality_provider_registry.go @@ -15,20 +15,20 @@ import ( // SetConsumerFinalityProvider adds the given finality provider to CZ chains KVStore func (k Keeper) SetConsumerFinalityProvider(ctx context.Context, fp *btcstaking.FinalityProvider) { - store := k.finalityProviderStore(ctx, fp.ChainId) + store := k.finalityProviderStore(ctx, fp.ConsumerId) fpBytes := k.cdc.MustMarshal(fp) store.Set(fp.BtcPk.MustMarshal(), fpBytes) // Update the finality provider chain store fpChainStore := k.finalityProviderChainStore(ctx) - fpChainStore.Set(fp.BtcPk.MustMarshal(), []byte(fp.ChainId)) + fpChainStore.Set(fp.BtcPk.MustMarshal(), []byte(fp.ConsumerId)) } // GetConsumerFinalityProvider gets the finality provider in the chain id with the given finality provider Bitcoin PK -func (k Keeper) GetConsumerFinalityProvider(ctx context.Context, chainID string, fpBTCPK *bbn.BIP340PubKey) (*btcstaking.FinalityProvider, error) { +func (k Keeper) GetConsumerFinalityProvider(ctx context.Context, consumerId string, fpBTCPK *bbn.BIP340PubKey) (*btcstaking.FinalityProvider, error) { if !k.HasConsumerFinalityProvider(ctx, fpBTCPK) { return nil, btcstaking.ErrFpNotFound } - store := k.finalityProviderStore(ctx, chainID) + store := k.finalityProviderStore(ctx, consumerId) fpBytes := store.Get(*fpBTCPK) if fpBytes == nil { // FP exists, but not for this chain id @@ -45,8 +45,8 @@ func (k Keeper) HasConsumerFinalityProvider(ctx context.Context, fpBTCPK *bbn.BI return store.Has(*fpBTCPK) } -// GetConsumerFinalityProviderChain gets the finality provider chain id for the given finality provider Bitcoin PK -func (k Keeper) GetConsumerFinalityProviderChain(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) { +// GetConsumerOfFinalityProvider gets the finality provider chain id for the given finality provider Bitcoin PK +func (k Keeper) GetConsumerOfFinalityProvider(ctx context.Context, fpBTCPK *bbn.BIP340PubKey) (string, error) { if !k.HasConsumerFinalityProvider(ctx, fpBTCPK) { return "", btcstaking.ErrFpNotFound } diff --git a/x/btcstkconsumer/keeper/finality_provider_registry_test.go b/x/btcstkconsumer/keeper/finality_provider_registry_test.go index 82a9df098..cf6136a3b 100644 --- a/x/btcstkconsumer/keeper/finality_provider_registry_test.go +++ b/x/btcstkconsumer/keeper/finality_provider_registry_test.go @@ -1,11 +1,12 @@ package keeper_test import ( - btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" - "github.com/babylonchain/babylon/x/btcstkconsumer/types" "math/rand" "testing" + btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/babylonchain/babylon/x/btcstkconsumer/types" + "github.com/babylonchain/babylon/app" "github.com/babylonchain/babylon/testutil/datagen" "github.com/stretchr/testify/require" @@ -20,36 +21,36 @@ func FuzzFPRegistry(f *testing.F) { babylonApp := app.Setup(t, false) bscKeeper := babylonApp.BTCStkConsumerKeeper ctx := babylonApp.NewContext(false) - // Create a random chain id that starts with "test-" - czChainID := "test-" + datagen.GenRandomHexStr(r, 10) + // Create a random consumer id that starts with "test-" + consumerID := "test-" + datagen.GenRandomHexStr(r, 10) - // check that the chain is not registered - isRegistered := bscKeeper.IsConsumerChainRegistered(ctx, czChainID) + // check that the consumer is not registered + isRegistered := bscKeeper.IsConsumerRegistered(ctx, consumerID) require.False(t, isRegistered) // Create a random finality provider public key fpBtcPk, err := datagen.GenRandomBIP340PubKey(r) require.NoError(t, err) - // Create a random chain name - czChainName := datagen.GenRandomHexStr(r, 5) - // Create a random chain description - czChainDesc := "Chain description: " + datagen.GenRandomHexStr(r, 15) + // Create a random consumer name + consumerName := datagen.GenRandomHexStr(r, 5) + // Create a random consumer description + consumerDesc := "Consumer description: " + datagen.GenRandomHexStr(r, 15) - // Populate ChainRegister object - chainRegister := &types.ChainRegister{ - ChainId: czChainID, - ChainName: czChainName, - ChainDescription: czChainDesc, + // Populate ConsumerRegister object + consumerRegister := &types.ConsumerRegister{ + ConsumerId: consumerID, + ConsumerName: consumerName, + ConsumerDescription: consumerDesc, } - // Register the chain - bscKeeper.SetChainRegister(ctx, chainRegister) + // Register the consumer + bscKeeper.SetConsumerRegister(ctx, consumerRegister) - // Now add a finality provider for the chain to the registry + // Now add a finality provider for the consumer to the registry fp := btcstaking.FinalityProvider{ - BtcPk: fpBtcPk, - ChainId: czChainID, + BtcPk: fpBtcPk, + ConsumerId: consumerID, } bscKeeper.SetConsumerFinalityProvider(ctx, &fp) diff --git a/x/btcstkconsumer/keeper/grpc_query.go b/x/btcstkconsumer/keeper/grpc_query.go index c490be9e5..b2e31ba0b 100644 --- a/x/btcstkconsumer/keeper/grpc_query.go +++ b/x/btcstkconsumer/keeper/grpc_query.go @@ -2,6 +2,7 @@ package keeper import ( "context" + errorsmod "cosmossdk.io/errors" btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -16,77 +17,77 @@ import ( var _ types.QueryServer = Keeper{} -const maxQueryChainsRegistryLimit = 100 +const maxQueryConsumersRegistryLimit = 100 -func (k Keeper) ChainRegistryList(c context.Context, req *types.QueryChainRegistryListRequest) (*types.QueryChainRegistryListResponse, error) { +func (k Keeper) ConsumerRegistryList(c context.Context, req *types.QueryConsumerRegistryListRequest) (*types.QueryConsumerRegistryListResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } ctx := sdk.UnwrapSDKContext(c) - chainIDs := []string{} - store := k.chainRegistryStore(ctx) + consumerIDs := []string{} + store := k.consumerRegistryStore(ctx) pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { - chainID := string(key) - chainIDs = append(chainIDs, chainID) + consumerID := string(key) + consumerIDs = append(consumerIDs, consumerID) return nil }) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } - resp := &types.QueryChainRegistryListResponse{ - ChainIds: chainIDs, - Pagination: pageRes, + resp := &types.QueryConsumerRegistryListResponse{ + ConsumerIds: consumerIDs, + Pagination: pageRes, } return resp, nil } -// ChainsRegistry returns the registration for a given list of chains -func (k Keeper) ChainsRegistry(c context.Context, req *types.QueryChainsRegistryRequest) (*types.QueryChainsRegistryResponse, error) { +// ConsumersRegistry returns the registration for a given list of consumers +func (k Keeper) ConsumersRegistry(c context.Context, req *types.QueryConsumersRegistryRequest) (*types.QueryConsumersRegistryResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - // return if no chain IDs are provided - if len(req.ChainIds) == 0 { - return nil, status.Error(codes.InvalidArgument, "chain IDs cannot be empty") + // return if no consumer IDs are provided + if len(req.ConsumerIds) == 0 { + return nil, status.Error(codes.InvalidArgument, "consumer IDs cannot be empty") } - // return if chain IDs exceed the limit - if len(req.ChainIds) > maxQueryChainsRegistryLimit { - return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d chains", maxQueryChainsRegistryLimit) + // return if consumer IDs exceed the limit + if len(req.ConsumerIds) > maxQueryConsumersRegistryLimit { + return nil, status.Errorf(codes.InvalidArgument, "cannot query more than %d consumers", maxQueryConsumersRegistryLimit) } - // return if chain IDs contain duplicates or empty strings - if err := bbn.CheckForDuplicatesAndEmptyStrings(req.ChainIds); err != nil { - return nil, status.Error(codes.InvalidArgument, types.ErrInvalidChainIDs.Wrap(err.Error()).Error()) + // return if consumer IDs contain duplicates or empty strings + if err := bbn.CheckForDuplicatesAndEmptyStrings(req.ConsumerIds); err != nil { + return nil, status.Error(codes.InvalidArgument, types.ErrInvalidConsumerIDs.Wrap(err.Error()).Error()) } ctx := sdk.UnwrapSDKContext(c) - var chainsRegister []*types.ChainRegister - for _, chainID := range req.ChainIds { - chainRegister, err := k.GetChainRegister(ctx, chainID) + var consumersRegister []*types.ConsumerRegister + for _, consumerID := range req.ConsumerIds { + consumerRegister, err := k.GetConsumerRegister(ctx, consumerID) if err != nil { return nil, err } - chainsRegister = append(chainsRegister, chainRegister) + consumersRegister = append(consumersRegister, consumerRegister) } - resp := &types.QueryChainsRegistryResponse{ChainsRegister: chainsRegister} + resp := &types.QueryConsumersRegistryResponse{ConsumersRegister: consumersRegister} return resp, nil } -// FinalityProviders returns a paginated list of all registered finality providers for a given chain +// FinalityProviders returns a paginated list of all registered finality providers for a given consumer func (k Keeper) FinalityProviders(c context.Context, req *types.QueryFinalityProvidersRequest) (*types.QueryFinalityProvidersResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } ctx := sdk.UnwrapSDKContext(c) - store := k.finalityProviderStore(ctx, req.ChainId) + store := k.finalityProviderStore(ctx, req.ConsumerId) var fpResp []*types.FinalityProviderResponse pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { @@ -123,7 +124,7 @@ func (k Keeper) FinalityProvider(c context.Context, req *types.QueryFinalityProv } ctx := sdk.UnwrapSDKContext(c) - fp, err := k.GetConsumerFinalityProvider(ctx, req.ChainId, fpPK) + fp, err := k.GetConsumerFinalityProvider(ctx, req.ConsumerId, fpPK) if err != nil { return nil, err } @@ -132,8 +133,8 @@ func (k Keeper) FinalityProvider(c context.Context, req *types.QueryFinalityProv return &types.QueryFinalityProviderResponse{FinalityProvider: fpResp}, nil } -// FinalityProviderChain returns the chain ID for the finality provider with the specified finality provider BTC PK -func (k Keeper) FinalityProviderChain(c context.Context, req *types.QueryFinalityProviderChainRequest) (*types.QueryFinalityProviderChainResponse, error) { +// FinalityProviderConsumer returns the consumer ID for the finality provider with the specified finality provider BTC PK +func (k Keeper) FinalityProviderConsumer(c context.Context, req *types.QueryFinalityProviderConsumerRequest) (*types.QueryFinalityProviderConsumerResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -149,10 +150,10 @@ func (k Keeper) FinalityProviderChain(c context.Context, req *types.QueryFinalit } ctx := sdk.UnwrapSDKContext(c) - chainID, err := k.GetConsumerFinalityProviderChain(ctx, fpPK) + consumerID, err := k.GetConsumerOfFinalityProvider(ctx, fpPK) if err != nil { return nil, err } - return &types.QueryFinalityProviderChainResponse{ChainId: chainID}, nil + return &types.QueryFinalityProviderConsumerResponse{ConsumerId: consumerID}, nil } diff --git a/x/btcstkconsumer/keeper/grpc_query_test.go b/x/btcstkconsumer/keeper/grpc_query_test.go index 7721d63e5..ee50fba47 100644 --- a/x/btcstkconsumer/keeper/grpc_query_test.go +++ b/x/btcstkconsumer/keeper/grpc_query_test.go @@ -16,11 +16,11 @@ import ( btcstaking "github.com/babylonchain/babylon/x/btcstaking/types" ) -type chainRegister struct { - chainID string +type consumerRegister struct { + consumerID string } -func FuzzChainRegistryList(f *testing.F) { +func FuzzConsumerRegistryList(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { @@ -30,38 +30,38 @@ func FuzzChainRegistryList(f *testing.F) { bscKeeper := babylonApp.BTCStkConsumerKeeper ctx := babylonApp.NewContext(false) - // invoke the chain registration a random number of times with random chain IDs + // invoke the consumer registration a random number of times with random consumer IDs numRegistrations := datagen.RandomInt(r, 100) + 1 - var allChainIDs []string + var allConsumerIDs []string for i := uint64(0); i < numRegistrations; i++ { - var chainID = datagen.GenRandomHexStr(r, 30) - allChainIDs = append(allChainIDs, chainID) + var consumerID = datagen.GenRandomHexStr(r, 30) + allConsumerIDs = append(allConsumerIDs, consumerID) - bscKeeper.SetChainRegister(ctx, &types.ChainRegister{ - ChainId: chainID, - ChainName: datagen.GenRandomHexStr(r, 5), + bscKeeper.SetConsumerRegister(ctx, &types.ConsumerRegister{ + ConsumerId: consumerID, + ConsumerName: datagen.GenRandomHexStr(r, 5), }) } - limit := datagen.RandomInt(r, len(allChainIDs)) + 1 + limit := datagen.RandomInt(r, len(allConsumerIDs)) + 1 - // Query to get actual chain IDs - resp, err := bscKeeper.ChainRegistryList(ctx, &types.QueryChainRegistryListRequest{ + // Query to get actual consumer IDs + resp, err := bscKeeper.ConsumerRegistryList(ctx, &types.QueryConsumerRegistryListRequest{ Pagination: &query.PageRequest{ Limit: limit, }, }) require.NoError(t, err) - actualChainIDs := resp.ChainIds + actualConsumerIDs := resp.ConsumerIds - require.Equal(t, limit, uint64(len(actualChainIDs))) + require.Equal(t, limit, uint64(len(actualConsumerIDs))) for i := uint64(0); i < limit; i++ { - require.Contains(t, allChainIDs, actualChainIDs[i]) + require.Contains(t, allConsumerIDs, actualConsumerIDs[i]) } }) } -func FuzzChainsRegistry(f *testing.F) { +func FuzzConsumersRegistry(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { @@ -72,33 +72,33 @@ func FuzzChainsRegistry(f *testing.F) { ctx := babylonApp.NewContext(false) var ( - chainsRegister []chainRegister - chainIDs []string + consumersRegister []consumerRegister + consumerIDs []string ) - // invoke the chain registration a random number of times with random chain IDs - numChains := datagen.RandomInt(r, 100) + 1 - for i := uint64(0); i < numChains; i++ { - chainID := datagen.GenRandomHexStr(r, 30) - - chainIDs = append(chainIDs, chainID) - chainsRegister = append(chainsRegister, chainRegister{ - chainID: chainID, + // invoke the consumer registration a random number of times with random consumer IDs + numConsumers := datagen.RandomInt(r, 100) + 1 + for i := uint64(0); i < numConsumers; i++ { + consumerID := datagen.GenRandomHexStr(r, 30) + + consumerIDs = append(consumerIDs, consumerID) + consumersRegister = append(consumersRegister, consumerRegister{ + consumerID: consumerID, }) - bscKeeper.SetChainRegister(ctx, &types.ChainRegister{ - ChainId: chainID, - ChainName: datagen.GenRandomHexStr(r, 5), + bscKeeper.SetConsumerRegister(ctx, &types.ConsumerRegister{ + ConsumerId: consumerID, + ConsumerName: datagen.GenRandomHexStr(r, 5), }) } - resp, err := bscKeeper.ChainsRegistry(ctx, &types.QueryChainsRegistryRequest{ - ChainIds: chainIDs, + resp, err := bscKeeper.ConsumersRegistry(ctx, &types.QueryConsumersRegistryRequest{ + ConsumerIds: consumerIDs, }) require.NoError(t, err) - for i, respData := range resp.ChainsRegister { - require.Equal(t, chainsRegister[i].chainID, respData.ChainId) + for i, respData := range resp.ConsumersRegister { + require.Equal(t, consumersRegister[i].consumerID, respData.ConsumerId) } }) } @@ -112,13 +112,13 @@ func FuzzFinalityProviders(f *testing.F) { bscKeeper := babylonApp.BTCStkConsumerKeeper ctx := babylonApp.NewContext(false) - // Generate random finality providers and add them to kv store under a chain id - chainID := datagen.GenRandomHexStr(r, 30) + // Generate random finality providers and add them to kv store under a consumer id + consumerID := datagen.GenRandomHexStr(r, 30) fpsMap := make(map[string]*btcstaking.FinalityProvider) for i := 0; i < int(datagen.RandomInt(r, 10)+1); i++ { fp, err := datagen.GenRandomFinalityProvider(r) require.NoError(t, err) - fp.ChainId = chainID + fp.ConsumerId = consumerID bscKeeper.SetConsumerFinalityProvider(ctx, fp) fpsMap[fp.BtcPk.MarshalHex()] = fp @@ -138,7 +138,7 @@ func FuzzFinalityProviders(f *testing.F) { limit := datagen.RandomInt(r, numOfFpsInStore) + 1 pagination := constructRequestWithLimit(r, limit) // Generate the initial query - req := types.QueryFinalityProvidersRequest{ChainId: chainID, Pagination: pagination} + req := types.QueryFinalityProvidersRequest{ConsumerId: consumerID, Pagination: pagination} // Construct a mapping from the finality providers found to a boolean value // Will be used later to evaluate whether all the finality providers were returned fpsFound := make(map[string]bool) @@ -162,7 +162,7 @@ func FuzzFinalityProviders(f *testing.F) { // Construct the next page request pagination = constructRequestWithKeyAndLimit(r, resp.Pagination.NextKey, limit) - req = types.QueryFinalityProvidersRequest{ChainId: chainID, Pagination: pagination} + req = types.QueryFinalityProvidersRequest{ConsumerId: consumerID, Pagination: pagination} } if len(fpsFound) != len(fpsMap) { @@ -180,14 +180,14 @@ func FuzzFinalityProvider(f *testing.F) { bscKeeper := babylonApp.BTCStkConsumerKeeper ctx := babylonApp.NewContext(false) - // Generate random finality providers and add them to kv store under a chain id + // Generate random finality providers and add them to kv store under a consumer id fpsMap := make(map[string]*btcstaking.FinalityProvider) - chainID := datagen.GenRandomHexStr(r, 30) + consumerID := datagen.GenRandomHexStr(r, 30) var existingFp string for i := 0; i < int(datagen.RandomInt(r, 10)+1); i++ { fp, err := datagen.GenRandomFinalityProvider(r) require.NoError(t, err) - fp.ChainId = chainID + fp.ConsumerId = consumerID bscKeeper.SetConsumerFinalityProvider(ctx, fp) existingFp = fp.BtcPk.MarshalHex() @@ -201,7 +201,7 @@ func FuzzFinalityProvider(f *testing.F) { for k, v := range fpsMap { // Generate a request with a valid key - req := types.QueryFinalityProviderRequest{ChainId: chainID, FpBtcPkHex: k} + req := types.QueryFinalityProviderRequest{ConsumerId: consumerID, FpBtcPkHex: k} resp, err := bscKeeper.FinalityProvider(ctx, &req) if err != nil { t.Errorf("Valid request led to an error %s", err) @@ -218,14 +218,14 @@ func FuzzFinalityProvider(f *testing.F) { // check some random non-existing guy fp, err := datagen.GenRandomFinalityProvider(r) require.NoError(t, err) - req := types.QueryFinalityProviderRequest{ChainId: chainID, FpBtcPkHex: fp.BtcPk.MarshalHex()} + req := types.QueryFinalityProviderRequest{ConsumerId: consumerID, FpBtcPkHex: fp.BtcPk.MarshalHex()} respNonExists, err := bscKeeper.FinalityProvider(ctx, &req) require.Error(t, err) require.Nil(t, respNonExists) require.True(t, errors.Is(err, btcstaking.ErrFpNotFound)) - // check some existing fp over a random non-existing chain-id - req = types.QueryFinalityProviderRequest{ChainId: "nonexistent", FpBtcPkHex: existingFp} + // check some existing fp over a random non-existing consumer-id + req = types.QueryFinalityProviderRequest{ConsumerId: "nonexistent", FpBtcPkHex: existingFp} respNonExists, err = bscKeeper.FinalityProvider(ctx, &req) require.Error(t, err) require.Nil(t, respNonExists) @@ -233,8 +233,8 @@ func FuzzFinalityProvider(f *testing.F) { }) } -// FuzzFinalityProviderChain tests the FinalityProviderChain gRPC query endpoint -func FuzzFinalityProviderChain(f *testing.F) { +// FuzzFinalityProviderConsumer tests the FinalityProviderConsumer gRPC query endpoint +func FuzzFinalityProviderConsumer(f *testing.F) { datagen.AddRandomSeedsToFuzzer(f, 10) f.Fuzz(func(t *testing.T, seed int64) { r := rand.New(rand.NewSource(seed)) @@ -243,14 +243,14 @@ func FuzzFinalityProviderChain(f *testing.F) { bscKeeper := babylonApp.BTCStkConsumerKeeper ctx := babylonApp.NewContext(false) - // Generate random finality providers and add them to kv store under a chain id + // Generate random finality providers and add them to kv store under a consumer id fpsMap := make(map[string]*btcstaking.FinalityProvider) - chainID := datagen.GenRandomHexStr(r, 30) + consumerID := datagen.GenRandomHexStr(r, 30) var existingFp string for i := 0; i < int(datagen.RandomInt(r, 10)+1); i++ { fp, err := datagen.GenRandomFinalityProvider(r) require.NoError(t, err) - fp.ChainId = chainID + fp.ConsumerId = consumerID bscKeeper.SetConsumerFinalityProvider(ctx, fp) existingFp = fp.BtcPk.MarshalHex() @@ -258,13 +258,13 @@ func FuzzFinalityProviderChain(f *testing.F) { } // Test nil request - resp, err := bscKeeper.FinalityProviderChain(ctx, nil) + resp, err := bscKeeper.FinalityProviderConsumer(ctx, nil) require.Error(t, err) require.Nil(t, resp) // Generate a request with a valid key - req := types.QueryFinalityProviderChainRequest{FpBtcPkHex: existingFp} - resp, err = bscKeeper.FinalityProviderChain(ctx, &req) + req := types.QueryFinalityProviderConsumerRequest{FpBtcPkHex: existingFp} + resp, err = bscKeeper.FinalityProviderConsumer(ctx, &req) if err != nil { t.Errorf("Valid request led to an error %s", err) } @@ -273,13 +273,13 @@ func FuzzFinalityProviderChain(f *testing.F) { } // check keys from map matches those in returned response - require.Equal(t, chainID, resp.ChainId) + require.Equal(t, consumerID, resp.ConsumerId) // check some random non-existing guy fp, err := datagen.GenRandomFinalityProvider(r) require.NoError(t, err) - req = types.QueryFinalityProviderChainRequest{FpBtcPkHex: fp.BtcPk.MarshalHex()} - respNonExists, err := bscKeeper.FinalityProviderChain(ctx, &req) + req = types.QueryFinalityProviderConsumerRequest{FpBtcPkHex: fp.BtcPk.MarshalHex()} + respNonExists, err := bscKeeper.FinalityProviderConsumer(ctx, &req) require.Error(t, err) require.Nil(t, respNonExists) require.True(t, errors.Is(err, btcstaking.ErrFpNotFound)) diff --git a/x/btcstkconsumer/keeper/msg_server.go b/x/btcstkconsumer/keeper/msg_server.go index 46180e36b..f8b5c615a 100644 --- a/x/btcstkconsumer/keeper/msg_server.go +++ b/x/btcstkconsumer/keeper/msg_server.go @@ -19,24 +19,24 @@ func NewMsgServerImpl(keeper Keeper) types.MsgServer { var _ types.MsgServer = msgServer{} -// RegisterChain registers a CZ chain -func (ms msgServer) RegisterChain(goCtx context.Context, req *types.MsgRegisterChain) (*types.MsgRegisterChainResponse, error) { - // Create ChanRegister from MsgRegisterChain - chainRegister := types.ChainRegister{ - ChainId: req.ChainId, - ChainName: req.ChainName, - ChainDescription: req.ChainDescription, +// RegisterConsumer registers a CZ consumer +func (ms msgServer) RegisterConsumer(goCtx context.Context, req *types.MsgRegisterConsumer) (*types.MsgRegisterConsumerResponse, error) { + // Create ChanRegister from MsgRegisterConsumer + consumerRegister := types.ConsumerRegister{ + ConsumerId: req.ConsumerId, + ConsumerName: req.ConsumerName, + ConsumerDescription: req.ConsumerDescription, } - if err := chainRegister.Validate(); err != nil { - return nil, types.ErrInvalidChainRegister.Wrapf("invalid chain: %v", err) + if err := consumerRegister.Validate(); err != nil { + return nil, types.ErrInvalidConsumerRegister.Wrapf("invalid consumer: %v", err) } ctx := sdk.UnwrapSDKContext(goCtx) - if ms.IsConsumerChainRegistered(ctx, req.ChainId) { - return nil, types.ErrChainAlreadyRegistered + if ms.IsConsumerRegistered(ctx, req.ConsumerId) { + return nil, types.ErrConsumerAlreadyRegistered } - ms.SetChainRegister(ctx, &chainRegister) + ms.SetConsumerRegister(ctx, &consumerRegister) - return &types.MsgRegisterChainResponse{}, nil + return &types.MsgRegisterConsumerResponse{}, nil } diff --git a/x/btcstkconsumer/types/btcstkconsumer.pb.go b/x/btcstkconsumer/types/btcstkconsumer.pb.go index cb0c073fd..0d3c6e668 100644 --- a/x/btcstkconsumer/types/btcstkconsumer.pb.go +++ b/x/btcstkconsumer/types/btcstkconsumer.pb.go @@ -22,28 +22,29 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// ChainRegister is the registration information of a CZ -type ChainRegister struct { - // chain_id is the ID of the chain - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // chain_name is the name of the chain - ChainName string `protobuf:"bytes,2,opt,name=chain_name,json=chainName,proto3" json:"chain_name,omitempty"` - // chain_description is a description for the chain (can be empty) - ChainDescription string `protobuf:"bytes,3,opt,name=chain_description,json=chainDescription,proto3" json:"chain_description,omitempty"` +// ConsumerRegister is the registration information of a consumer +type ConsumerRegister struct { + // consumer_id is the ID of the consumer + // - for Cosmos SDK chains, the consumer ID will be the IBC client ID + ConsumerId string `protobuf:"bytes,1,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` + // consumer_name is the name of the consumer + ConsumerName string `protobuf:"bytes,2,opt,name=consumer_name,json=consumerName,proto3" json:"consumer_name,omitempty"` + // consumer_description is a description for the consumer (can be empty) + ConsumerDescription string `protobuf:"bytes,3,opt,name=consumer_description,json=consumerDescription,proto3" json:"consumer_description,omitempty"` } -func (m *ChainRegister) Reset() { *m = ChainRegister{} } -func (m *ChainRegister) String() string { return proto.CompactTextString(m) } -func (*ChainRegister) ProtoMessage() {} -func (*ChainRegister) Descriptor() ([]byte, []int) { +func (m *ConsumerRegister) Reset() { *m = ConsumerRegister{} } +func (m *ConsumerRegister) String() string { return proto.CompactTextString(m) } +func (*ConsumerRegister) ProtoMessage() {} +func (*ConsumerRegister) Descriptor() ([]byte, []int) { return fileDescriptor_de3ccd621fe1efd4, []int{0} } -func (m *ChainRegister) XXX_Unmarshal(b []byte) error { +func (m *ConsumerRegister) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ChainRegister) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ConsumerRegister) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ChainRegister.Marshal(b, m, deterministic) + return xxx_messageInfo_ConsumerRegister.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -53,41 +54,41 @@ func (m *ChainRegister) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *ChainRegister) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChainRegister.Merge(m, src) +func (m *ConsumerRegister) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConsumerRegister.Merge(m, src) } -func (m *ChainRegister) XXX_Size() int { +func (m *ConsumerRegister) XXX_Size() int { return m.Size() } -func (m *ChainRegister) XXX_DiscardUnknown() { - xxx_messageInfo_ChainRegister.DiscardUnknown(m) +func (m *ConsumerRegister) XXX_DiscardUnknown() { + xxx_messageInfo_ConsumerRegister.DiscardUnknown(m) } -var xxx_messageInfo_ChainRegister proto.InternalMessageInfo +var xxx_messageInfo_ConsumerRegister proto.InternalMessageInfo -func (m *ChainRegister) GetChainId() string { +func (m *ConsumerRegister) GetConsumerId() string { if m != nil { - return m.ChainId + return m.ConsumerId } return "" } -func (m *ChainRegister) GetChainName() string { +func (m *ConsumerRegister) GetConsumerName() string { if m != nil { - return m.ChainName + return m.ConsumerName } return "" } -func (m *ChainRegister) GetChainDescription() string { +func (m *ConsumerRegister) GetConsumerDescription() string { if m != nil { - return m.ChainDescription + return m.ConsumerDescription } return "" } func init() { - proto.RegisterType((*ChainRegister)(nil), "babylon.btcstkconsumer.v1.ChainRegister") + proto.RegisterType((*ConsumerRegister)(nil), "babylon.btcstkconsumer.v1.ConsumerRegister") } func init() { @@ -95,24 +96,24 @@ func init() { } var fileDescriptor_de3ccd621fe1efd4 = []byte{ - // 215 bytes of a gzipped FileDescriptorProto + // 217 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x4b, 0x4a, 0x4c, 0xaa, 0xcc, 0xc9, 0xcf, 0xd3, 0x4f, 0x2a, 0x49, 0x2e, 0x2e, 0xc9, 0x4e, 0xce, 0xcf, 0x2b, 0x2e, 0xcd, 0x4d, 0x2d, 0xd2, 0x2f, 0x33, 0x44, 0x13, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x84, - 0xaa, 0xd7, 0x43, 0x93, 0x2d, 0x33, 0x54, 0x2a, 0xe3, 0xe2, 0x75, 0xce, 0x48, 0xcc, 0xcc, 0x0b, - 0x4a, 0x4d, 0xcf, 0x2c, 0x2e, 0x49, 0x2d, 0x12, 0x92, 0xe4, 0xe2, 0x48, 0x06, 0x09, 0xc4, 0x67, - 0xa6, 0x48, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0xb1, 0x83, 0xf9, 0x9e, 0x29, 0x42, 0xb2, 0x5c, - 0x5c, 0x10, 0xa9, 0xbc, 0xc4, 0xdc, 0x54, 0x09, 0x26, 0xb0, 0x24, 0x27, 0x58, 0xc4, 0x2f, 0x31, - 0x37, 0x55, 0x48, 0x9b, 0x4b, 0x10, 0x22, 0x9d, 0x92, 0x5a, 0x9c, 0x5c, 0x94, 0x59, 0x50, 0x92, - 0x99, 0x9f, 0x27, 0xc1, 0x0c, 0x56, 0x25, 0x00, 0x96, 0x70, 0x41, 0x88, 0x3b, 0x05, 0x9c, 0x78, - 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, - 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x59, 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, - 0x5e, 0x72, 0x7e, 0xae, 0x3e, 0xd4, 0xdd, 0x60, 0xdd, 0x30, 0x8e, 0x7e, 0x05, 0xba, 0xb7, 0x4b, - 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x7e, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x3c, - 0xde, 0xbc, 0x51, 0x1d, 0x01, 0x00, 0x00, + 0xaa, 0xd7, 0x43, 0x93, 0x2d, 0x33, 0x54, 0xea, 0x66, 0xe4, 0x12, 0x70, 0x86, 0xf2, 0x83, 0x52, + 0xd3, 0x33, 0x8b, 0x4b, 0x52, 0x8b, 0x84, 0xe4, 0xb9, 0xb8, 0x61, 0x6a, 0xe2, 0x33, 0x53, 0x24, + 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0xb8, 0x60, 0x42, 0x9e, 0x29, 0x42, 0xca, 0x5c, 0xbc, 0x70, + 0x05, 0x79, 0x89, 0xb9, 0xa9, 0x12, 0x4c, 0x60, 0x25, 0x3c, 0x30, 0x41, 0xbf, 0xc4, 0xdc, 0x54, + 0x21, 0x43, 0x2e, 0x11, 0xb8, 0xa2, 0x94, 0xd4, 0xe2, 0xe4, 0xa2, 0xcc, 0x82, 0x92, 0xcc, 0xfc, + 0x3c, 0x09, 0x66, 0xb0, 0x5a, 0x61, 0x98, 0x9c, 0x0b, 0x42, 0xca, 0x29, 0xe0, 0xc4, 0x23, 0x39, + 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, + 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0xcc, 0xd2, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, + 0xf3, 0x73, 0xf5, 0xa1, 0xbe, 0x49, 0xce, 0x48, 0xcc, 0xcc, 0x83, 0x71, 0xf4, 0x2b, 0xd0, 0x03, + 0xa3, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0x1c, 0x02, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xda, 0xb7, 0x17, 0xd5, 0x33, 0x01, 0x00, 0x00, } -func (m *ChainRegister) Marshal() (dAtA []byte, err error) { +func (m *ConsumerRegister) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -122,34 +123,34 @@ func (m *ChainRegister) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ChainRegister) MarshalTo(dAtA []byte) (int, error) { +func (m *ConsumerRegister) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ChainRegister) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ConsumerRegister) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ChainDescription) > 0 { - i -= len(m.ChainDescription) - copy(dAtA[i:], m.ChainDescription) - i = encodeVarintBtcstkconsumer(dAtA, i, uint64(len(m.ChainDescription))) + if len(m.ConsumerDescription) > 0 { + i -= len(m.ConsumerDescription) + copy(dAtA[i:], m.ConsumerDescription) + i = encodeVarintBtcstkconsumer(dAtA, i, uint64(len(m.ConsumerDescription))) i-- dAtA[i] = 0x1a } - if len(m.ChainName) > 0 { - i -= len(m.ChainName) - copy(dAtA[i:], m.ChainName) - i = encodeVarintBtcstkconsumer(dAtA, i, uint64(len(m.ChainName))) + if len(m.ConsumerName) > 0 { + i -= len(m.ConsumerName) + copy(dAtA[i:], m.ConsumerName) + i = encodeVarintBtcstkconsumer(dAtA, i, uint64(len(m.ConsumerName))) i-- dAtA[i] = 0x12 } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintBtcstkconsumer(dAtA, i, uint64(len(m.ChainId))) + if len(m.ConsumerId) > 0 { + i -= len(m.ConsumerId) + copy(dAtA[i:], m.ConsumerId) + i = encodeVarintBtcstkconsumer(dAtA, i, uint64(len(m.ConsumerId))) i-- dAtA[i] = 0xa } @@ -167,21 +168,21 @@ func encodeVarintBtcstkconsumer(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *ChainRegister) Size() (n int) { +func (m *ConsumerRegister) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.ChainId) + l = len(m.ConsumerId) if l > 0 { n += 1 + l + sovBtcstkconsumer(uint64(l)) } - l = len(m.ChainName) + l = len(m.ConsumerName) if l > 0 { n += 1 + l + sovBtcstkconsumer(uint64(l)) } - l = len(m.ChainDescription) + l = len(m.ConsumerDescription) if l > 0 { n += 1 + l + sovBtcstkconsumer(uint64(l)) } @@ -194,7 +195,7 @@ func sovBtcstkconsumer(x uint64) (n int) { func sozBtcstkconsumer(x uint64) (n int) { return sovBtcstkconsumer(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *ChainRegister) Unmarshal(dAtA []byte) error { +func (m *ConsumerRegister) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -217,15 +218,15 @@ func (m *ChainRegister) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ChainRegister: wiretype end group for non-group") + return fmt.Errorf("proto: ConsumerRegister: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ChainRegister: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ConsumerRegister: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -253,11 +254,11 @@ func (m *ChainRegister) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ConsumerId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -285,11 +286,11 @@ func (m *ChainRegister) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainName = string(dAtA[iNdEx:postIndex]) + m.ConsumerName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainDescription", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerDescription", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -317,7 +318,7 @@ func (m *ChainRegister) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainDescription = string(dAtA[iNdEx:postIndex]) + m.ConsumerDescription = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/x/btcstkconsumer/types/chain_register.go b/x/btcstkconsumer/types/chain_register.go index 894883691..2bdd938ab 100644 --- a/x/btcstkconsumer/types/chain_register.go +++ b/x/btcstkconsumer/types/chain_register.go @@ -2,18 +2,19 @@ package types import ( "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" ) -var _ sdk.Msg = &MsgRegisterChain{} +var _ sdk.Msg = &MsgRegisterConsumer{} // Validate validates the set of params -func (cr *ChainRegister) Validate() error { - if len(cr.ChainId) == 0 { - return fmt.Errorf("ChainId must be non-empty") +func (cr *ConsumerRegister) Validate() error { + if len(cr.ConsumerId) == 0 { + return fmt.Errorf("ConsumerId must be non-empty") } - if len(cr.ChainName) == 0 { - return fmt.Errorf("ChainName must be non-empty") + if len(cr.ConsumerName) == 0 { + return fmt.Errorf("ConsumerName must be non-empty") } return nil diff --git a/x/btcstkconsumer/types/codec.go b/x/btcstkconsumer/types/codec.go index 3c8a23c41..e0b8e40b6 100644 --- a/x/btcstkconsumer/types/codec.go +++ b/x/btcstkconsumer/types/codec.go @@ -9,13 +9,13 @@ import ( func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgUpdateParams{}, "btcstkconsumer/MsgUpdateParams", nil) - cdc.RegisterConcrete(&MsgRegisterChain{}, "btcstkconsumer/MsgRegisterChain", nil) + cdc.RegisterConcrete(&MsgRegisterConsumer{}, "btcstkconsumer/MsgRegisterConsumer", nil) } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { registry.RegisterImplementations((*sdk.Msg)(nil), &MsgUpdateParams{}, - &MsgRegisterChain{}, + &MsgRegisterConsumer{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) diff --git a/x/btcstkconsumer/types/errors.go b/x/btcstkconsumer/types/errors.go index 388a0fb5c..f53f4c86b 100644 --- a/x/btcstkconsumer/types/errors.go +++ b/x/btcstkconsumer/types/errors.go @@ -8,9 +8,9 @@ import ( // x/btcstkconsumer module sentinel errors var ( - ErrInvalidSigner = sdkerrors.Register(ModuleName, 1100, "expected gov account as only signer for proposal message") - ErrChainNotRegistered = sdkerrors.Register(ModuleName, 1101, "chain not registered") - ErrInvalidChainRegister = sdkerrors.Register(ModuleName, 1102, "invalid chain register") - ErrChainAlreadyRegistered = sdkerrors.Register(ModuleName, 1103, "chain already registered") - ErrInvalidChainIDs = sdkerrors.Register(ModuleName, 1104, "chain ids contain duplicates or empty strings") + ErrInvalidSigner = sdkerrors.Register(ModuleName, 1100, "expected gov account as only signer for proposal message") + ErrConsumerNotRegistered = sdkerrors.Register(ModuleName, 1101, "consumer not registered") + ErrInvalidConsumerRegister = sdkerrors.Register(ModuleName, 1102, "invalid consumer register") + ErrConsumerAlreadyRegistered = sdkerrors.Register(ModuleName, 1103, "consumer already registered") + ErrInvalidConsumerIDs = sdkerrors.Register(ModuleName, 1104, "consumer ids contain duplicates or empty strings") ) diff --git a/x/btcstkconsumer/types/keys.go b/x/btcstkconsumer/types/keys.go index 87cb296ef..3b9203422 100644 --- a/x/btcstkconsumer/types/keys.go +++ b/x/btcstkconsumer/types/keys.go @@ -16,9 +16,9 @@ const ( var ( ParamsKey = []byte("p_btcstkconsumer") - ConsumerChainRegisterKey = []byte{0x01} // ConsumerChainRegisterKey defines the key to the chain register for each CZ in store - ConsumerFinalityProviderKey = []byte{0x02} // ConsumerFinalityProviderKey defines the key to the CZ finality providers store - ConsumerFinalityProviderChainKey = []byte{0x03} // ConsumerFinalityProviderChainKey defines the key to the CZ chains per FP BTC PK store + ConsumerRegisterKey = []byte{0x01} // ConsumerRegisterKey defines the key to the chain register for each consumer in store + ConsumerFinalityProviderKey = []byte{0x02} // ConsumerFinalityProviderKey defines the key to the consumer finality providers store + ConsumerFinalityProviderChainKey = []byte{0x03} // ConsumerFinalityProviderChainKey defines the key to the consumer chains per FP BTC PK store ) func KeyPrefix(p string) []byte { diff --git a/x/btcstkconsumer/types/query.go b/x/btcstkconsumer/types/query.go index fa6dfab79..8d0d09107 100644 --- a/x/btcstkconsumer/types/query.go +++ b/x/btcstkconsumer/types/query.go @@ -13,6 +13,6 @@ func NewFinalityProviderResponse(f *btcstaking.FinalityProvider) *FinalityProvid Pop: f.Pop, SlashedBabylonHeight: f.SlashedBabylonHeight, SlashedBtcHeight: f.SlashedBtcHeight, - ChainId: f.ChainId, + ConsumerId: f.ConsumerId, } } diff --git a/x/btcstkconsumer/types/query.pb.go b/x/btcstkconsumer/types/query.pb.go index 71a1761f1..cb58256de 100644 --- a/x/btcstkconsumer/types/query.pb.go +++ b/x/btcstkconsumer/types/query.pb.go @@ -120,24 +120,24 @@ func (m *QueryParamsResponse) GetParams() Params { return Params{} } -// QueryChainRegistryListRequest is request type for the Query/ChainRegistryList RPC method -type QueryChainRegistryListRequest struct { +// QueryConsumerRegistryListRequest is request type for the Query/ConsumerRegistryList RPC method +type QueryConsumerRegistryListRequest struct { // pagination defines whether to have the pagination in the request Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` } -func (m *QueryChainRegistryListRequest) Reset() { *m = QueryChainRegistryListRequest{} } -func (m *QueryChainRegistryListRequest) String() string { return proto.CompactTextString(m) } -func (*QueryChainRegistryListRequest) ProtoMessage() {} -func (*QueryChainRegistryListRequest) Descriptor() ([]byte, []int) { +func (m *QueryConsumerRegistryListRequest) Reset() { *m = QueryConsumerRegistryListRequest{} } +func (m *QueryConsumerRegistryListRequest) String() string { return proto.CompactTextString(m) } +func (*QueryConsumerRegistryListRequest) ProtoMessage() {} +func (*QueryConsumerRegistryListRequest) Descriptor() ([]byte, []int) { return fileDescriptor_4e6c48e60b6a8bd8, []int{2} } -func (m *QueryChainRegistryListRequest) XXX_Unmarshal(b []byte) error { +func (m *QueryConsumerRegistryListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryChainRegistryListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryConsumerRegistryListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryChainRegistryListRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryConsumerRegistryListRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -147,45 +147,45 @@ func (m *QueryChainRegistryListRequest) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *QueryChainRegistryListRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainRegistryListRequest.Merge(m, src) +func (m *QueryConsumerRegistryListRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryConsumerRegistryListRequest.Merge(m, src) } -func (m *QueryChainRegistryListRequest) XXX_Size() int { +func (m *QueryConsumerRegistryListRequest) XXX_Size() int { return m.Size() } -func (m *QueryChainRegistryListRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainRegistryListRequest.DiscardUnknown(m) +func (m *QueryConsumerRegistryListRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryConsumerRegistryListRequest.DiscardUnknown(m) } -var xxx_messageInfo_QueryChainRegistryListRequest proto.InternalMessageInfo +var xxx_messageInfo_QueryConsumerRegistryListRequest proto.InternalMessageInfo -func (m *QueryChainRegistryListRequest) GetPagination() *query.PageRequest { +func (m *QueryConsumerRegistryListRequest) GetPagination() *query.PageRequest { if m != nil { return m.Pagination } return nil } -// QueryChainRegistryListResponse is response type for the Query/ChainRegistryList RPC method -type QueryChainRegistryListResponse struct { - // chain_ids are IDs of the chains in ascending alphabetical order - ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` +// QueryConsumerRegistryListResponse is response type for the Query/ConsumerRegistryList RPC method +type QueryConsumerRegistryListResponse struct { + // consumer_ids are IDs of the consumers in ascending alphabetical order + ConsumerIds []string `protobuf:"bytes,1,rep,name=consumer_ids,json=consumerIds,proto3" json:"consumer_ids,omitempty"` // pagination defines the pagination in the response Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` } -func (m *QueryChainRegistryListResponse) Reset() { *m = QueryChainRegistryListResponse{} } -func (m *QueryChainRegistryListResponse) String() string { return proto.CompactTextString(m) } -func (*QueryChainRegistryListResponse) ProtoMessage() {} -func (*QueryChainRegistryListResponse) Descriptor() ([]byte, []int) { +func (m *QueryConsumerRegistryListResponse) Reset() { *m = QueryConsumerRegistryListResponse{} } +func (m *QueryConsumerRegistryListResponse) String() string { return proto.CompactTextString(m) } +func (*QueryConsumerRegistryListResponse) ProtoMessage() {} +func (*QueryConsumerRegistryListResponse) Descriptor() ([]byte, []int) { return fileDescriptor_4e6c48e60b6a8bd8, []int{3} } -func (m *QueryChainRegistryListResponse) XXX_Unmarshal(b []byte) error { +func (m *QueryConsumerRegistryListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryChainRegistryListResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryConsumerRegistryListResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryChainRegistryListResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryConsumerRegistryListResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -195,49 +195,49 @@ func (m *QueryChainRegistryListResponse) XXX_Marshal(b []byte, deterministic boo return b[:n], nil } } -func (m *QueryChainRegistryListResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainRegistryListResponse.Merge(m, src) +func (m *QueryConsumerRegistryListResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryConsumerRegistryListResponse.Merge(m, src) } -func (m *QueryChainRegistryListResponse) XXX_Size() int { +func (m *QueryConsumerRegistryListResponse) XXX_Size() int { return m.Size() } -func (m *QueryChainRegistryListResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainRegistryListResponse.DiscardUnknown(m) +func (m *QueryConsumerRegistryListResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryConsumerRegistryListResponse.DiscardUnknown(m) } -var xxx_messageInfo_QueryChainRegistryListResponse proto.InternalMessageInfo +var xxx_messageInfo_QueryConsumerRegistryListResponse proto.InternalMessageInfo -func (m *QueryChainRegistryListResponse) GetChainIds() []string { +func (m *QueryConsumerRegistryListResponse) GetConsumerIds() []string { if m != nil { - return m.ChainIds + return m.ConsumerIds } return nil } -func (m *QueryChainRegistryListResponse) GetPagination() *query.PageResponse { +func (m *QueryConsumerRegistryListResponse) GetPagination() *query.PageResponse { if m != nil { return m.Pagination } return nil } -// QueryChainsRegistryRequest is request type for the Query/ChainsRegistry RPC method. -type QueryChainsRegistryRequest struct { - ChainIds []string `protobuf:"bytes,1,rep,name=chain_ids,json=chainIds,proto3" json:"chain_ids,omitempty"` +// QueryConsumersRegistryRequest is request type for the Query/ConsumersRegistry RPC method. +type QueryConsumersRegistryRequest struct { + ConsumerIds []string `protobuf:"bytes,1,rep,name=consumer_ids,json=consumerIds,proto3" json:"consumer_ids,omitempty"` } -func (m *QueryChainsRegistryRequest) Reset() { *m = QueryChainsRegistryRequest{} } -func (m *QueryChainsRegistryRequest) String() string { return proto.CompactTextString(m) } -func (*QueryChainsRegistryRequest) ProtoMessage() {} -func (*QueryChainsRegistryRequest) Descriptor() ([]byte, []int) { +func (m *QueryConsumersRegistryRequest) Reset() { *m = QueryConsumersRegistryRequest{} } +func (m *QueryConsumersRegistryRequest) String() string { return proto.CompactTextString(m) } +func (*QueryConsumersRegistryRequest) ProtoMessage() {} +func (*QueryConsumersRegistryRequest) Descriptor() ([]byte, []int) { return fileDescriptor_4e6c48e60b6a8bd8, []int{4} } -func (m *QueryChainsRegistryRequest) XXX_Unmarshal(b []byte) error { +func (m *QueryConsumersRegistryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryChainsRegistryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryConsumersRegistryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryChainsRegistryRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryConsumersRegistryRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -247,42 +247,42 @@ func (m *QueryChainsRegistryRequest) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } -func (m *QueryChainsRegistryRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainsRegistryRequest.Merge(m, src) +func (m *QueryConsumersRegistryRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryConsumersRegistryRequest.Merge(m, src) } -func (m *QueryChainsRegistryRequest) XXX_Size() int { +func (m *QueryConsumersRegistryRequest) XXX_Size() int { return m.Size() } -func (m *QueryChainsRegistryRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainsRegistryRequest.DiscardUnknown(m) +func (m *QueryConsumersRegistryRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryConsumersRegistryRequest.DiscardUnknown(m) } -var xxx_messageInfo_QueryChainsRegistryRequest proto.InternalMessageInfo +var xxx_messageInfo_QueryConsumersRegistryRequest proto.InternalMessageInfo -func (m *QueryChainsRegistryRequest) GetChainIds() []string { +func (m *QueryConsumersRegistryRequest) GetConsumerIds() []string { if m != nil { - return m.ChainIds + return m.ConsumerIds } return nil } -// QueryChainsRegistryResponse is response type for the Query/ChainsRegistry RPC method. -type QueryChainsRegistryResponse struct { - ChainsRegister []*ChainRegister `protobuf:"bytes,1,rep,name=chains_register,json=chainsRegister,proto3" json:"chains_register,omitempty"` +// QueryConsumersRegistryResponse is response type for the Query/ConsumersRegistry RPC method. +type QueryConsumersRegistryResponse struct { + ConsumersRegister []*ConsumerRegister `protobuf:"bytes,1,rep,name=consumers_register,json=consumersRegister,proto3" json:"consumers_register,omitempty"` } -func (m *QueryChainsRegistryResponse) Reset() { *m = QueryChainsRegistryResponse{} } -func (m *QueryChainsRegistryResponse) String() string { return proto.CompactTextString(m) } -func (*QueryChainsRegistryResponse) ProtoMessage() {} -func (*QueryChainsRegistryResponse) Descriptor() ([]byte, []int) { +func (m *QueryConsumersRegistryResponse) Reset() { *m = QueryConsumersRegistryResponse{} } +func (m *QueryConsumersRegistryResponse) String() string { return proto.CompactTextString(m) } +func (*QueryConsumersRegistryResponse) ProtoMessage() {} +func (*QueryConsumersRegistryResponse) Descriptor() ([]byte, []int) { return fileDescriptor_4e6c48e60b6a8bd8, []int{5} } -func (m *QueryChainsRegistryResponse) XXX_Unmarshal(b []byte) error { +func (m *QueryConsumersRegistryResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryChainsRegistryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryConsumersRegistryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryChainsRegistryResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryConsumersRegistryResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -292,21 +292,21 @@ func (m *QueryChainsRegistryResponse) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } -func (m *QueryChainsRegistryResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryChainsRegistryResponse.Merge(m, src) +func (m *QueryConsumersRegistryResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryConsumersRegistryResponse.Merge(m, src) } -func (m *QueryChainsRegistryResponse) XXX_Size() int { +func (m *QueryConsumersRegistryResponse) XXX_Size() int { return m.Size() } -func (m *QueryChainsRegistryResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryChainsRegistryResponse.DiscardUnknown(m) +func (m *QueryConsumersRegistryResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryConsumersRegistryResponse.DiscardUnknown(m) } -var xxx_messageInfo_QueryChainsRegistryResponse proto.InternalMessageInfo +var xxx_messageInfo_QueryConsumersRegistryResponse proto.InternalMessageInfo -func (m *QueryChainsRegistryResponse) GetChainsRegister() []*ChainRegister { +func (m *QueryConsumersRegistryResponse) GetConsumersRegister() []*ConsumerRegister { if m != nil { - return m.ChainsRegister + return m.ConsumersRegister } return nil } @@ -314,7 +314,7 @@ func (m *QueryChainsRegistryResponse) GetChainsRegister() []*ChainRegister { // QueryFinalityProvidersRequest is the request type for the // Query/FinalityProviders RPC method. type QueryFinalityProvidersRequest struct { - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ConsumerId string `protobuf:"bytes,1,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` // pagination defines an optional pagination for the request. Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` } @@ -352,9 +352,9 @@ func (m *QueryFinalityProvidersRequest) XXX_DiscardUnknown() { var xxx_messageInfo_QueryFinalityProvidersRequest proto.InternalMessageInfo -func (m *QueryFinalityProvidersRequest) GetChainId() string { +func (m *QueryFinalityProvidersRequest) GetConsumerId() string { if m != nil { - return m.ChainId + return m.ConsumerId } return "" } @@ -424,8 +424,8 @@ func (m *QueryFinalityProvidersResponse) GetPagination() *query.PageResponse { // QueryFinalityProviderRequest requests information about a finality provider type QueryFinalityProviderRequest struct { - // chain id is the chain id this finality provider is registered to - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // consumer id is the consumer id this finality provider is registered to + ConsumerId string `protobuf:"bytes,1,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` // fp_btc_pk_hex is the hex str of Bitcoin secp256k1 PK of the finality provider FpBtcPkHex string `protobuf:"bytes,2,opt,name=fp_btc_pk_hex,json=fpBtcPkHex,proto3" json:"fp_btc_pk_hex,omitempty"` } @@ -463,9 +463,9 @@ func (m *QueryFinalityProviderRequest) XXX_DiscardUnknown() { var xxx_messageInfo_QueryFinalityProviderRequest proto.InternalMessageInfo -func (m *QueryFinalityProviderRequest) GetChainId() string { +func (m *QueryFinalityProviderRequest) GetConsumerId() string { if m != nil { - return m.ChainId + return m.ConsumerId } return "" } @@ -548,8 +548,8 @@ type FinalityProviderResponse struct { Height uint64 `protobuf:"varint,8,opt,name=height,proto3" json:"height,omitempty"` // voting_power is the voting power of this finality provider at the given height VotingPower uint64 `protobuf:"varint,9,opt,name=voting_power,json=votingPower,proto3" json:"voting_power,omitempty"` - // chain_id is the chain id this finality provider is registered to - ChainId string `protobuf:"bytes,10,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // consumer_id is the consumer id this finality provider is registered to + ConsumerId string `protobuf:"bytes,10,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` } func (m *FinalityProviderResponse) Reset() { *m = FinalityProviderResponse{} } @@ -634,31 +634,31 @@ func (m *FinalityProviderResponse) GetVotingPower() uint64 { return 0 } -func (m *FinalityProviderResponse) GetChainId() string { +func (m *FinalityProviderResponse) GetConsumerId() string { if m != nil { - return m.ChainId + return m.ConsumerId } return "" } -// QueryFinalityProviderChainRequest requests the chain a CZ finality provider belongs to -type QueryFinalityProviderChainRequest struct { +// QueryFinalityProviderConsumerRequest requests the consumer a CZ finality provider belongs to +type QueryFinalityProviderConsumerRequest struct { // fp_btc_pk_hex is the hex str of Bitcoin secp256k1 PK of the finality provider FpBtcPkHex string `protobuf:"bytes,1,opt,name=fp_btc_pk_hex,json=fpBtcPkHex,proto3" json:"fp_btc_pk_hex,omitempty"` } -func (m *QueryFinalityProviderChainRequest) Reset() { *m = QueryFinalityProviderChainRequest{} } -func (m *QueryFinalityProviderChainRequest) String() string { return proto.CompactTextString(m) } -func (*QueryFinalityProviderChainRequest) ProtoMessage() {} -func (*QueryFinalityProviderChainRequest) Descriptor() ([]byte, []int) { +func (m *QueryFinalityProviderConsumerRequest) Reset() { *m = QueryFinalityProviderConsumerRequest{} } +func (m *QueryFinalityProviderConsumerRequest) String() string { return proto.CompactTextString(m) } +func (*QueryFinalityProviderConsumerRequest) ProtoMessage() {} +func (*QueryFinalityProviderConsumerRequest) Descriptor() ([]byte, []int) { return fileDescriptor_4e6c48e60b6a8bd8, []int{11} } -func (m *QueryFinalityProviderChainRequest) XXX_Unmarshal(b []byte) error { +func (m *QueryFinalityProviderConsumerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryFinalityProviderChainRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryFinalityProviderConsumerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryFinalityProviderChainRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryFinalityProviderConsumerRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -668,42 +668,42 @@ func (m *QueryFinalityProviderChainRequest) XXX_Marshal(b []byte, deterministic return b[:n], nil } } -func (m *QueryFinalityProviderChainRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryFinalityProviderChainRequest.Merge(m, src) +func (m *QueryFinalityProviderConsumerRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalityProviderConsumerRequest.Merge(m, src) } -func (m *QueryFinalityProviderChainRequest) XXX_Size() int { +func (m *QueryFinalityProviderConsumerRequest) XXX_Size() int { return m.Size() } -func (m *QueryFinalityProviderChainRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryFinalityProviderChainRequest.DiscardUnknown(m) +func (m *QueryFinalityProviderConsumerRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalityProviderConsumerRequest.DiscardUnknown(m) } -var xxx_messageInfo_QueryFinalityProviderChainRequest proto.InternalMessageInfo +var xxx_messageInfo_QueryFinalityProviderConsumerRequest proto.InternalMessageInfo -func (m *QueryFinalityProviderChainRequest) GetFpBtcPkHex() string { +func (m *QueryFinalityProviderConsumerRequest) GetFpBtcPkHex() string { if m != nil { return m.FpBtcPkHex } return "" } -// QueryFinalityProviderChainResponse returns the CZ finality provier chain id -type QueryFinalityProviderChainResponse struct { - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +// QueryFinalityProviderConsumerResponse returns the CZ finality provier consumer id +type QueryFinalityProviderConsumerResponse struct { + ConsumerId string `protobuf:"bytes,1,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` } -func (m *QueryFinalityProviderChainResponse) Reset() { *m = QueryFinalityProviderChainResponse{} } -func (m *QueryFinalityProviderChainResponse) String() string { return proto.CompactTextString(m) } -func (*QueryFinalityProviderChainResponse) ProtoMessage() {} -func (*QueryFinalityProviderChainResponse) Descriptor() ([]byte, []int) { +func (m *QueryFinalityProviderConsumerResponse) Reset() { *m = QueryFinalityProviderConsumerResponse{} } +func (m *QueryFinalityProviderConsumerResponse) String() string { return proto.CompactTextString(m) } +func (*QueryFinalityProviderConsumerResponse) ProtoMessage() {} +func (*QueryFinalityProviderConsumerResponse) Descriptor() ([]byte, []int) { return fileDescriptor_4e6c48e60b6a8bd8, []int{12} } -func (m *QueryFinalityProviderChainResponse) XXX_Unmarshal(b []byte) error { +func (m *QueryFinalityProviderConsumerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryFinalityProviderChainResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryFinalityProviderConsumerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryFinalityProviderChainResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryFinalityProviderConsumerResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -713,21 +713,21 @@ func (m *QueryFinalityProviderChainResponse) XXX_Marshal(b []byte, deterministic return b[:n], nil } } -func (m *QueryFinalityProviderChainResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryFinalityProviderChainResponse.Merge(m, src) +func (m *QueryFinalityProviderConsumerResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryFinalityProviderConsumerResponse.Merge(m, src) } -func (m *QueryFinalityProviderChainResponse) XXX_Size() int { +func (m *QueryFinalityProviderConsumerResponse) XXX_Size() int { return m.Size() } -func (m *QueryFinalityProviderChainResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryFinalityProviderChainResponse.DiscardUnknown(m) +func (m *QueryFinalityProviderConsumerResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryFinalityProviderConsumerResponse.DiscardUnknown(m) } -var xxx_messageInfo_QueryFinalityProviderChainResponse proto.InternalMessageInfo +var xxx_messageInfo_QueryFinalityProviderConsumerResponse proto.InternalMessageInfo -func (m *QueryFinalityProviderChainResponse) GetChainId() string { +func (m *QueryFinalityProviderConsumerResponse) GetConsumerId() string { if m != nil { - return m.ChainId + return m.ConsumerId } return "" } @@ -735,17 +735,17 @@ func (m *QueryFinalityProviderChainResponse) GetChainId() string { func init() { proto.RegisterType((*QueryParamsRequest)(nil), "babylon.btcstkconsumer.v1.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "babylon.btcstkconsumer.v1.QueryParamsResponse") - proto.RegisterType((*QueryChainRegistryListRequest)(nil), "babylon.btcstkconsumer.v1.QueryChainRegistryListRequest") - proto.RegisterType((*QueryChainRegistryListResponse)(nil), "babylon.btcstkconsumer.v1.QueryChainRegistryListResponse") - proto.RegisterType((*QueryChainsRegistryRequest)(nil), "babylon.btcstkconsumer.v1.QueryChainsRegistryRequest") - proto.RegisterType((*QueryChainsRegistryResponse)(nil), "babylon.btcstkconsumer.v1.QueryChainsRegistryResponse") + proto.RegisterType((*QueryConsumerRegistryListRequest)(nil), "babylon.btcstkconsumer.v1.QueryConsumerRegistryListRequest") + proto.RegisterType((*QueryConsumerRegistryListResponse)(nil), "babylon.btcstkconsumer.v1.QueryConsumerRegistryListResponse") + proto.RegisterType((*QueryConsumersRegistryRequest)(nil), "babylon.btcstkconsumer.v1.QueryConsumersRegistryRequest") + proto.RegisterType((*QueryConsumersRegistryResponse)(nil), "babylon.btcstkconsumer.v1.QueryConsumersRegistryResponse") proto.RegisterType((*QueryFinalityProvidersRequest)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProvidersRequest") proto.RegisterType((*QueryFinalityProvidersResponse)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProvidersResponse") proto.RegisterType((*QueryFinalityProviderRequest)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderRequest") proto.RegisterType((*QueryFinalityProviderResponse)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderResponse") proto.RegisterType((*FinalityProviderResponse)(nil), "babylon.btcstkconsumer.v1.FinalityProviderResponse") - proto.RegisterType((*QueryFinalityProviderChainRequest)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderChainRequest") - proto.RegisterType((*QueryFinalityProviderChainResponse)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderChainResponse") + proto.RegisterType((*QueryFinalityProviderConsumerRequest)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderConsumerRequest") + proto.RegisterType((*QueryFinalityProviderConsumerResponse)(nil), "babylon.btcstkconsumer.v1.QueryFinalityProviderConsumerResponse") } func init() { @@ -753,79 +753,79 @@ func init() { } var fileDescriptor_4e6c48e60b6a8bd8 = []byte{ - // 1147 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6f, 0xdc, 0x44, - 0x14, 0x8f, 0xf3, 0xb1, 0xcd, 0x4e, 0x4a, 0x49, 0x86, 0x50, 0x6d, 0x36, 0x65, 0x93, 0xb8, 0x50, - 0x42, 0x69, 0xec, 0x26, 0x69, 0x97, 0x14, 0x51, 0x3e, 0xb6, 0x21, 0x6d, 0xa0, 0x55, 0x5d, 0xc3, - 0x09, 0x90, 0x8c, 0x3f, 0x66, 0xbd, 0xd6, 0x66, 0x3d, 0xae, 0x67, 0x12, 0xb2, 0xaa, 0x72, 0xa0, - 0x07, 0xce, 0x08, 0xfe, 0x07, 0x84, 0x38, 0x71, 0xe8, 0x1d, 0x8e, 0x15, 0x12, 0x52, 0x55, 0x24, - 0x84, 0x7a, 0x88, 0xaa, 0x04, 0x89, 0x7f, 0x03, 0x79, 0xfc, 0xbc, 0x59, 0xef, 0x67, 0x36, 0xea, - 0xa5, 0xda, 0x99, 0xf9, 0xfd, 0xde, 0xfc, 0x7e, 0xef, 0xbd, 0xf1, 0x6b, 0xd0, 0x1b, 0x96, 0x69, - 0xd5, 0xb7, 0xa8, 0xaf, 0x5a, 0xdc, 0x66, 0xbc, 0x6a, 0x53, 0x9f, 0x6d, 0xd7, 0x48, 0xa8, 0xee, - 0x2c, 0xab, 0xf7, 0xb7, 0x49, 0x58, 0x57, 0x82, 0x90, 0x72, 0x8a, 0x67, 0x00, 0xa6, 0xa4, 0x61, - 0xca, 0xce, 0x72, 0x7e, 0xca, 0xac, 0x79, 0x3e, 0x55, 0xc5, 0xbf, 0x31, 0x3a, 0x3f, 0xed, 0x52, - 0x97, 0x8a, 0x9f, 0x6a, 0xf4, 0x0b, 0x76, 0xcf, 0xb9, 0x94, 0xba, 0x5b, 0x44, 0x35, 0x03, 0x4f, - 0x35, 0x7d, 0x9f, 0x72, 0x93, 0x7b, 0xd4, 0x67, 0x70, 0x3a, 0x63, 0x53, 0x56, 0xa3, 0xcc, 0x88, - 0x69, 0xf1, 0x02, 0x8e, 0xe4, 0x78, 0xa5, 0xda, 0x61, 0x3d, 0xe0, 0x54, 0x65, 0xc4, 0x0e, 0x56, - 0xae, 0x16, 0xab, 0xcb, 0x6a, 0x95, 0xd4, 0x13, 0xcc, 0xeb, 0x80, 0x61, 0xdc, 0xac, 0x7a, 0xbe, - 0xab, 0xee, 0x2c, 0x5b, 0x84, 0x9b, 0xcb, 0xc9, 0x1a, 0x50, 0x17, 0x01, 0x65, 0x99, 0x8c, 0xc4, - 0xfe, 0x1a, 0xc0, 0xc0, 0x74, 0x3d, 0x5f, 0x28, 0x02, 0xec, 0x85, 0x54, 0x66, 0x92, 0xa8, 0x4d, - 0x2b, 0xc0, 0xcd, 0x75, 0xc6, 0x05, 0x34, 0x00, 0x80, 0xd2, 0x3d, 0xc5, 0x2d, 0xd9, 0xec, 0x74, - 0x71, 0x0a, 0x1f, 0x98, 0xa1, 0x59, 0x03, 0xcb, 0xf2, 0x34, 0xc2, 0xf7, 0x22, 0x0b, 0x9a, 0xd8, - 0xd4, 0xc9, 0xfd, 0x6d, 0xc2, 0xb8, 0xfc, 0x25, 0x7a, 0x25, 0xb5, 0xcb, 0x02, 0xea, 0x33, 0x82, - 0xd7, 0x51, 0x26, 0x26, 0xe7, 0xa4, 0x79, 0x69, 0x71, 0x62, 0x65, 0x41, 0xe9, 0x5a, 0x51, 0x25, - 0xa6, 0x96, 0xb2, 0x8f, 0xf7, 0xe7, 0x86, 0x7e, 0xfe, 0xef, 0xd7, 0x8b, 0x92, 0x0e, 0x5c, 0xd9, - 0x45, 0xaf, 0x89, 0xe0, 0x37, 0x2a, 0xa6, 0xe7, 0xeb, 0xc4, 0xf5, 0x18, 0x0f, 0xeb, 0xb7, 0x3d, - 0xc6, 0xe1, 0x76, 0xbc, 0x81, 0xd0, 0x51, 0x22, 0xe1, 0xaa, 0x0b, 0x0a, 0x54, 0x33, 0xca, 0xba, - 0x12, 0x77, 0x15, 0x64, 0x5d, 0xd1, 0x4c, 0x97, 0x00, 0x57, 0x6f, 0x62, 0xca, 0xdf, 0x49, 0xa8, - 0xd0, 0xed, 0x26, 0x70, 0x34, 0x8b, 0xb2, 0x76, 0x74, 0x68, 0x78, 0x4e, 0x64, 0x6a, 0x64, 0x31, - 0xab, 0x8f, 0x8b, 0x8d, 0x4d, 0x87, 0xe1, 0x9b, 0x29, 0x1d, 0xc3, 0x42, 0xc7, 0x9b, 0x7d, 0x75, - 0xc4, 0x91, 0x53, 0x42, 0xae, 0xa1, 0xfc, 0x91, 0x0e, 0x96, 0x08, 0x49, 0xec, 0xf6, 0xd2, 0x20, - 0x07, 0x68, 0xb6, 0x23, 0x15, 0xf4, 0xdf, 0x43, 0x2f, 0x0b, 0x28, 0x33, 0x42, 0x71, 0x44, 0x42, - 0x11, 0x61, 0x62, 0x65, 0xb1, 0x47, 0x69, 0x9a, 0xd2, 0x41, 0x42, 0xfd, 0x8c, 0xdd, 0x14, 0x9a, - 0x84, 0xf2, 0x43, 0x09, 0xea, 0xb3, 0xe1, 0xf9, 0xe6, 0x96, 0xc7, 0xeb, 0x5a, 0x48, 0x77, 0x3c, - 0x87, 0x84, 0x49, 0x77, 0xe0, 0x19, 0x34, 0x9e, 0x08, 0x16, 0xd5, 0xc9, 0xea, 0xa7, 0x40, 0x6f, - 0x4b, 0xe9, 0x86, 0x4f, 0x5c, 0xba, 0x3f, 0x93, 0xd2, 0x75, 0x10, 0x01, 0xd6, 0x2d, 0x84, 0xcb, - 0x70, 0x18, 0xbd, 0xf7, 0xf8, 0x14, 0xdc, 0xaf, 0xf6, 0x70, 0xdf, 0x1a, 0xb1, 0x51, 0xb1, 0xa9, - 0x72, 0xeb, 0x5d, 0x2f, 0xae, 0x03, 0xbe, 0x42, 0xe7, 0x3a, 0xda, 0x39, 0x46, 0x4a, 0x17, 0xd0, - 0x4b, 0xe5, 0xc0, 0xb0, 0xb8, 0x6d, 0x04, 0x55, 0xa3, 0x42, 0x76, 0x85, 0x8c, 0xac, 0x8e, 0xca, - 0x41, 0x89, 0xdb, 0x5a, 0xf5, 0x16, 0xd9, 0x95, 0xbf, 0xed, 0x56, 0xb2, 0x46, 0xb2, 0xbe, 0x46, - 0x53, 0x6d, 0xc9, 0x82, 0x97, 0x75, 0xa2, 0x5c, 0x4d, 0xb6, 0xe6, 0x4a, 0xfe, 0x69, 0x14, 0xe5, - 0xba, 0x5e, 0xff, 0x31, 0x9a, 0x70, 0x08, 0xb3, 0x43, 0x2f, 0x68, 0x7a, 0xd2, 0xe7, 0x93, 0x44, - 0x26, 0x9f, 0xc2, 0x24, 0x8b, 0xeb, 0x47, 0x50, 0xbd, 0x99, 0x87, 0xef, 0x20, 0x64, 0xd3, 0x5a, - 0xcd, 0x63, 0x2c, 0x29, 0x47, 0xb6, 0xb4, 0xf4, 0x6c, 0x7f, 0x6e, 0x36, 0x0e, 0xc4, 0x9c, 0xaa, - 0xe2, 0x51, 0xb5, 0x66, 0xf2, 0x8a, 0x72, 0x9b, 0xb8, 0xa6, 0x5d, 0x5f, 0x27, 0xf6, 0xd3, 0x47, - 0x4b, 0x08, 0xee, 0x59, 0x27, 0xb6, 0xde, 0x14, 0x00, 0x5f, 0x42, 0xa3, 0xa6, 0xe3, 0x84, 0xb9, - 0x11, 0x11, 0x28, 0xf7, 0xf4, 0xd1, 0xd2, 0x34, 0x20, 0x3f, 0x72, 0x9c, 0x90, 0x30, 0xf6, 0x19, - 0x0f, 0x3d, 0xdf, 0xd5, 0x05, 0x0a, 0xdf, 0x41, 0x99, 0xb8, 0x08, 0xb9, 0xd1, 0x79, 0x69, 0xf1, - 0x74, 0xa9, 0xf8, 0x6c, 0x7f, 0x6e, 0xc5, 0xf5, 0x78, 0x65, 0xdb, 0x52, 0x6c, 0x5a, 0x53, 0x21, - 0x8b, 0xa2, 0x6c, 0xc9, 0x42, 0xe5, 0xf5, 0x80, 0x30, 0xa5, 0xb4, 0xa9, 0xad, 0x5e, 0xb9, 0xac, - 0x6d, 0x5b, 0x9f, 0x92, 0xba, 0x3e, 0x66, 0x45, 0x65, 0xc3, 0xd7, 0xd1, 0x48, 0x40, 0x83, 0xdc, - 0x98, 0x48, 0xc5, 0xdb, 0xe9, 0x1a, 0x24, 0xe9, 0x50, 0xb4, 0x90, 0xd2, 0xf2, 0xdd, 0xb2, 0x46, - 0x19, 0x23, 0x42, 0x73, 0xe9, 0xf3, 0x1b, 0x7a, 0xc4, 0xc3, 0x57, 0xd0, 0x59, 0xb6, 0x65, 0xb2, - 0x0a, 0x71, 0x0c, 0xa0, 0x1a, 0x15, 0xe2, 0xb9, 0x15, 0x9e, 0xcb, 0xcc, 0x4b, 0x8b, 0xa3, 0xfa, - 0x34, 0x9c, 0x96, 0xe2, 0xc3, 0x5b, 0xe2, 0x0c, 0x5f, 0x42, 0xb8, 0xc1, 0xe2, 0x76, 0xc2, 0x38, - 0x25, 0x18, 0x93, 0x09, 0x83, 0xdb, 0x80, 0x3e, 0x8b, 0x32, 0x80, 0x18, 0x17, 0x08, 0x58, 0xe1, - 0x05, 0x74, 0x7a, 0x87, 0x72, 0xcf, 0x77, 0x8d, 0x80, 0x7e, 0x43, 0xc2, 0x5c, 0x56, 0x9c, 0x4e, - 0xc4, 0x7b, 0x5a, 0xb4, 0x95, 0xea, 0x67, 0x94, 0xea, 0x67, 0x79, 0x03, 0x2d, 0x74, 0xec, 0x55, - 0xf8, 0x2a, 0xc5, 0xef, 0xa1, 0xad, 0xe9, 0xa5, 0xb6, 0xa6, 0xff, 0x00, 0xc9, 0xbd, 0xe2, 0x40, - 0xe7, 0x75, 0x7f, 0x58, 0x2b, 0xbf, 0x64, 0xd1, 0x98, 0x88, 0x80, 0x7f, 0x90, 0x50, 0x26, 0x9e, - 0x57, 0x78, 0xa9, 0xc7, 0x6b, 0x68, 0x1f, 0x94, 0x79, 0xe5, 0xb8, 0xf0, 0x58, 0x8e, 0xfc, 0xd6, - 0xc3, 0xbf, 0xfe, 0xfd, 0x71, 0xf8, 0x3c, 0x5e, 0x50, 0xfb, 0xcd, 0x67, 0xfc, 0xbb, 0x84, 0xa6, - 0xda, 0x06, 0x17, 0x5e, 0xeb, 0x77, 0x61, 0xb7, 0xa9, 0x9a, 0xbf, 0x76, 0x02, 0x26, 0xa8, 0x2e, - 0x0a, 0xd5, 0x97, 0xb1, 0xd2, 0x43, 0x75, 0x9c, 0xe5, 0x10, 0xe8, 0xc6, 0x56, 0x24, 0xf6, 0x37, - 0x09, 0x9d, 0x49, 0x0f, 0x2e, 0x7c, 0xf5, 0x58, 0x2a, 0x5a, 0x67, 0x64, 0xbe, 0x38, 0x28, 0x0d, - 0x94, 0xbf, 0x2f, 0x94, 0xaf, 0xe1, 0x62, 0x3f, 0xe5, 0xac, 0x21, 0x5d, 0x7d, 0xd0, 0x98, 0xc6, - 0x7b, 0xf8, 0xb9, 0x84, 0x5e, 0xed, 0xd8, 0x60, 0xf8, 0xbd, 0x7e, 0x8a, 0x7a, 0xf5, 0x77, 0xfe, - 0xfa, 0x09, 0xd9, 0x60, 0xeb, 0x13, 0x61, 0x6b, 0x1d, 0x97, 0x7a, 0xd8, 0x6a, 0xfb, 0xde, 0x1b, - 0xf1, 0xa7, 0xe9, 0x41, 0xea, 0x61, 0xed, 0xe1, 0x3f, 0x24, 0x34, 0xd5, 0x36, 0x65, 0xfb, 0xf7, - 0x59, 0xb7, 0xff, 0x1d, 0xf4, 0xef, 0xb3, 0xae, 0x23, 0x5d, 0xfe, 0x50, 0xd8, 0x7a, 0x17, 0xaf, - 0x0d, 0x62, 0x8b, 0x1d, 0x15, 0x6c, 0x0f, 0xff, 0x2d, 0xa1, 0xc9, 0xd6, 0xf8, 0xf8, 0x9d, 0x41, - 0x15, 0x25, 0x56, 0xd6, 0x06, 0x27, 0x82, 0x93, 0xbb, 0xc2, 0xc9, 0x26, 0xbe, 0x39, 0x88, 0x93, - 0x26, 0x23, 0xad, 0x55, 0x2a, 0x69, 0x8f, 0x0f, 0x0a, 0xd2, 0x93, 0x83, 0x82, 0xf4, 0xfc, 0xa0, - 0x20, 0x7d, 0x7f, 0x58, 0x18, 0x7a, 0x72, 0x58, 0x18, 0xfa, 0xe7, 0xb0, 0x30, 0xf4, 0x45, 0xb1, - 0xdf, 0x0c, 0xda, 0x6d, 0xbd, 0x5b, 0x0c, 0x25, 0x2b, 0x23, 0xfe, 0x00, 0x58, 0xfd, 0x3f, 0x00, - 0x00, 0xff, 0xff, 0x88, 0xdc, 0x96, 0x10, 0xbd, 0x0d, 0x00, 0x00, + // 1148 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x73, 0xdb, 0xc4, + 0x1b, 0x8e, 0xf2, 0xe1, 0xdf, 0xcf, 0xeb, 0x32, 0x13, 0x2f, 0x99, 0x8e, 0x6b, 0x8a, 0x93, 0xa8, + 0x1f, 0x84, 0xd2, 0x48, 0x38, 0x29, 0xa1, 0x9d, 0xb6, 0x7c, 0x38, 0x69, 0x9b, 0x40, 0x32, 0x18, + 0xc1, 0xa9, 0x1c, 0x84, 0x24, 0xaf, 0x65, 0xe1, 0x58, 0xab, 0x6a, 0x37, 0x21, 0x9e, 0x92, 0x03, + 0x9c, 0xb8, 0xc1, 0xc0, 0x3f, 0xc1, 0x81, 0x03, 0x87, 0xfe, 0x11, 0x3d, 0x50, 0xa6, 0x53, 0x0e, + 0x40, 0x0f, 0x19, 0x26, 0x61, 0x86, 0x0b, 0x7f, 0x04, 0xa3, 0xd5, 0x2b, 0xc7, 0x92, 0x3f, 0x94, + 0x78, 0xb8, 0x64, 0xbc, 0xbb, 0xcf, 0xfb, 0xee, 0xf3, 0x3c, 0xef, 0xee, 0xbe, 0x0a, 0xba, 0x64, + 0x1a, 0x66, 0x7b, 0x9b, 0xba, 0xaa, 0xc9, 0x2d, 0xc6, 0x9b, 0x16, 0x75, 0xd9, 0x4e, 0x8b, 0xf8, + 0xea, 0x6e, 0x59, 0x7d, 0xb0, 0x43, 0xfc, 0xb6, 0xe2, 0xf9, 0x94, 0x53, 0x7c, 0x0e, 0x60, 0x4a, + 0x1c, 0xa6, 0xec, 0x96, 0x8b, 0x79, 0xa3, 0xe5, 0xb8, 0x54, 0x15, 0x7f, 0x43, 0x74, 0x71, 0xc6, + 0xa6, 0x36, 0x15, 0x3f, 0xd5, 0xe0, 0x17, 0xcc, 0x9e, 0xb7, 0x29, 0xb5, 0xb7, 0x89, 0x6a, 0x78, + 0x8e, 0x6a, 0xb8, 0x2e, 0xe5, 0x06, 0x77, 0xa8, 0xcb, 0x60, 0xf5, 0x9c, 0x45, 0x59, 0x8b, 0x32, + 0x3d, 0x0c, 0x0b, 0x07, 0xb0, 0x24, 0x87, 0x23, 0xd5, 0xf2, 0xdb, 0x1e, 0xa7, 0x2a, 0x23, 0x96, + 0xb7, 0xf4, 0xc6, 0x4a, 0xb3, 0xac, 0x36, 0x49, 0x3b, 0xc2, 0x5c, 0x04, 0x0c, 0xe3, 0x46, 0xd3, + 0x71, 0x6d, 0x75, 0xb7, 0x6c, 0x12, 0x6e, 0x94, 0xa3, 0x31, 0xa0, 0xae, 0x00, 0xca, 0x34, 0x18, + 0x09, 0xf5, 0x75, 0x80, 0x9e, 0x61, 0x3b, 0xae, 0x60, 0x04, 0xd8, 0xcb, 0x31, 0x67, 0xa2, 0xac, + 0x5d, 0x23, 0xc0, 0xcd, 0xf6, 0xc7, 0x79, 0xd4, 0x03, 0x80, 0x32, 0xd8, 0xe2, 0x84, 0x9b, 0xfd, + 0x36, 0x8e, 0xe1, 0x3d, 0xc3, 0x37, 0x5a, 0x20, 0x59, 0x9e, 0x41, 0xf8, 0xc3, 0x40, 0x42, 0x55, + 0x4c, 0x6a, 0xe4, 0xc1, 0x0e, 0x61, 0x5c, 0xfe, 0x04, 0xbd, 0x18, 0x9b, 0x65, 0x1e, 0x75, 0x19, + 0xc1, 0x6b, 0x28, 0x13, 0x06, 0x17, 0xa4, 0x39, 0x69, 0x21, 0xb7, 0x34, 0xaf, 0x0c, 0xac, 0xa8, + 0x12, 0x86, 0x56, 0xb2, 0x8f, 0x0f, 0x66, 0xc7, 0x7e, 0xf8, 0xfb, 0xa7, 0x2b, 0x92, 0x06, 0xb1, + 0xf2, 0x67, 0x68, 0x4e, 0x24, 0x5f, 0x05, 0xb4, 0x46, 0x6c, 0x87, 0x71, 0xbf, 0xbd, 0xe9, 0x30, + 0x0e, 0x04, 0xf0, 0x5d, 0x84, 0x8e, 0xbd, 0x84, 0xdd, 0x2e, 0x2b, 0x50, 0xd0, 0xc0, 0x78, 0x25, + 0x3c, 0x58, 0x60, 0xbc, 0x52, 0x35, 0x6c, 0x02, 0xb1, 0x5a, 0x57, 0xa4, 0xfc, 0x8d, 0x84, 0xe6, + 0x87, 0x6c, 0x06, 0xba, 0xe6, 0xd1, 0x99, 0x88, 0xba, 0xee, 0xd4, 0x02, 0x75, 0x13, 0x0b, 0x59, + 0x2d, 0x17, 0xcd, 0x6d, 0xd4, 0x18, 0xbe, 0x17, 0x23, 0x34, 0x2e, 0x08, 0xbd, 0x92, 0x4a, 0x28, + 0xcc, 0x1f, 0x63, 0x54, 0x41, 0x2f, 0xc7, 0x08, 0xb1, 0x88, 0x51, 0x24, 0x3d, 0x9d, 0x8c, 0xfc, + 0x05, 0x2a, 0x0d, 0xca, 0x01, 0x8a, 0xee, 0x23, 0x1c, 0x05, 0x30, 0xdd, 0x17, 0xab, 0xc4, 0x17, + 0xa9, 0x72, 0x4b, 0xaf, 0x0d, 0xa9, 0x5a, 0xdc, 0x26, 0xe2, 0x6b, 0x79, 0x2b, 0xbe, 0x07, 0xf1, + 0xe5, 0xaf, 0x25, 0x90, 0x70, 0xd7, 0x71, 0x8d, 0x6d, 0x87, 0xb7, 0xab, 0x3e, 0xdd, 0x75, 0x6a, + 0x02, 0x12, 0x4a, 0x98, 0x45, 0xb9, 0x2e, 0x09, 0xa2, 0x7c, 0x59, 0x0d, 0x1d, 0x2b, 0x48, 0x94, + 0x77, 0x7c, 0xe4, 0xf2, 0x3e, 0x91, 0xc0, 0x89, 0x3e, 0x54, 0xc0, 0x09, 0x13, 0xe1, 0x3a, 0x2c, + 0x06, 0xcf, 0x42, 0xb8, 0x0a, 0x4e, 0x2c, 0x0f, 0x71, 0x22, 0x99, 0xb1, 0x53, 0xcc, 0x7c, 0x3d, + 0xb9, 0xd7, 0x7f, 0x77, 0x38, 0x4c, 0x74, 0xbe, 0xaf, 0x9c, 0x13, 0x1b, 0x3b, 0x8f, 0x5e, 0xa8, + 0x7b, 0xba, 0xc9, 0x2d, 0xdd, 0x6b, 0xea, 0x0d, 0xb2, 0x27, 0xc8, 0x64, 0x35, 0x54, 0xf7, 0x2a, + 0xdc, 0xaa, 0x36, 0xd7, 0xc9, 0x9e, 0xfc, 0xe5, 0xa0, 0xf2, 0x75, 0x2c, 0xfb, 0x14, 0xe5, 0x7b, + 0x2c, 0x83, 0x3b, 0x38, 0x92, 0x63, 0xd3, 0x49, 0xc7, 0xe4, 0x1f, 0x27, 0x51, 0x61, 0xe0, 0xf6, + 0x77, 0x50, 0xae, 0x46, 0x98, 0xe5, 0x3b, 0x5e, 0xd7, 0xe5, 0xbf, 0x10, 0xd9, 0x19, 0xbd, 0x9b, + 0x91, 0x97, 0x6b, 0xc7, 0x50, 0xad, 0x3b, 0x0e, 0x6f, 0x21, 0x64, 0xd1, 0x56, 0xcb, 0x61, 0x2c, + 0x2a, 0x4a, 0xb6, 0xb2, 0xf8, 0xfc, 0x60, 0xf6, 0xa5, 0x30, 0x11, 0xab, 0x35, 0x15, 0x87, 0xaa, + 0x2d, 0x83, 0x37, 0x94, 0x4d, 0x62, 0x1b, 0x56, 0x7b, 0x8d, 0x58, 0xcf, 0x1e, 0x2d, 0x22, 0xd8, + 0x67, 0x8d, 0x58, 0x5a, 0x57, 0x02, 0x7c, 0x15, 0x4d, 0x1a, 0xb5, 0x9a, 0x5f, 0x98, 0x10, 0x89, + 0x0a, 0xcf, 0x1e, 0x2d, 0xce, 0x00, 0xf2, 0xdd, 0x5a, 0xcd, 0x27, 0x8c, 0x7d, 0xc4, 0x7d, 0xc7, + 0xb5, 0x35, 0x81, 0xc2, 0x5b, 0x28, 0x13, 0x16, 0xa1, 0x30, 0x39, 0x27, 0x2d, 0x9c, 0xa9, 0xac, + 0x3c, 0x3f, 0x98, 0x5d, 0xb2, 0x1d, 0xde, 0xd8, 0x31, 0x15, 0x8b, 0xb6, 0x54, 0x70, 0xd1, 0x6a, + 0x18, 0x8e, 0x1b, 0x0d, 0x54, 0xde, 0xf6, 0x08, 0x53, 0x2a, 0x1b, 0xd5, 0xe5, 0x6b, 0xaf, 0x57, + 0x77, 0xcc, 0xf7, 0x49, 0x5b, 0x9b, 0x32, 0x83, 0xb2, 0xe1, 0xdb, 0x68, 0xc2, 0xa3, 0x5e, 0x61, + 0x4a, 0x58, 0x91, 0xb8, 0xbf, 0x91, 0x1d, 0x4a, 0xd5, 0xa7, 0xb4, 0xfe, 0x41, 0xbd, 0x4a, 0x19, + 0x23, 0x82, 0x73, 0xe5, 0xe3, 0x55, 0x2d, 0x88, 0xc3, 0xd7, 0xd0, 0x59, 0xb6, 0x6d, 0xb0, 0x06, + 0xa9, 0xe9, 0x10, 0xaa, 0x37, 0x88, 0x63, 0x37, 0x78, 0x21, 0x33, 0x27, 0x2d, 0x4c, 0x6a, 0x33, + 0xb0, 0x5a, 0x09, 0x17, 0xd7, 0xc5, 0x1a, 0xbe, 0x8a, 0x70, 0x27, 0x8a, 0x5b, 0x51, 0xc4, 0xff, + 0x44, 0xc4, 0x74, 0x14, 0xc1, 0x2d, 0x40, 0x9f, 0x45, 0x19, 0x40, 0xfc, 0x5f, 0x20, 0x60, 0x14, + 0x3c, 0x67, 0xbb, 0x94, 0x3b, 0xae, 0xad, 0x7b, 0xf4, 0x73, 0xe2, 0x17, 0xb2, 0x62, 0x35, 0x17, + 0xce, 0x55, 0x83, 0xa9, 0xe4, 0xa9, 0x46, 0xc9, 0x53, 0x2d, 0x6f, 0xa0, 0x8b, 0x7d, 0x4f, 0xec, + 0xf1, 0x6b, 0x15, 0x3d, 0x9d, 0x89, 0xd3, 0x2f, 0xf5, 0x9c, 0xfe, 0x75, 0x74, 0x29, 0x25, 0x15, + 0x9c, 0xc2, 0xb4, 0xab, 0xb6, 0xf4, 0x5b, 0x16, 0x4d, 0x89, 0x54, 0xf8, 0x3b, 0x09, 0x65, 0xc2, + 0x76, 0x87, 0x17, 0x87, 0xdc, 0x8f, 0xde, 0x3e, 0x5b, 0x54, 0x4e, 0x0a, 0x0f, 0x49, 0xc9, 0xaf, + 0x7e, 0xf5, 0xeb, 0x5f, 0xdf, 0x8f, 0x5f, 0xc0, 0xf3, 0x6a, 0x5a, 0x7b, 0xc7, 0x3f, 0x4b, 0x68, + 0xa6, 0x5f, 0xd3, 0xc3, 0x37, 0xd3, 0xf6, 0x1c, 0xd2, 0x97, 0x8b, 0xb7, 0x46, 0x0b, 0x06, 0xfa, + 0x37, 0x04, 0xfd, 0x65, 0x5c, 0x1e, 0x42, 0xbf, 0x63, 0xba, 0x0f, 0x19, 0xf4, 0xed, 0x80, 0xf5, + 0x2f, 0x12, 0xca, 0xf7, 0xb4, 0x3b, 0x7c, 0xfd, 0xa4, 0x74, 0x92, 0x5d, 0xb6, 0x78, 0x63, 0x84, + 0x48, 0x50, 0xb1, 0x26, 0x54, 0xbc, 0x85, 0x6f, 0x9d, 0x40, 0x05, 0xeb, 0xc8, 0x50, 0x1f, 0x76, + 0x77, 0xf5, 0x7d, 0xfc, 0x8f, 0xd4, 0xfb, 0x04, 0x46, 0x7b, 0xe2, 0xb7, 0xd3, 0xd8, 0xa5, 0xdc, + 0x84, 0xe2, 0x3b, 0xa3, 0x27, 0x00, 0x95, 0x5b, 0x42, 0xe5, 0x3d, 0x7c, 0x67, 0x88, 0xca, 0x9e, + 0x2e, 0xa1, 0x77, 0x56, 0x1f, 0xc6, 0x2e, 0xe2, 0x3e, 0x7e, 0x22, 0xa1, 0x7c, 0x4f, 0x93, 0x4e, + 0xaf, 0xdf, 0xa0, 0x4f, 0x8c, 0xf4, 0xfa, 0x0d, 0xfc, 0x22, 0x90, 0x57, 0x85, 0xb2, 0xdb, 0xf8, + 0xe6, 0x69, 0x94, 0xb1, 0x58, 0xfd, 0xf6, 0xf1, 0x1f, 0x12, 0x9a, 0x4e, 0x6e, 0x81, 0xdf, 0x3c, + 0x2d, 0xa9, 0x48, 0xcd, 0xf5, 0xd3, 0x07, 0x82, 0x18, 0x4d, 0x88, 0xd9, 0xc4, 0xef, 0x9d, 0x46, + 0x4c, 0x5c, 0x4b, 0xb2, 0x56, 0x95, 0xea, 0xe3, 0xc3, 0x92, 0xf4, 0xf4, 0xb0, 0x24, 0xfd, 0x79, + 0x58, 0x92, 0xbe, 0x3d, 0x2a, 0x8d, 0x3d, 0x3d, 0x2a, 0x8d, 0xfd, 0x7e, 0x54, 0x1a, 0xbb, 0xbf, + 0x92, 0xd6, 0xc2, 0xf6, 0x92, 0xdb, 0x8b, 0x9e, 0x66, 0x66, 0xc4, 0x3f, 0x1b, 0xcb, 0xff, 0x06, + 0x00, 0x00, 0xff, 0xff, 0xd2, 0xfd, 0x84, 0xdd, 0x29, 0x0e, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -842,13 +842,13 @@ const _ = grpc.SupportPackageIsVersion4 type QueryClient interface { // Parameters queries the parameters of the module. Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) - // ChainRegistryList queries the list of chains that are registered to Babylon - ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) - // ChainsRegistry queries the latest info for a given list of chains in Babylon's view - ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) - // FinalityProviderChain info about one finality provider's chain id - FinalityProviderChain(ctx context.Context, in *QueryFinalityProviderChainRequest, opts ...grpc.CallOption) (*QueryFinalityProviderChainResponse, error) - // FinalityProviders queries all finality providers for a given chain + // ConsumerRegistryList queries the list of consumers that are registered to Babylon + ConsumerRegistryList(ctx context.Context, in *QueryConsumerRegistryListRequest, opts ...grpc.CallOption) (*QueryConsumerRegistryListResponse, error) + // ConsumersRegistry queries the latest info for a given list of consumers in Babylon's view + ConsumersRegistry(ctx context.Context, in *QueryConsumersRegistryRequest, opts ...grpc.CallOption) (*QueryConsumersRegistryResponse, error) + // FinalityProviderConsumer info about one finality provider's consumer id + FinalityProviderConsumer(ctx context.Context, in *QueryFinalityProviderConsumerRequest, opts ...grpc.CallOption) (*QueryFinalityProviderConsumerResponse, error) + // FinalityProviders queries all finality providers for a given consumer FinalityProviders(ctx context.Context, in *QueryFinalityProvidersRequest, opts ...grpc.CallOption) (*QueryFinalityProvidersResponse, error) // FinalityProvider info about one finality provider FinalityProvider(ctx context.Context, in *QueryFinalityProviderRequest, opts ...grpc.CallOption) (*QueryFinalityProviderResponse, error) @@ -871,27 +871,27 @@ func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts . return out, nil } -func (c *queryClient) ChainRegistryList(ctx context.Context, in *QueryChainRegistryListRequest, opts ...grpc.CallOption) (*QueryChainRegistryListResponse, error) { - out := new(QueryChainRegistryListResponse) - err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/ChainRegistryList", in, out, opts...) +func (c *queryClient) ConsumerRegistryList(ctx context.Context, in *QueryConsumerRegistryListRequest, opts ...grpc.CallOption) (*QueryConsumerRegistryListResponse, error) { + out := new(QueryConsumerRegistryListResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/ConsumerRegistryList", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *queryClient) ChainsRegistry(ctx context.Context, in *QueryChainsRegistryRequest, opts ...grpc.CallOption) (*QueryChainsRegistryResponse, error) { - out := new(QueryChainsRegistryResponse) - err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/ChainsRegistry", in, out, opts...) +func (c *queryClient) ConsumersRegistry(ctx context.Context, in *QueryConsumersRegistryRequest, opts ...grpc.CallOption) (*QueryConsumersRegistryResponse, error) { + out := new(QueryConsumersRegistryResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/ConsumersRegistry", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *queryClient) FinalityProviderChain(ctx context.Context, in *QueryFinalityProviderChainRequest, opts ...grpc.CallOption) (*QueryFinalityProviderChainResponse, error) { - out := new(QueryFinalityProviderChainResponse) - err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/FinalityProviderChain", in, out, opts...) +func (c *queryClient) FinalityProviderConsumer(ctx context.Context, in *QueryFinalityProviderConsumerRequest, opts ...grpc.CallOption) (*QueryFinalityProviderConsumerResponse, error) { + out := new(QueryFinalityProviderConsumerResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Query/FinalityProviderConsumer", in, out, opts...) if err != nil { return nil, err } @@ -920,13 +920,13 @@ func (c *queryClient) FinalityProvider(ctx context.Context, in *QueryFinalityPro type QueryServer interface { // Parameters queries the parameters of the module. Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) - // ChainRegistryList queries the list of chains that are registered to Babylon - ChainRegistryList(context.Context, *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) - // ChainsRegistry queries the latest info for a given list of chains in Babylon's view - ChainsRegistry(context.Context, *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) - // FinalityProviderChain info about one finality provider's chain id - FinalityProviderChain(context.Context, *QueryFinalityProviderChainRequest) (*QueryFinalityProviderChainResponse, error) - // FinalityProviders queries all finality providers for a given chain + // ConsumerRegistryList queries the list of consumers that are registered to Babylon + ConsumerRegistryList(context.Context, *QueryConsumerRegistryListRequest) (*QueryConsumerRegistryListResponse, error) + // ConsumersRegistry queries the latest info for a given list of consumers in Babylon's view + ConsumersRegistry(context.Context, *QueryConsumersRegistryRequest) (*QueryConsumersRegistryResponse, error) + // FinalityProviderConsumer info about one finality provider's consumer id + FinalityProviderConsumer(context.Context, *QueryFinalityProviderConsumerRequest) (*QueryFinalityProviderConsumerResponse, error) + // FinalityProviders queries all finality providers for a given consumer FinalityProviders(context.Context, *QueryFinalityProvidersRequest) (*QueryFinalityProvidersResponse, error) // FinalityProvider info about one finality provider FinalityProvider(context.Context, *QueryFinalityProviderRequest) (*QueryFinalityProviderResponse, error) @@ -939,14 +939,14 @@ type UnimplementedQueryServer struct { func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") } -func (*UnimplementedQueryServer) ChainRegistryList(ctx context.Context, req *QueryChainRegistryListRequest) (*QueryChainRegistryListResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ChainRegistryList not implemented") +func (*UnimplementedQueryServer) ConsumerRegistryList(ctx context.Context, req *QueryConsumerRegistryListRequest) (*QueryConsumerRegistryListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ConsumerRegistryList not implemented") } -func (*UnimplementedQueryServer) ChainsRegistry(ctx context.Context, req *QueryChainsRegistryRequest) (*QueryChainsRegistryResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ChainsRegistry not implemented") +func (*UnimplementedQueryServer) ConsumersRegistry(ctx context.Context, req *QueryConsumersRegistryRequest) (*QueryConsumersRegistryResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ConsumersRegistry not implemented") } -func (*UnimplementedQueryServer) FinalityProviderChain(ctx context.Context, req *QueryFinalityProviderChainRequest) (*QueryFinalityProviderChainResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method FinalityProviderChain not implemented") +func (*UnimplementedQueryServer) FinalityProviderConsumer(ctx context.Context, req *QueryFinalityProviderConsumerRequest) (*QueryFinalityProviderConsumerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FinalityProviderConsumer not implemented") } func (*UnimplementedQueryServer) FinalityProviders(ctx context.Context, req *QueryFinalityProvidersRequest) (*QueryFinalityProvidersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FinalityProviders not implemented") @@ -977,56 +977,56 @@ func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -func _Query_ChainRegistryList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryChainRegistryListRequest) +func _Query_ConsumerRegistryList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryConsumerRegistryListRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(QueryServer).ChainRegistryList(ctx, in) + return srv.(QueryServer).ConsumerRegistryList(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/babylon.btcstkconsumer.v1.Query/ChainRegistryList", + FullMethod: "/babylon.btcstkconsumer.v1.Query/ConsumerRegistryList", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ChainRegistryList(ctx, req.(*QueryChainRegistryListRequest)) + return srv.(QueryServer).ConsumerRegistryList(ctx, req.(*QueryConsumerRegistryListRequest)) } return interceptor(ctx, in, info, handler) } -func _Query_ChainsRegistry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryChainsRegistryRequest) +func _Query_ConsumersRegistry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryConsumersRegistryRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(QueryServer).ChainsRegistry(ctx, in) + return srv.(QueryServer).ConsumersRegistry(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/babylon.btcstkconsumer.v1.Query/ChainsRegistry", + FullMethod: "/babylon.btcstkconsumer.v1.Query/ConsumersRegistry", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ChainsRegistry(ctx, req.(*QueryChainsRegistryRequest)) + return srv.(QueryServer).ConsumersRegistry(ctx, req.(*QueryConsumersRegistryRequest)) } return interceptor(ctx, in, info, handler) } -func _Query_FinalityProviderChain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryFinalityProviderChainRequest) +func _Query_FinalityProviderConsumer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryFinalityProviderConsumerRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(QueryServer).FinalityProviderChain(ctx, in) + return srv.(QueryServer).FinalityProviderConsumer(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/babylon.btcstkconsumer.v1.Query/FinalityProviderChain", + FullMethod: "/babylon.btcstkconsumer.v1.Query/FinalityProviderConsumer", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).FinalityProviderChain(ctx, req.(*QueryFinalityProviderChainRequest)) + return srv.(QueryServer).FinalityProviderConsumer(ctx, req.(*QueryFinalityProviderConsumerRequest)) } return interceptor(ctx, in, info, handler) } @@ -1076,16 +1076,16 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Handler: _Query_Params_Handler, }, { - MethodName: "ChainRegistryList", - Handler: _Query_ChainRegistryList_Handler, + MethodName: "ConsumerRegistryList", + Handler: _Query_ConsumerRegistryList_Handler, }, { - MethodName: "ChainsRegistry", - Handler: _Query_ChainsRegistry_Handler, + MethodName: "ConsumersRegistry", + Handler: _Query_ConsumersRegistry_Handler, }, { - MethodName: "FinalityProviderChain", - Handler: _Query_FinalityProviderChain_Handler, + MethodName: "FinalityProviderConsumer", + Handler: _Query_FinalityProviderConsumer_Handler, }, { MethodName: "FinalityProviders", @@ -1156,7 +1156,7 @@ func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *QueryChainRegistryListRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryConsumerRegistryListRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1166,12 +1166,12 @@ func (m *QueryChainRegistryListRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryChainRegistryListRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryConsumerRegistryListRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryChainRegistryListRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryConsumerRegistryListRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1191,7 +1191,7 @@ func (m *QueryChainRegistryListRequest) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *QueryChainRegistryListResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryConsumerRegistryListResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1201,12 +1201,12 @@ func (m *QueryChainRegistryListResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryChainRegistryListResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryConsumerRegistryListResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryChainRegistryListResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryConsumerRegistryListResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1223,11 +1223,11 @@ func (m *QueryChainRegistryListResponse) MarshalToSizedBuffer(dAtA []byte) (int, i-- dAtA[i] = 0x12 } - if len(m.ChainIds) > 0 { - for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ChainIds[iNdEx]) - copy(dAtA[i:], m.ChainIds[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) + if len(m.ConsumerIds) > 0 { + for iNdEx := len(m.ConsumerIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ConsumerIds[iNdEx]) + copy(dAtA[i:], m.ConsumerIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ConsumerIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -1235,7 +1235,7 @@ func (m *QueryChainRegistryListResponse) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *QueryChainsRegistryRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryConsumersRegistryRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1245,21 +1245,21 @@ func (m *QueryChainsRegistryRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryChainsRegistryRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryConsumersRegistryRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryChainsRegistryRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryConsumersRegistryRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ChainIds) > 0 { - for iNdEx := len(m.ChainIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ChainIds[iNdEx]) - copy(dAtA[i:], m.ChainIds[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainIds[iNdEx]))) + if len(m.ConsumerIds) > 0 { + for iNdEx := len(m.ConsumerIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ConsumerIds[iNdEx]) + copy(dAtA[i:], m.ConsumerIds[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ConsumerIds[iNdEx]))) i-- dAtA[i] = 0xa } @@ -1267,7 +1267,7 @@ func (m *QueryChainsRegistryRequest) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } -func (m *QueryChainsRegistryResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryConsumersRegistryResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1277,20 +1277,20 @@ func (m *QueryChainsRegistryResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryChainsRegistryResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryConsumersRegistryResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryChainsRegistryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryConsumersRegistryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ChainsRegister) > 0 { - for iNdEx := len(m.ChainsRegister) - 1; iNdEx >= 0; iNdEx-- { + if len(m.ConsumersRegister) > 0 { + for iNdEx := len(m.ConsumersRegister) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.ChainsRegister[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ConsumersRegister[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1336,10 +1336,10 @@ func (m *QueryFinalityProvidersRequest) MarshalToSizedBuffer(dAtA []byte) (int, i-- dAtA[i] = 0x12 } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) + if len(m.ConsumerId) > 0 { + i -= len(m.ConsumerId) + copy(dAtA[i:], m.ConsumerId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ConsumerId))) i-- dAtA[i] = 0xa } @@ -1422,10 +1422,10 @@ func (m *QueryFinalityProviderRequest) MarshalToSizedBuffer(dAtA []byte) (int, e i-- dAtA[i] = 0x12 } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) + if len(m.ConsumerId) > 0 { + i -= len(m.ConsumerId) + copy(dAtA[i:], m.ConsumerId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ConsumerId))) i-- dAtA[i] = 0xa } @@ -1487,10 +1487,10 @@ func (m *FinalityProviderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) + if len(m.ConsumerId) > 0 { + i -= len(m.ConsumerId) + copy(dAtA[i:], m.ConsumerId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ConsumerId))) i-- dAtA[i] = 0x52 } @@ -1572,7 +1572,7 @@ func (m *FinalityProviderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *QueryFinalityProviderChainRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryFinalityProviderConsumerRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1582,12 +1582,12 @@ func (m *QueryFinalityProviderChainRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryFinalityProviderChainRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryFinalityProviderConsumerRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryFinalityProviderChainRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryFinalityProviderConsumerRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1602,7 +1602,7 @@ func (m *QueryFinalityProviderChainRequest) MarshalToSizedBuffer(dAtA []byte) (i return len(dAtA) - i, nil } -func (m *QueryFinalityProviderChainResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryFinalityProviderConsumerResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1612,20 +1612,20 @@ func (m *QueryFinalityProviderChainResponse) Marshal() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *QueryFinalityProviderChainResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryFinalityProviderConsumerResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryFinalityProviderChainResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryFinalityProviderConsumerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) + if len(m.ConsumerId) > 0 { + i -= len(m.ConsumerId) + copy(dAtA[i:], m.ConsumerId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ConsumerId))) i-- dAtA[i] = 0xa } @@ -1663,7 +1663,7 @@ func (m *QueryParamsResponse) Size() (n int) { return n } -func (m *QueryChainRegistryListRequest) Size() (n int) { +func (m *QueryConsumerRegistryListRequest) Size() (n int) { if m == nil { return 0 } @@ -1676,14 +1676,14 @@ func (m *QueryChainRegistryListRequest) Size() (n int) { return n } -func (m *QueryChainRegistryListResponse) Size() (n int) { +func (m *QueryConsumerRegistryListResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.ChainIds) > 0 { - for _, s := range m.ChainIds { + if len(m.ConsumerIds) > 0 { + for _, s := range m.ConsumerIds { l = len(s) n += 1 + l + sovQuery(uint64(l)) } @@ -1695,14 +1695,14 @@ func (m *QueryChainRegistryListResponse) Size() (n int) { return n } -func (m *QueryChainsRegistryRequest) Size() (n int) { +func (m *QueryConsumersRegistryRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.ChainIds) > 0 { - for _, s := range m.ChainIds { + if len(m.ConsumerIds) > 0 { + for _, s := range m.ConsumerIds { l = len(s) n += 1 + l + sovQuery(uint64(l)) } @@ -1710,14 +1710,14 @@ func (m *QueryChainsRegistryRequest) Size() (n int) { return n } -func (m *QueryChainsRegistryResponse) Size() (n int) { +func (m *QueryConsumersRegistryResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.ChainsRegister) > 0 { - for _, e := range m.ChainsRegister { + if len(m.ConsumersRegister) > 0 { + for _, e := range m.ConsumersRegister { l = e.Size() n += 1 + l + sovQuery(uint64(l)) } @@ -1731,7 +1731,7 @@ func (m *QueryFinalityProvidersRequest) Size() (n int) { } var l int _ = l - l = len(m.ChainId) + l = len(m.ConsumerId) if l > 0 { n += 1 + l + sovQuery(uint64(l)) } @@ -1767,7 +1767,7 @@ func (m *QueryFinalityProviderRequest) Size() (n int) { } var l int _ = l - l = len(m.ChainId) + l = len(m.ConsumerId) if l > 0 { n += 1 + l + sovQuery(uint64(l)) } @@ -1829,14 +1829,14 @@ func (m *FinalityProviderResponse) Size() (n int) { if m.VotingPower != 0 { n += 1 + sovQuery(uint64(m.VotingPower)) } - l = len(m.ChainId) + l = len(m.ConsumerId) if l > 0 { n += 1 + l + sovQuery(uint64(l)) } return n } -func (m *QueryFinalityProviderChainRequest) Size() (n int) { +func (m *QueryFinalityProviderConsumerRequest) Size() (n int) { if m == nil { return 0 } @@ -1849,13 +1849,13 @@ func (m *QueryFinalityProviderChainRequest) Size() (n int) { return n } -func (m *QueryFinalityProviderChainResponse) Size() (n int) { +func (m *QueryFinalityProviderConsumerResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.ChainId) + l = len(m.ConsumerId) if l > 0 { n += 1 + l + sovQuery(uint64(l)) } @@ -2001,7 +2001,7 @@ func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainRegistryListRequest) Unmarshal(dAtA []byte) error { +func (m *QueryConsumerRegistryListRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2024,10 +2024,10 @@ func (m *QueryChainRegistryListRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainRegistryListRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryConsumerRegistryListRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainRegistryListRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryConsumerRegistryListRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -2087,7 +2087,7 @@ func (m *QueryChainRegistryListRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainRegistryListResponse) Unmarshal(dAtA []byte) error { +func (m *QueryConsumerRegistryListResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2110,15 +2110,15 @@ func (m *QueryChainRegistryListResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainRegistryListResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryConsumerRegistryListResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainRegistryListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryConsumerRegistryListResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2146,7 +2146,7 @@ func (m *QueryChainRegistryListResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + m.ConsumerIds = append(m.ConsumerIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { @@ -2205,7 +2205,7 @@ func (m *QueryChainRegistryListResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainsRegistryRequest) Unmarshal(dAtA []byte) error { +func (m *QueryConsumersRegistryRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2228,15 +2228,15 @@ func (m *QueryChainsRegistryRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainsRegistryRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryConsumersRegistryRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainsRegistryRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryConsumersRegistryRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerIds", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2264,7 +2264,7 @@ func (m *QueryChainsRegistryRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainIds = append(m.ChainIds, string(dAtA[iNdEx:postIndex])) + m.ConsumerIds = append(m.ConsumerIds, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -2287,7 +2287,7 @@ func (m *QueryChainsRegistryRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryChainsRegistryResponse) Unmarshal(dAtA []byte) error { +func (m *QueryConsumersRegistryResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2310,15 +2310,15 @@ func (m *QueryChainsRegistryResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryChainsRegistryResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryConsumersRegistryResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryChainsRegistryResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryConsumersRegistryResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainsRegister", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumersRegister", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2345,8 +2345,8 @@ func (m *QueryChainsRegistryResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainsRegister = append(m.ChainsRegister, &ChainRegister{}) - if err := m.ChainsRegister[len(m.ChainsRegister)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.ConsumersRegister = append(m.ConsumersRegister, &ConsumerRegister{}) + if err := m.ConsumersRegister[len(m.ConsumersRegister)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2402,7 +2402,7 @@ func (m *QueryFinalityProvidersRequest) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2430,7 +2430,7 @@ func (m *QueryFinalityProvidersRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ConsumerId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -2640,7 +2640,7 @@ func (m *QueryFinalityProviderRequest) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2668,7 +2668,7 @@ func (m *QueryFinalityProviderRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ConsumerId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -3091,7 +3091,7 @@ func (m *FinalityProviderResponse) Unmarshal(dAtA []byte) error { } case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -3119,7 +3119,7 @@ func (m *FinalityProviderResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ConsumerId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -3142,7 +3142,7 @@ func (m *FinalityProviderResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryFinalityProviderChainRequest) Unmarshal(dAtA []byte) error { +func (m *QueryFinalityProviderConsumerRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3165,10 +3165,10 @@ func (m *QueryFinalityProviderChainRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryFinalityProviderChainRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryFinalityProviderConsumerRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryFinalityProviderChainRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryFinalityProviderConsumerRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -3224,7 +3224,7 @@ func (m *QueryFinalityProviderChainRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryFinalityProviderChainResponse) Unmarshal(dAtA []byte) error { +func (m *QueryFinalityProviderConsumerResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3247,15 +3247,15 @@ func (m *QueryFinalityProviderChainResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryFinalityProviderChainResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryFinalityProviderConsumerResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryFinalityProviderChainResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryFinalityProviderConsumerResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -3283,7 +3283,7 @@ func (m *QueryFinalityProviderChainResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ConsumerId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/x/btcstkconsumer/types/query.pb.gw.go b/x/btcstkconsumer/types/query.pb.gw.go index d561633c9..2fe94fb31 100644 --- a/x/btcstkconsumer/types/query.pb.gw.go +++ b/x/btcstkconsumer/types/query.pb.gw.go @@ -52,43 +52,43 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal } var ( - filter_Query_ChainRegistryList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + filter_Query_ConsumerRegistryList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) -func request_Query_ChainRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainRegistryListRequest +func request_Query_ConsumerRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryConsumerRegistryListRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainRegistryList_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ConsumerRegistryList_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ChainRegistryList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.ConsumerRegistryList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_ChainRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainRegistryListRequest +func local_request_Query_ConsumerRegistryList_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryConsumerRegistryListRequest var metadata runtime.ServerMetadata if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ChainRegistryList_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ConsumerRegistryList_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.ChainRegistryList(ctx, &protoReq) + msg, err := server.ConsumerRegistryList(ctx, &protoReq) return msg, metadata, err } -func request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainsRegistryRequest +func request_Query_ConsumersRegistry_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryConsumersRegistryRequest var metadata runtime.ServerMetadata var ( @@ -98,24 +98,24 @@ func request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marsh _ = err ) - val, ok = pathParams["chain_ids"] + val, ok = pathParams["consumer_ids"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_ids") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "consumer_ids") } - protoReq.ChainIds, err = runtime.StringSlice(val, ",") + protoReq.ConsumerIds, err = runtime.StringSlice(val, ",") if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_ids", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "consumer_ids", err) } - msg, err := client.ChainsRegistry(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.ConsumersRegistry(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChainsRegistryRequest +func local_request_Query_ConsumersRegistry_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryConsumersRegistryRequest var metadata runtime.ServerMetadata var ( @@ -125,24 +125,24 @@ func local_request_Query_ChainsRegistry_0(ctx context.Context, marshaler runtime _ = err ) - val, ok = pathParams["chain_ids"] + val, ok = pathParams["consumer_ids"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_ids") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "consumer_ids") } - protoReq.ChainIds, err = runtime.StringSlice(val, ",") + protoReq.ConsumerIds, err = runtime.StringSlice(val, ",") if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_ids", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "consumer_ids", err) } - msg, err := server.ChainsRegistry(ctx, &protoReq) + msg, err := server.ConsumersRegistry(ctx, &protoReq) return msg, metadata, err } -func request_Query_FinalityProviderChain_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryFinalityProviderChainRequest +func request_Query_FinalityProviderConsumer_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalityProviderConsumerRequest var metadata runtime.ServerMetadata var ( @@ -163,13 +163,13 @@ func request_Query_FinalityProviderChain_0(ctx context.Context, marshaler runtim return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fp_btc_pk_hex", err) } - msg, err := client.FinalityProviderChain(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.FinalityProviderConsumer(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_FinalityProviderChain_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryFinalityProviderChainRequest +func local_request_Query_FinalityProviderConsumer_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryFinalityProviderConsumerRequest var metadata runtime.ServerMetadata var ( @@ -190,13 +190,13 @@ func local_request_Query_FinalityProviderChain_0(ctx context.Context, marshaler return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "fp_btc_pk_hex", err) } - msg, err := server.FinalityProviderChain(ctx, &protoReq) + msg, err := server.FinalityProviderConsumer(ctx, &protoReq) return msg, metadata, err } var ( - filter_Query_FinalityProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{"chain_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Query_FinalityProviders_0 = &utilities.DoubleArray{Encoding: map[string]int{"consumer_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_Query_FinalityProviders_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -210,15 +210,15 @@ func request_Query_FinalityProviders_0(ctx context.Context, marshaler runtime.Ma _ = err ) - val, ok = pathParams["chain_id"] + val, ok = pathParams["consumer_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "consumer_id") } - protoReq.ChainId, err = runtime.String(val) + protoReq.ConsumerId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "consumer_id", err) } if err := req.ParseForm(); err != nil { @@ -244,15 +244,15 @@ func local_request_Query_FinalityProviders_0(ctx context.Context, marshaler runt _ = err ) - val, ok = pathParams["chain_id"] + val, ok = pathParams["consumer_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "consumer_id") } - protoReq.ChainId, err = runtime.String(val) + protoReq.ConsumerId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "consumer_id", err) } if err := req.ParseForm(); err != nil { @@ -278,15 +278,15 @@ func request_Query_FinalityProvider_0(ctx context.Context, marshaler runtime.Mar _ = err ) - val, ok = pathParams["chain_id"] + val, ok = pathParams["consumer_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "consumer_id") } - protoReq.ChainId, err = runtime.String(val) + protoReq.ConsumerId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "consumer_id", err) } val, ok = pathParams["fp_btc_pk_hex"] @@ -316,15 +316,15 @@ func local_request_Query_FinalityProvider_0(ctx context.Context, marshaler runti _ = err ) - val, ok = pathParams["chain_id"] + val, ok = pathParams["consumer_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chain_id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "consumer_id") } - protoReq.ChainId, err = runtime.String(val) + protoReq.ConsumerId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chain_id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "consumer_id", err) } val, ok = pathParams["fp_btc_pk_hex"] @@ -372,7 +372,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) - mux.Handle("GET", pattern_Query_ChainRegistryList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_ConsumerRegistryList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -383,7 +383,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Query_ChainRegistryList_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Query_ConsumerRegistryList_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 { @@ -391,11 +391,11 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } - forward_Query_ChainRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_ConsumerRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_Query_ChainsRegistry_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_ConsumersRegistry_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -406,7 +406,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Query_ChainsRegistry_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Query_ConsumersRegistry_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 { @@ -414,11 +414,11 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } - forward_Query_ChainsRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_ConsumersRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_Query_FinalityProviderChain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_FinalityProviderConsumer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -429,7 +429,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Query_FinalityProviderChain_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Query_FinalityProviderConsumer_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 { @@ -437,7 +437,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } - forward_Query_FinalityProviderChain_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_FinalityProviderConsumer_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -548,7 +548,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) - mux.Handle("GET", pattern_Query_ChainRegistryList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_ConsumerRegistryList_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) @@ -557,18 +557,18 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Query_ChainRegistryList_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Query_ConsumerRegistryList_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_ChainRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_ConsumerRegistryList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_Query_ChainsRegistry_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_ConsumersRegistry_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) @@ -577,18 +577,18 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Query_ChainsRegistry_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Query_ConsumersRegistry_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_ChainsRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_ConsumersRegistry_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_Query_FinalityProviderChain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Query_FinalityProviderConsumer_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) @@ -597,14 +597,14 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Query_FinalityProviderChain_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Query_FinalityProviderConsumer_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_FinalityProviderChain_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_FinalityProviderConsumer_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -654,25 +654,25 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie var ( pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_ChainRegistryList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "chain_registry_list"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_ConsumerRegistryList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"babylon", "btcstkconsumer", "v1", "consumer_registry_list"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_ChainsRegistry_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "btcstkconsumer", "v1", "chains_registry", "chain_ids"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_ConsumersRegistry_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "btcstkconsumer", "v1", "consumers_registry", "consumer_ids"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_FinalityProviderChain_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "btcstkconsumer", "v1", "finality_provider_chain", "fp_btc_pk_hex"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_FinalityProviderConsumer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "btcstkconsumer", "v1", "finality_provider_consumer", "fp_btc_pk_hex"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_FinalityProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "btcstkconsumer", "v1", "finality_providers", "chain_id"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_FinalityProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"babylon", "btcstkconsumer", "v1", "finality_providers", "consumer_id"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_FinalityProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"babylon", "btcstkconsumer", "v1", "finality_provider", "chain_id", "fp_btc_pk_hex"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_FinalityProvider_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"babylon", "btcstkconsumer", "v1", "finality_provider", "consumer_id", "fp_btc_pk_hex"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( forward_Query_Params_0 = runtime.ForwardResponseMessage - forward_Query_ChainRegistryList_0 = runtime.ForwardResponseMessage + forward_Query_ConsumerRegistryList_0 = runtime.ForwardResponseMessage - forward_Query_ChainsRegistry_0 = runtime.ForwardResponseMessage + forward_Query_ConsumersRegistry_0 = runtime.ForwardResponseMessage - forward_Query_FinalityProviderChain_0 = runtime.ForwardResponseMessage + forward_Query_FinalityProviderConsumer_0 = runtime.ForwardResponseMessage forward_Query_FinalityProviders_0 = runtime.ForwardResponseMessage diff --git a/x/btcstkconsumer/types/tx.pb.go b/x/btcstkconsumer/types/tx.pb.go index e1d69565c..cf0d4141c 100644 --- a/x/btcstkconsumer/types/tx.pb.go +++ b/x/btcstkconsumer/types/tx.pb.go @@ -126,29 +126,29 @@ func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo -// MsgRegisterChain defines a message for registering CZ chains to the btcstkconsumer module. -type MsgRegisterChain struct { +// MsgRegisterConsumer defines a message for registering CZ consumers to the btcstkconsumer module. +type MsgRegisterConsumer struct { Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` - // chain_id is the ID of the chain - ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // chain_name is the name of the chain - ChainName string `protobuf:"bytes,3,opt,name=chain_name,json=chainName,proto3" json:"chain_name,omitempty"` - // chain_description is a description for the chain (can be empty) - ChainDescription string `protobuf:"bytes,4,opt,name=chain_description,json=chainDescription,proto3" json:"chain_description,omitempty"` + // consumer_id is the ID of the consumer + ConsumerId string `protobuf:"bytes,2,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` + // consumer_name is the name of the consumer + ConsumerName string `protobuf:"bytes,3,opt,name=consumer_name,json=consumerName,proto3" json:"consumer_name,omitempty"` + // consumer_description is a description for the consumer (can be empty) + ConsumerDescription string `protobuf:"bytes,4,opt,name=consumer_description,json=consumerDescription,proto3" json:"consumer_description,omitempty"` } -func (m *MsgRegisterChain) Reset() { *m = MsgRegisterChain{} } -func (m *MsgRegisterChain) String() string { return proto.CompactTextString(m) } -func (*MsgRegisterChain) ProtoMessage() {} -func (*MsgRegisterChain) Descriptor() ([]byte, []int) { +func (m *MsgRegisterConsumer) Reset() { *m = MsgRegisterConsumer{} } +func (m *MsgRegisterConsumer) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterConsumer) ProtoMessage() {} +func (*MsgRegisterConsumer) Descriptor() ([]byte, []int) { return fileDescriptor_12cd7e02078b20ee, []int{2} } -func (m *MsgRegisterChain) XXX_Unmarshal(b []byte) error { +func (m *MsgRegisterConsumer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *MsgRegisterChain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *MsgRegisterConsumer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_MsgRegisterChain.Marshal(b, m, deterministic) + return xxx_messageInfo_MsgRegisterConsumer.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -158,62 +158,62 @@ func (m *MsgRegisterChain) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *MsgRegisterChain) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRegisterChain.Merge(m, src) +func (m *MsgRegisterConsumer) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterConsumer.Merge(m, src) } -func (m *MsgRegisterChain) XXX_Size() int { +func (m *MsgRegisterConsumer) XXX_Size() int { return m.Size() } -func (m *MsgRegisterChain) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRegisterChain.DiscardUnknown(m) +func (m *MsgRegisterConsumer) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterConsumer.DiscardUnknown(m) } -var xxx_messageInfo_MsgRegisterChain proto.InternalMessageInfo +var xxx_messageInfo_MsgRegisterConsumer proto.InternalMessageInfo -func (m *MsgRegisterChain) GetSigner() string { +func (m *MsgRegisterConsumer) GetSigner() string { if m != nil { return m.Signer } return "" } -func (m *MsgRegisterChain) GetChainId() string { +func (m *MsgRegisterConsumer) GetConsumerId() string { if m != nil { - return m.ChainId + return m.ConsumerId } return "" } -func (m *MsgRegisterChain) GetChainName() string { +func (m *MsgRegisterConsumer) GetConsumerName() string { if m != nil { - return m.ChainName + return m.ConsumerName } return "" } -func (m *MsgRegisterChain) GetChainDescription() string { +func (m *MsgRegisterConsumer) GetConsumerDescription() string { if m != nil { - return m.ChainDescription + return m.ConsumerDescription } return "" } -// MsgRegisterChainResponse is the response to the MsgRegisterChain message. -type MsgRegisterChainResponse struct { +// MsgRegisterConsumerResponse is the response to the MsgRegisterConsumer message. +type MsgRegisterConsumerResponse struct { } -func (m *MsgRegisterChainResponse) Reset() { *m = MsgRegisterChainResponse{} } -func (m *MsgRegisterChainResponse) String() string { return proto.CompactTextString(m) } -func (*MsgRegisterChainResponse) ProtoMessage() {} -func (*MsgRegisterChainResponse) Descriptor() ([]byte, []int) { +func (m *MsgRegisterConsumerResponse) Reset() { *m = MsgRegisterConsumerResponse{} } +func (m *MsgRegisterConsumerResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRegisterConsumerResponse) ProtoMessage() {} +func (*MsgRegisterConsumerResponse) Descriptor() ([]byte, []int) { return fileDescriptor_12cd7e02078b20ee, []int{3} } -func (m *MsgRegisterChainResponse) XXX_Unmarshal(b []byte) error { +func (m *MsgRegisterConsumerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *MsgRegisterChainResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *MsgRegisterConsumerResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_MsgRegisterChainResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_MsgRegisterConsumerResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -223,23 +223,23 @@ func (m *MsgRegisterChainResponse) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } -func (m *MsgRegisterChainResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRegisterChainResponse.Merge(m, src) +func (m *MsgRegisterConsumerResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRegisterConsumerResponse.Merge(m, src) } -func (m *MsgRegisterChainResponse) XXX_Size() int { +func (m *MsgRegisterConsumerResponse) XXX_Size() int { return m.Size() } -func (m *MsgRegisterChainResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRegisterChainResponse.DiscardUnknown(m) +func (m *MsgRegisterConsumerResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRegisterConsumerResponse.DiscardUnknown(m) } -var xxx_messageInfo_MsgRegisterChainResponse proto.InternalMessageInfo +var xxx_messageInfo_MsgRegisterConsumerResponse proto.InternalMessageInfo func init() { proto.RegisterType((*MsgUpdateParams)(nil), "babylon.btcstkconsumer.v1.MsgUpdateParams") proto.RegisterType((*MsgUpdateParamsResponse)(nil), "babylon.btcstkconsumer.v1.MsgUpdateParamsResponse") - proto.RegisterType((*MsgRegisterChain)(nil), "babylon.btcstkconsumer.v1.MsgRegisterChain") - proto.RegisterType((*MsgRegisterChainResponse)(nil), "babylon.btcstkconsumer.v1.MsgRegisterChainResponse") + proto.RegisterType((*MsgRegisterConsumer)(nil), "babylon.btcstkconsumer.v1.MsgRegisterConsumer") + proto.RegisterType((*MsgRegisterConsumerResponse)(nil), "babylon.btcstkconsumer.v1.MsgRegisterConsumerResponse") } func init() { @@ -247,38 +247,38 @@ func init() { } var fileDescriptor_12cd7e02078b20ee = []byte{ - // 483 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x31, 0x6f, 0x13, 0x31, - 0x14, 0x8e, 0x29, 0x14, 0xce, 0x05, 0xd1, 0x9e, 0x2a, 0x7a, 0x39, 0x89, 0xa3, 0xdc, 0x80, 0xaa, - 0x44, 0xdc, 0xa9, 0xa9, 0xd4, 0xa1, 0x03, 0x12, 0xa1, 0x0b, 0x43, 0x50, 0x75, 0x88, 0x85, 0xa5, - 0xf2, 0xdd, 0x59, 0x8e, 0x05, 0xb6, 0x0f, 0xdb, 0xa9, 0x9a, 0x0d, 0x31, 0x32, 0xf1, 0x0b, 0x98, - 0x19, 0x33, 0xf0, 0x23, 0xba, 0x51, 0x31, 0x31, 0x21, 0x94, 0x0c, 0x19, 0xf9, 0x0b, 0xe8, 0x6c, - 0x47, 0x51, 0x22, 0x52, 0xc1, 0x12, 0xe5, 0xbd, 0xef, 0xf3, 0xf7, 0xbd, 0xef, 0xdd, 0x83, 0x71, - 0x8e, 0xf2, 0xe1, 0x5b, 0xc1, 0xd3, 0x5c, 0x17, 0x4a, 0xbf, 0x29, 0x04, 0x57, 0x03, 0x86, 0x65, - 0x7a, 0xb6, 0x9f, 0xea, 0xf3, 0xa4, 0x92, 0x42, 0x0b, 0xbf, 0xe9, 0x38, 0xc9, 0x22, 0x27, 0x39, - 0xdb, 0x0f, 0xb7, 0x10, 0xa3, 0x5c, 0xa4, 0xe6, 0xd7, 0xb2, 0xc3, 0x9d, 0x42, 0x28, 0x26, 0x54, - 0xca, 0x14, 0xa9, 0x55, 0x98, 0x22, 0x0e, 0x68, 0x5a, 0xe0, 0xd4, 0x54, 0xa9, 0x2d, 0x1c, 0xb4, - 0x4d, 0x04, 0x11, 0xb6, 0x5f, 0xff, 0x73, 0xdd, 0x47, 0xab, 0x67, 0xab, 0x90, 0x44, 0xcc, 0xbd, - 0x8e, 0xbf, 0x01, 0x78, 0xb7, 0xa7, 0xc8, 0xab, 0xaa, 0x44, 0x1a, 0x9f, 0x18, 0xc4, 0x3f, 0x84, - 0x1e, 0x1a, 0xe8, 0xbe, 0x90, 0x54, 0x0f, 0x03, 0xb0, 0x0b, 0xf6, 0xbc, 0x6e, 0xf0, 0xfd, 0xeb, - 0xe3, 0x6d, 0x67, 0xfb, 0xb4, 0x2c, 0x25, 0x56, 0xea, 0xa5, 0x96, 0x94, 0x93, 0x6c, 0x4e, 0xf5, - 0x8f, 0xe1, 0xba, 0xd5, 0x0e, 0xae, 0xed, 0x82, 0xbd, 0x8d, 0xce, 0xc3, 0x64, 0x65, 0xf8, 0xc4, - 0x5a, 0x75, 0xbd, 0x8b, 0x9f, 0x0f, 0x1a, 0x5f, 0xa6, 0xa3, 0x16, 0xc8, 0xdc, 0xdb, 0xa3, 0x27, - 0x1f, 0xa6, 0xa3, 0xd6, 0x5c, 0xf5, 0xe3, 0x74, 0xd4, 0x6a, 0xcf, 0xc2, 0x9c, 0xff, 0x25, 0xce, - 0xd2, 0xf4, 0x71, 0x13, 0xee, 0x2c, 0xb5, 0x32, 0xac, 0x2a, 0xc1, 0x15, 0x8e, 0x3f, 0x03, 0xb8, - 0xd9, 0x53, 0x24, 0xc3, 0x84, 0x2a, 0x8d, 0xe5, 0xb3, 0x3e, 0xa2, 0xdc, 0xbf, 0x07, 0xd7, 0x15, - 0x25, 0x1c, 0x4b, 0x1b, 0x35, 0x73, 0x95, 0xdf, 0x84, 0xb7, 0x8a, 0x9a, 0x70, 0x4a, 0x4b, 0x93, - 0xc7, 0xcb, 0x6e, 0x9a, 0xfa, 0x79, 0xe9, 0xdf, 0x87, 0xd0, 0x42, 0x1c, 0x31, 0x1c, 0xac, 0x19, - 0xd0, 0x33, 0x9d, 0x17, 0x88, 0x61, 0xbf, 0x0d, 0xb7, 0x2c, 0x5c, 0x62, 0x55, 0x48, 0x5a, 0x69, - 0x2a, 0x78, 0x70, 0xdd, 0xb0, 0x36, 0x0d, 0x70, 0x3c, 0xef, 0x1f, 0x6d, 0xd4, 0x71, 0x9d, 0x67, - 0x1c, 0xc2, 0x60, 0x79, 0xbe, 0xd9, 0xf0, 0x9d, 0xdf, 0x00, 0xae, 0xf5, 0x14, 0xf1, 0x39, 0xbc, - 0xbd, 0xf0, 0xb5, 0x5a, 0x57, 0x6c, 0x79, 0x69, 0x11, 0x61, 0xe7, 0xdf, 0xb9, 0x33, 0x5f, 0xff, - 0x1d, 0xbc, 0xb3, 0xb8, 0xb0, 0xf6, 0xd5, 0x22, 0x0b, 0xe4, 0xf0, 0xe0, 0x3f, 0xc8, 0x33, 0xcb, - 0xf0, 0xc6, 0xfb, 0xfa, 0x22, 0xba, 0x27, 0x17, 0xe3, 0x08, 0x5c, 0x8e, 0x23, 0xf0, 0x6b, 0x1c, - 0x81, 0x4f, 0x93, 0xa8, 0x71, 0x39, 0x89, 0x1a, 0x3f, 0x26, 0x51, 0xe3, 0xf5, 0x21, 0xa1, 0xba, - 0x3f, 0xc8, 0x93, 0x42, 0xb0, 0xd4, 0xe9, 0x9b, 0xc5, 0xa6, 0x2b, 0x0f, 0x45, 0x0f, 0x2b, 0xac, - 0xf2, 0x75, 0x73, 0xf4, 0x07, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x75, 0xfa, 0xfc, 0x9e, 0xba, - 0x03, 0x00, 0x00, + // 487 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0x31, 0x6f, 0xd3, 0x40, + 0x14, 0xc7, 0x73, 0x14, 0x22, 0xe5, 0x52, 0x04, 0x5c, 0x23, 0xea, 0x18, 0xe1, 0x16, 0x23, 0xa1, + 0x2a, 0x08, 0x5b, 0x09, 0x52, 0x86, 0x0e, 0x48, 0x84, 0x2e, 0x0c, 0x41, 0x95, 0x11, 0x0b, 0x4b, + 0x75, 0xb6, 0x4f, 0x97, 0x13, 0xdc, 0x9d, 0x75, 0x77, 0xa9, 0x1a, 0x26, 0xc4, 0xc8, 0xc4, 0xc7, + 0x60, 0x8c, 0x04, 0x1f, 0xa2, 0x1b, 0x15, 0x13, 0x13, 0x42, 0xc9, 0x90, 0xaf, 0xc0, 0x88, 0x62, + 0x9f, 0x1b, 0x35, 0x34, 0x11, 0x2c, 0x96, 0xdf, 0x7b, 0xbf, 0x7b, 0xff, 0xf7, 0x7f, 0x3e, 0x43, + 0x3f, 0xc6, 0xf1, 0xe8, 0xad, 0x14, 0x61, 0x6c, 0x12, 0x6d, 0xde, 0x24, 0x52, 0xe8, 0x21, 0x27, + 0x2a, 0x3c, 0x6e, 0x87, 0xe6, 0x24, 0xc8, 0x94, 0x34, 0x12, 0x35, 0x2d, 0x13, 0x5c, 0x64, 0x82, + 0xe3, 0xb6, 0x7b, 0x0b, 0x73, 0x26, 0x64, 0x98, 0x3f, 0x0b, 0xda, 0xdd, 0x4e, 0xa4, 0xe6, 0x52, + 0x87, 0x5c, 0xd3, 0x79, 0x17, 0xae, 0xa9, 0x2d, 0x34, 0x8b, 0xc2, 0x51, 0x1e, 0x85, 0x45, 0x60, + 0x4b, 0x0d, 0x2a, 0xa9, 0x2c, 0xf2, 0xf3, 0x37, 0x9b, 0x7d, 0xb0, 0x7a, 0xb6, 0x0c, 0x2b, 0xcc, + 0xed, 0x69, 0xff, 0x1b, 0x80, 0x37, 0xfa, 0x9a, 0xbe, 0xca, 0x52, 0x6c, 0xc8, 0x61, 0x5e, 0x41, + 0x5d, 0x58, 0xc3, 0x43, 0x33, 0x90, 0x8a, 0x99, 0x91, 0x03, 0x76, 0xc1, 0x5e, 0xad, 0xe7, 0x7c, + 0xff, 0xfa, 0xa8, 0x61, 0x65, 0x9f, 0xa6, 0xa9, 0x22, 0x5a, 0xbf, 0x34, 0x8a, 0x09, 0x1a, 0x2d, + 0x50, 0x74, 0x00, 0xab, 0x45, 0x6f, 0xe7, 0xca, 0x2e, 0xd8, 0xab, 0x77, 0xee, 0x05, 0x2b, 0xcd, + 0x07, 0x85, 0x54, 0xaf, 0x76, 0xfa, 0x73, 0xa7, 0xf2, 0x79, 0x36, 0x6e, 0x81, 0xc8, 0x9e, 0xdd, + 0x7f, 0xf2, 0x61, 0x36, 0x6e, 0x2d, 0xba, 0x7e, 0x9c, 0x8d, 0x5b, 0x0f, 0x4b, 0x33, 0x27, 0x97, + 0xd8, 0x59, 0x9a, 0xde, 0x6f, 0xc2, 0xed, 0xa5, 0x54, 0x44, 0x74, 0x26, 0x85, 0x26, 0xfe, 0x17, + 0x00, 0xb7, 0xfa, 0x9a, 0x46, 0x84, 0x32, 0x6d, 0x88, 0x7a, 0x66, 0xbb, 0xa0, 0xdb, 0xb0, 0xaa, + 0x19, 0x15, 0x44, 0x15, 0x6e, 0x23, 0x1b, 0xa1, 0x1d, 0x58, 0x2f, 0x95, 0x8e, 0x58, 0x9a, 0xbb, + 0xaa, 0x45, 0xb0, 0x4c, 0x3d, 0x4f, 0xd1, 0x7d, 0x78, 0xfd, 0x1c, 0x10, 0x98, 0x13, 0x67, 0x23, + 0x47, 0x36, 0xcb, 0xe4, 0x0b, 0xcc, 0x09, 0x6a, 0xc3, 0xc6, 0x39, 0x94, 0x12, 0x9d, 0x28, 0x96, + 0x19, 0x26, 0x85, 0x73, 0x35, 0x67, 0xb7, 0xca, 0xda, 0xc1, 0xa2, 0xb4, 0x5f, 0x9f, 0xef, 0xc0, + 0x4e, 0xe1, 0xdf, 0x85, 0x77, 0x2e, 0x19, 0xba, 0x34, 0xd5, 0xf9, 0x0d, 0xe0, 0x46, 0x5f, 0x53, + 0x24, 0xe0, 0xe6, 0x85, 0xaf, 0xd8, 0x5a, 0xb3, 0xfd, 0xa5, 0x05, 0xb9, 0x9d, 0x7f, 0x67, 0x4b, + 0x5d, 0xf4, 0x0e, 0xde, 0xfc, 0x6b, 0x91, 0xc1, 0xfa, 0x3e, 0xcb, 0xbc, 0xdb, 0xfd, 0x3f, 0xbe, + 0xd4, 0x76, 0xaf, 0xbd, 0x9f, 0x5f, 0x99, 0xde, 0xe1, 0xe9, 0xc4, 0x03, 0x67, 0x13, 0x0f, 0xfc, + 0x9a, 0x78, 0xe0, 0xd3, 0xd4, 0xab, 0x9c, 0x4d, 0xbd, 0xca, 0x8f, 0xa9, 0x57, 0x79, 0xdd, 0xa5, + 0xcc, 0x0c, 0x86, 0x71, 0x90, 0x48, 0x1e, 0x5a, 0x89, 0x64, 0x80, 0x99, 0x08, 0x57, 0xde, 0x24, + 0x33, 0xca, 0x88, 0x8e, 0xab, 0xf9, 0x5f, 0xf1, 0xf8, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7b, + 0xeb, 0x67, 0x7e, 0xdb, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -296,8 +296,8 @@ type MsgClient interface { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) - // RegisterChain registers a CZ chain to the btcstkconsumer module. - RegisterChain(ctx context.Context, in *MsgRegisterChain, opts ...grpc.CallOption) (*MsgRegisterChainResponse, error) + // RegisterConsumer registers a CZ consumer to the btcstkconsumer module. + RegisterConsumer(ctx context.Context, in *MsgRegisterConsumer, opts ...grpc.CallOption) (*MsgRegisterConsumerResponse, error) } type msgClient struct { @@ -317,9 +317,9 @@ func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts return out, nil } -func (c *msgClient) RegisterChain(ctx context.Context, in *MsgRegisterChain, opts ...grpc.CallOption) (*MsgRegisterChainResponse, error) { - out := new(MsgRegisterChainResponse) - err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Msg/RegisterChain", in, out, opts...) +func (c *msgClient) RegisterConsumer(ctx context.Context, in *MsgRegisterConsumer, opts ...grpc.CallOption) (*MsgRegisterConsumerResponse, error) { + out := new(MsgRegisterConsumerResponse) + err := c.cc.Invoke(ctx, "/babylon.btcstkconsumer.v1.Msg/RegisterConsumer", in, out, opts...) if err != nil { return nil, err } @@ -331,8 +331,8 @@ type MsgServer interface { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) - // RegisterChain registers a CZ chain to the btcstkconsumer module. - RegisterChain(context.Context, *MsgRegisterChain) (*MsgRegisterChainResponse, error) + // RegisterConsumer registers a CZ consumer to the btcstkconsumer module. + RegisterConsumer(context.Context, *MsgRegisterConsumer) (*MsgRegisterConsumerResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -342,8 +342,8 @@ type UnimplementedMsgServer struct { func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") } -func (*UnimplementedMsgServer) RegisterChain(ctx context.Context, req *MsgRegisterChain) (*MsgRegisterChainResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RegisterChain not implemented") +func (*UnimplementedMsgServer) RegisterConsumer(ctx context.Context, req *MsgRegisterConsumer) (*MsgRegisterConsumerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterConsumer not implemented") } func RegisterMsgServer(s grpc1.Server, srv MsgServer) { @@ -368,20 +368,20 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } -func _Msg_RegisterChain_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgRegisterChain) +func _Msg_RegisterConsumer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRegisterConsumer) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(MsgServer).RegisterChain(ctx, in) + return srv.(MsgServer).RegisterConsumer(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/babylon.btcstkconsumer.v1.Msg/RegisterChain", + FullMethod: "/babylon.btcstkconsumer.v1.Msg/RegisterConsumer", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).RegisterChain(ctx, req.(*MsgRegisterChain)) + return srv.(MsgServer).RegisterConsumer(ctx, req.(*MsgRegisterConsumer)) } return interceptor(ctx, in, info, handler) } @@ -395,8 +395,8 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ Handler: _Msg_UpdateParams_Handler, }, { - MethodName: "RegisterChain", - Handler: _Msg_RegisterChain_Handler, + MethodName: "RegisterConsumer", + Handler: _Msg_RegisterConsumer_Handler, }, }, Streams: []grpc.StreamDesc{}, @@ -466,7 +466,7 @@ func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *MsgRegisterChain) Marshal() (dAtA []byte, err error) { +func (m *MsgRegisterConsumer) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -476,34 +476,34 @@ func (m *MsgRegisterChain) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgRegisterChain) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgRegisterConsumer) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgRegisterChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgRegisterConsumer) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ChainDescription) > 0 { - i -= len(m.ChainDescription) - copy(dAtA[i:], m.ChainDescription) - i = encodeVarintTx(dAtA, i, uint64(len(m.ChainDescription))) + if len(m.ConsumerDescription) > 0 { + i -= len(m.ConsumerDescription) + copy(dAtA[i:], m.ConsumerDescription) + i = encodeVarintTx(dAtA, i, uint64(len(m.ConsumerDescription))) i-- dAtA[i] = 0x22 } - if len(m.ChainName) > 0 { - i -= len(m.ChainName) - copy(dAtA[i:], m.ChainName) - i = encodeVarintTx(dAtA, i, uint64(len(m.ChainName))) + if len(m.ConsumerName) > 0 { + i -= len(m.ConsumerName) + copy(dAtA[i:], m.ConsumerName) + i = encodeVarintTx(dAtA, i, uint64(len(m.ConsumerName))) i-- dAtA[i] = 0x1a } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintTx(dAtA, i, uint64(len(m.ChainId))) + if len(m.ConsumerId) > 0 { + i -= len(m.ConsumerId) + copy(dAtA[i:], m.ConsumerId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ConsumerId))) i-- dAtA[i] = 0x12 } @@ -517,7 +517,7 @@ func (m *MsgRegisterChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *MsgRegisterChainResponse) Marshal() (dAtA []byte, err error) { +func (m *MsgRegisterConsumerResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -527,12 +527,12 @@ func (m *MsgRegisterChainResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgRegisterChainResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgRegisterConsumerResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgRegisterChainResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgRegisterConsumerResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -575,7 +575,7 @@ func (m *MsgUpdateParamsResponse) Size() (n int) { return n } -func (m *MsgRegisterChain) Size() (n int) { +func (m *MsgRegisterConsumer) Size() (n int) { if m == nil { return 0 } @@ -585,22 +585,22 @@ func (m *MsgRegisterChain) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } - l = len(m.ChainId) + l = len(m.ConsumerId) if l > 0 { n += 1 + l + sovTx(uint64(l)) } - l = len(m.ChainName) + l = len(m.ConsumerName) if l > 0 { n += 1 + l + sovTx(uint64(l)) } - l = len(m.ChainDescription) + l = len(m.ConsumerDescription) if l > 0 { n += 1 + l + sovTx(uint64(l)) } return n } -func (m *MsgRegisterChainResponse) Size() (n int) { +func (m *MsgRegisterConsumerResponse) Size() (n int) { if m == nil { return 0 } @@ -780,7 +780,7 @@ func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgRegisterChain) Unmarshal(dAtA []byte) error { +func (m *MsgRegisterConsumer) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -803,10 +803,10 @@ func (m *MsgRegisterChain) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgRegisterChain: wiretype end group for non-group") + return fmt.Errorf("proto: MsgRegisterConsumer: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRegisterChain: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgRegisterConsumer: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -843,7 +843,7 @@ func (m *MsgRegisterChain) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -871,11 +871,11 @@ func (m *MsgRegisterChain) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainId = string(dAtA[iNdEx:postIndex]) + m.ConsumerId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -903,11 +903,11 @@ func (m *MsgRegisterChain) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainName = string(dAtA[iNdEx:postIndex]) + m.ConsumerName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainDescription", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerDescription", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -935,7 +935,7 @@ func (m *MsgRegisterChain) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ChainDescription = string(dAtA[iNdEx:postIndex]) + m.ConsumerDescription = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -958,7 +958,7 @@ func (m *MsgRegisterChain) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgRegisterChainResponse) Unmarshal(dAtA []byte) error { +func (m *MsgRegisterConsumerResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -981,10 +981,10 @@ func (m *MsgRegisterChainResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgRegisterChainResponse: wiretype end group for non-group") + return fmt.Errorf("proto: MsgRegisterConsumerResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRegisterChainResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgRegisterConsumerResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: From 038943a4a3a28a6f643ff09380c5a50bf2760d7e Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Tue, 30 Apr 2024 16:12:53 +0800 Subject: [PATCH 20/85] btcstkconsumer: separate IBC packet for provider / consumer (#237) --- proto/babylon/btcstaking/v1/packet.proto | 58 +- x/btcstaking/types/packet.pb.go | 846 +++++++++++++---------- 2 files changed, 514 insertions(+), 390 deletions(-) diff --git a/proto/babylon/btcstaking/v1/packet.proto b/proto/babylon/btcstaking/v1/packet.proto index fe0830097..cf09c93fa 100644 --- a/proto/babylon/btcstaking/v1/packet.proto +++ b/proto/babylon/btcstaking/v1/packet.proto @@ -8,20 +8,35 @@ import "babylon/btcstaking/v1/btcstaking.proto"; option go_package = "github.com/babylonchain/babylon/x/btcstaking/types"; -// BTCStakingIBCPacket is an IBC packet carrying a set of events related -// to BTC staking for a particular consumer chain +// ConsumerIBCPacket is an IBC packet sent from consumer to Babylon +// upon a finality provider being slashed on the consumer +message ConsumerIBCPacket { + repeated SlashedFinalityProvider slashed_fp = 1; +} + +// SlashedFinalityProvider carries a slashed finality provider on a consumer +message SlashedFinalityProvider { + // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider + // the PK follows encoding in BIP-340 spec in hex format + string btc_pk_hex = 1; + // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing + // this allows the consumer to verify the BTC delegation is indeed slashed + string recovered_fp_btc_sk = 2; +} + +// BTCStakingIBCPacket is an IBC packet sent from Babylon to a consumer +// It carries a set of events related to BTC staking for a given consumer // It will be constructed and sent upon `EndBlock` of ZoneConcierge -// (if there are any BTC staking events for a consumer chain) +// (if there are any BTC staking events for a consumer) message BTCStakingIBCPacket { repeated NewFinalityProvider new_fp = 1; - repeated SlashedFinalityProvider slashed_fp = 2; - repeated ActiveBTCDelegation active_del = 3; - repeated SlashedBTCDelegation slashed_del = 4; - repeated UnbondedBTCDelegation unbonded_del = 5; + repeated ActiveBTCDelegation active_del = 2; + repeated SlashedBTCDelegation slashed_del = 3; + repeated UnbondedBTCDelegation unbonded_del = 4; } -// NewFinalityProvider is an IBC packet sent from Babylon to consumer chain -// upon a newly registered finality provider on this consumer chain +// NewFinalityProvider is an IBC packet sent from Babylon to consumer +// upon a newly registered finality provider on this consumer message NewFinalityProvider { // description defines the description terms for the finality provider. cosmos.staking.v1beta1.Description description = 1; @@ -49,22 +64,11 @@ message NewFinalityProvider { // if it's 0 then the finality provider is not slashed uint64 slashed_btc_height = 9; // consumer_id is the ID of the consumer the finality provider is operating on. - // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. + // If it's missing / empty, it's assumed the finality provider is operating in Babylon. string consumer_id = 10; } -// SlashedFinalityProvider is an IBC packet sent from consumer chain to Babylon -// upon a finality provider is slashed on the consumer chain -message SlashedFinalityProvider { - // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider - // the PK follows encoding in BIP-340 spec in hex format - string btc_pk_hex = 1; - // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing - // this allows the consumer chain to verify the BTC delegation is indeed slashed - string recovered_fp_btc_sk = 2; -} - -// ActiveBTCDelegation is an IBC packet sent from Babylon to consumer chain +// ActiveBTCDelegation is an IBC packet sent from Babylon to consumer // upon a BTC delegation newly receives covenant signatures and thus becomes active message ActiveBTCDelegation { // btc_pk_hex is the Bitcoin secp256k1 PK of this BTC delegation @@ -132,19 +136,19 @@ message BTCUndelegationInfo { repeated CovenantAdaptorSignatures covenant_slashing_sigs = 6; } -// SlashedBTCDelegation is an IBC packet sent from Babylon to consumer chain -// about a slashed BTC delegation restaked to >=1 of this consumer chain's +// SlashedBTCDelegation is an IBC packet sent from Babylon to consumer +// about a slashed BTC delegation restaked to >=1 of this consumer's // finality provider message SlashedBTCDelegation { // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation string staking_tx_hash = 1; // recovered_fp_btc_sk is the extracted BTC SK of the finality provider on - // this consumer chain - // this allows the consumer chain to verify the BTC delegation is indeed slashed + // this consumer + // this allows the consumer to verify the BTC delegation is indeed slashed string recovered_fp_btc_sk = 2; } -// UnbondedBTCDelegation is an IBC packet sent from Babylon to consumer chain +// UnbondedBTCDelegation is an IBC packet sent from Babylon to consumer // upon an early unbonded BTC delegation message UnbondedBTCDelegation { // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation diff --git a/x/btcstaking/types/packet.pb.go b/x/btcstaking/types/packet.pb.go index 562c8a30d..0b5873476 100644 --- a/x/btcstaking/types/packet.pb.go +++ b/x/btcstaking/types/packet.pb.go @@ -24,23 +24,125 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// BTCStakingIBCPacket is an IBC packet carrying a set of events related -// to BTC staking for a particular consumer chain +// ConsumerIBCPacket is an IBC packet sent from consumer to Babylon +// upon a finality provider being slashed on the consumer +type ConsumerIBCPacket struct { + SlashedFp []*SlashedFinalityProvider `protobuf:"bytes,1,rep,name=slashed_fp,json=slashedFp,proto3" json:"slashed_fp,omitempty"` +} + +func (m *ConsumerIBCPacket) Reset() { *m = ConsumerIBCPacket{} } +func (m *ConsumerIBCPacket) String() string { return proto.CompactTextString(m) } +func (*ConsumerIBCPacket) ProtoMessage() {} +func (*ConsumerIBCPacket) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{0} +} +func (m *ConsumerIBCPacket) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ConsumerIBCPacket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ConsumerIBCPacket.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 *ConsumerIBCPacket) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConsumerIBCPacket.Merge(m, src) +} +func (m *ConsumerIBCPacket) XXX_Size() int { + return m.Size() +} +func (m *ConsumerIBCPacket) XXX_DiscardUnknown() { + xxx_messageInfo_ConsumerIBCPacket.DiscardUnknown(m) +} + +var xxx_messageInfo_ConsumerIBCPacket proto.InternalMessageInfo + +func (m *ConsumerIBCPacket) GetSlashedFp() []*SlashedFinalityProvider { + if m != nil { + return m.SlashedFp + } + return nil +} + +// SlashedFinalityProvider carries a slashed finality provider on a consumer +type SlashedFinalityProvider struct { + // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider + // the PK follows encoding in BIP-340 spec in hex format + BtcPkHex string `protobuf:"bytes,1,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` + // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing + // this allows the consumer to verify the BTC delegation is indeed slashed + RecoveredFpBtcSk string `protobuf:"bytes,2,opt,name=recovered_fp_btc_sk,json=recoveredFpBtcSk,proto3" json:"recovered_fp_btc_sk,omitempty"` +} + +func (m *SlashedFinalityProvider) Reset() { *m = SlashedFinalityProvider{} } +func (m *SlashedFinalityProvider) String() string { return proto.CompactTextString(m) } +func (*SlashedFinalityProvider) ProtoMessage() {} +func (*SlashedFinalityProvider) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{1} +} +func (m *SlashedFinalityProvider) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SlashedFinalityProvider) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SlashedFinalityProvider.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 *SlashedFinalityProvider) XXX_Merge(src proto.Message) { + xxx_messageInfo_SlashedFinalityProvider.Merge(m, src) +} +func (m *SlashedFinalityProvider) XXX_Size() int { + return m.Size() +} +func (m *SlashedFinalityProvider) XXX_DiscardUnknown() { + xxx_messageInfo_SlashedFinalityProvider.DiscardUnknown(m) +} + +var xxx_messageInfo_SlashedFinalityProvider proto.InternalMessageInfo + +func (m *SlashedFinalityProvider) GetBtcPkHex() string { + if m != nil { + return m.BtcPkHex + } + return "" +} + +func (m *SlashedFinalityProvider) GetRecoveredFpBtcSk() string { + if m != nil { + return m.RecoveredFpBtcSk + } + return "" +} + +// BTCStakingIBCPacket is an IBC packet sent from Babylon to a consumer +// It carries a set of events related to BTC staking for a given consumer // It will be constructed and sent upon `EndBlock` of ZoneConcierge -// (if there are any BTC staking events for a consumer chain) +// (if there are any BTC staking events for a consumer) type BTCStakingIBCPacket struct { - NewFp []*NewFinalityProvider `protobuf:"bytes,1,rep,name=new_fp,json=newFp,proto3" json:"new_fp,omitempty"` - SlashedFp []*SlashedFinalityProvider `protobuf:"bytes,2,rep,name=slashed_fp,json=slashedFp,proto3" json:"slashed_fp,omitempty"` - ActiveDel []*ActiveBTCDelegation `protobuf:"bytes,3,rep,name=active_del,json=activeDel,proto3" json:"active_del,omitempty"` - SlashedDel []*SlashedBTCDelegation `protobuf:"bytes,4,rep,name=slashed_del,json=slashedDel,proto3" json:"slashed_del,omitempty"` - UnbondedDel []*UnbondedBTCDelegation `protobuf:"bytes,5,rep,name=unbonded_del,json=unbondedDel,proto3" json:"unbonded_del,omitempty"` + NewFp []*NewFinalityProvider `protobuf:"bytes,1,rep,name=new_fp,json=newFp,proto3" json:"new_fp,omitempty"` + ActiveDel []*ActiveBTCDelegation `protobuf:"bytes,2,rep,name=active_del,json=activeDel,proto3" json:"active_del,omitempty"` + SlashedDel []*SlashedBTCDelegation `protobuf:"bytes,3,rep,name=slashed_del,json=slashedDel,proto3" json:"slashed_del,omitempty"` + UnbondedDel []*UnbondedBTCDelegation `protobuf:"bytes,4,rep,name=unbonded_del,json=unbondedDel,proto3" json:"unbonded_del,omitempty"` } func (m *BTCStakingIBCPacket) Reset() { *m = BTCStakingIBCPacket{} } func (m *BTCStakingIBCPacket) String() string { return proto.CompactTextString(m) } func (*BTCStakingIBCPacket) ProtoMessage() {} func (*BTCStakingIBCPacket) Descriptor() ([]byte, []int) { - return fileDescriptor_3ed0d17ad14d6c0e, []int{0} + return fileDescriptor_3ed0d17ad14d6c0e, []int{2} } func (m *BTCStakingIBCPacket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -76,13 +178,6 @@ func (m *BTCStakingIBCPacket) GetNewFp() []*NewFinalityProvider { return nil } -func (m *BTCStakingIBCPacket) GetSlashedFp() []*SlashedFinalityProvider { - if m != nil { - return m.SlashedFp - } - return nil -} - func (m *BTCStakingIBCPacket) GetActiveDel() []*ActiveBTCDelegation { if m != nil { return m.ActiveDel @@ -104,8 +199,8 @@ func (m *BTCStakingIBCPacket) GetUnbondedDel() []*UnbondedBTCDelegation { return nil } -// NewFinalityProvider is an IBC packet sent from Babylon to consumer chain -// upon a newly registered finality provider on this consumer chain +// NewFinalityProvider is an IBC packet sent from Babylon to consumer +// upon a newly registered finality provider on this consumer type NewFinalityProvider struct { // description defines the description terms for the finality provider. Description *types.Description `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` @@ -133,7 +228,7 @@ type NewFinalityProvider struct { // if it's 0 then the finality provider is not slashed SlashedBtcHeight uint64 `protobuf:"varint,9,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` // consumer_id is the ID of the consumer the finality provider is operating on. - // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. + // If it's missing / empty, it's assumed the finality provider is operating in Babylon. ConsumerId string `protobuf:"bytes,10,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` } @@ -141,7 +236,7 @@ func (m *NewFinalityProvider) Reset() { *m = NewFinalityProvider{} } func (m *NewFinalityProvider) String() string { return proto.CompactTextString(m) } func (*NewFinalityProvider) ProtoMessage() {} func (*NewFinalityProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_3ed0d17ad14d6c0e, []int{1} + return fileDescriptor_3ed0d17ad14d6c0e, []int{3} } func (m *NewFinalityProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -240,65 +335,7 @@ func (m *NewFinalityProvider) GetConsumerId() string { return "" } -// SlashedFinalityProvider is an IBC packet sent from consumer chain to Babylon -// upon a finality provider is slashed on the consumer chain -type SlashedFinalityProvider struct { - // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider - // the PK follows encoding in BIP-340 spec in hex format - BtcPkHex string `protobuf:"bytes,1,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` - // recovered_fp_btc_sk is the finality provider's BTC SK extracted due to slashing - // this allows the consumer chain to verify the BTC delegation is indeed slashed - RecoveredFpBtcSk string `protobuf:"bytes,2,opt,name=recovered_fp_btc_sk,json=recoveredFpBtcSk,proto3" json:"recovered_fp_btc_sk,omitempty"` -} - -func (m *SlashedFinalityProvider) Reset() { *m = SlashedFinalityProvider{} } -func (m *SlashedFinalityProvider) String() string { return proto.CompactTextString(m) } -func (*SlashedFinalityProvider) ProtoMessage() {} -func (*SlashedFinalityProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_3ed0d17ad14d6c0e, []int{2} -} -func (m *SlashedFinalityProvider) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SlashedFinalityProvider) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SlashedFinalityProvider.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 *SlashedFinalityProvider) XXX_Merge(src proto.Message) { - xxx_messageInfo_SlashedFinalityProvider.Merge(m, src) -} -func (m *SlashedFinalityProvider) XXX_Size() int { - return m.Size() -} -func (m *SlashedFinalityProvider) XXX_DiscardUnknown() { - xxx_messageInfo_SlashedFinalityProvider.DiscardUnknown(m) -} - -var xxx_messageInfo_SlashedFinalityProvider proto.InternalMessageInfo - -func (m *SlashedFinalityProvider) GetBtcPkHex() string { - if m != nil { - return m.BtcPkHex - } - return "" -} - -func (m *SlashedFinalityProvider) GetRecoveredFpBtcSk() string { - if m != nil { - return m.RecoveredFpBtcSk - } - return "" -} - -// ActiveBTCDelegation is an IBC packet sent from Babylon to consumer chain +// ActiveBTCDelegation is an IBC packet sent from Babylon to consumer // upon a BTC delegation newly receives covenant signatures and thus becomes active type ActiveBTCDelegation struct { // btc_pk_hex is the Bitcoin secp256k1 PK of this BTC delegation @@ -343,7 +380,7 @@ func (m *ActiveBTCDelegation) Reset() { *m = ActiveBTCDelegation{} } func (m *ActiveBTCDelegation) String() string { return proto.CompactTextString(m) } func (*ActiveBTCDelegation) ProtoMessage() {} func (*ActiveBTCDelegation) Descriptor() ([]byte, []int) { - return fileDescriptor_3ed0d17ad14d6c0e, []int{3} + return fileDescriptor_3ed0d17ad14d6c0e, []int{4} } func (m *ActiveBTCDelegation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -494,7 +531,7 @@ func (m *BTCUndelegationInfo) Reset() { *m = BTCUndelegationInfo{} } func (m *BTCUndelegationInfo) String() string { return proto.CompactTextString(m) } func (*BTCUndelegationInfo) ProtoMessage() {} func (*BTCUndelegationInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_3ed0d17ad14d6c0e, []int{4} + return fileDescriptor_3ed0d17ad14d6c0e, []int{5} } func (m *BTCUndelegationInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -565,15 +602,15 @@ func (m *BTCUndelegationInfo) GetCovenantSlashingSigs() []*CovenantAdaptorSignat return nil } -// SlashedBTCDelegation is an IBC packet sent from Babylon to consumer chain -// about a slashed BTC delegation restaked to >=1 of this consumer chain's +// SlashedBTCDelegation is an IBC packet sent from Babylon to consumer +// about a slashed BTC delegation restaked to >=1 of this consumer's // finality provider type SlashedBTCDelegation struct { // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation StakingTxHash string `protobuf:"bytes,1,opt,name=staking_tx_hash,json=stakingTxHash,proto3" json:"staking_tx_hash,omitempty"` // recovered_fp_btc_sk is the extracted BTC SK of the finality provider on - // this consumer chain - // this allows the consumer chain to verify the BTC delegation is indeed slashed + // this consumer + // this allows the consumer to verify the BTC delegation is indeed slashed RecoveredFpBtcSk string `protobuf:"bytes,2,opt,name=recovered_fp_btc_sk,json=recoveredFpBtcSk,proto3" json:"recovered_fp_btc_sk,omitempty"` } @@ -581,7 +618,7 @@ func (m *SlashedBTCDelegation) Reset() { *m = SlashedBTCDelegation{} } func (m *SlashedBTCDelegation) String() string { return proto.CompactTextString(m) } func (*SlashedBTCDelegation) ProtoMessage() {} func (*SlashedBTCDelegation) Descriptor() ([]byte, []int) { - return fileDescriptor_3ed0d17ad14d6c0e, []int{5} + return fileDescriptor_3ed0d17ad14d6c0e, []int{6} } func (m *SlashedBTCDelegation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -624,7 +661,7 @@ func (m *SlashedBTCDelegation) GetRecoveredFpBtcSk() string { return "" } -// UnbondedBTCDelegation is an IBC packet sent from Babylon to consumer chain +// UnbondedBTCDelegation is an IBC packet sent from Babylon to consumer // upon an early unbonded BTC delegation type UnbondedBTCDelegation struct { // staking tx hash of the BTC delegation. It uniquely identifies a BTC delegation @@ -638,7 +675,7 @@ func (m *UnbondedBTCDelegation) Reset() { *m = UnbondedBTCDelegation{} } func (m *UnbondedBTCDelegation) String() string { return proto.CompactTextString(m) } func (*UnbondedBTCDelegation) ProtoMessage() {} func (*UnbondedBTCDelegation) Descriptor() ([]byte, []int) { - return fileDescriptor_3ed0d17ad14d6c0e, []int{6} + return fileDescriptor_3ed0d17ad14d6c0e, []int{7} } func (m *UnbondedBTCDelegation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -682,9 +719,10 @@ func (m *UnbondedBTCDelegation) GetUnbondingTxSig() []byte { } func init() { + proto.RegisterType((*ConsumerIBCPacket)(nil), "babylon.btcstaking.v1.ConsumerIBCPacket") + proto.RegisterType((*SlashedFinalityProvider)(nil), "babylon.btcstaking.v1.SlashedFinalityProvider") proto.RegisterType((*BTCStakingIBCPacket)(nil), "babylon.btcstaking.v1.BTCStakingIBCPacket") proto.RegisterType((*NewFinalityProvider)(nil), "babylon.btcstaking.v1.NewFinalityProvider") - proto.RegisterType((*SlashedFinalityProvider)(nil), "babylon.btcstaking.v1.SlashedFinalityProvider") proto.RegisterType((*ActiveBTCDelegation)(nil), "babylon.btcstaking.v1.ActiveBTCDelegation") proto.RegisterType((*BTCUndelegationInfo)(nil), "babylon.btcstaking.v1.BTCUndelegationInfo") proto.RegisterType((*SlashedBTCDelegation)(nil), "babylon.btcstaking.v1.SlashedBTCDelegation") @@ -696,74 +734,148 @@ func init() { } var fileDescriptor_3ed0d17ad14d6c0e = []byte{ - // 1064 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x6e, 0xe3, 0x44, - 0x14, 0x6e, 0x9a, 0xb4, 0xdb, 0x9c, 0x24, 0x6d, 0x70, 0xdb, 0x5d, 0x6b, 0x17, 0xd2, 0x92, 0x5d, - 0x56, 0x05, 0x16, 0x87, 0x16, 0xd8, 0x3b, 0x90, 0x9a, 0x74, 0xab, 0x56, 0x14, 0x1a, 0x39, 0x29, - 0x48, 0xdc, 0x58, 0x63, 0x7b, 0x92, 0x8c, 0x9c, 0x78, 0x46, 0x9e, 0x71, 0x9a, 0xbc, 0x05, 0x48, - 0x3c, 0x14, 0x97, 0x7b, 0x09, 0x77, 0xa8, 0x7d, 0x02, 0xde, 0x00, 0x79, 0x3c, 0xfe, 0x69, 0x49, - 0x0a, 0xcb, 0x65, 0xce, 0xf9, 0xce, 0x77, 0xfe, 0xbe, 0x33, 0x0e, 0x34, 0x6d, 0x64, 0xcf, 0xc7, - 0xd4, 0x6f, 0xd9, 0xc2, 0xe1, 0x02, 0x79, 0xc4, 0x1f, 0xb6, 0xa6, 0x87, 0x2d, 0x86, 0x1c, 0x0f, - 0x0b, 0x83, 0x05, 0x54, 0x50, 0x6d, 0x57, 0x61, 0x8c, 0x0c, 0x63, 0x4c, 0x0f, 0x9f, 0x36, 0x1d, - 0xca, 0x27, 0x94, 0xb7, 0x9c, 0x60, 0xce, 0x04, 0x6d, 0x71, 0xec, 0xb0, 0xa3, 0xaf, 0x5e, 0x7b, - 0x87, 0x2d, 0x0f, 0xcf, 0x79, 0x1c, 0xfa, 0xf4, 0x85, 0xc2, 0x64, 0xd4, 0x36, 0x16, 0xe8, 0x30, - 0xf9, 0xad, 0x50, 0x7b, 0x4b, 0x8a, 0xa0, 0x4c, 0x01, 0x5e, 0x2e, 0x06, 0xe4, 0xea, 0x91, 0xb8, - 0xe6, 0x2f, 0x45, 0xd8, 0x6e, 0xf7, 0x3b, 0xbd, 0xd8, 0x78, 0xde, 0xee, 0x74, 0x65, 0x1f, 0xda, - 0x31, 0xac, 0xfb, 0xf8, 0xda, 0x1a, 0x30, 0xbd, 0xb0, 0x5f, 0x3c, 0xa8, 0x1c, 0x7d, 0x62, 0x2c, - 0x6c, 0xc9, 0xf8, 0x1e, 0x5f, 0x9f, 0x12, 0x1f, 0x8d, 0x89, 0x98, 0x77, 0x03, 0x3a, 0x25, 0x2e, - 0x0e, 0xcc, 0x35, 0x1f, 0x5f, 0x9f, 0x32, 0xed, 0x3b, 0x00, 0x3e, 0x46, 0x7c, 0x84, 0xdd, 0x88, - 0x66, 0x55, 0xd2, 0x18, 0x4b, 0x68, 0x7a, 0x31, 0xf0, 0x1f, 0x54, 0x65, 0xc5, 0x70, 0xca, 0xb4, - 0x73, 0x00, 0xe4, 0x08, 0x32, 0xc5, 0x96, 0x8b, 0xc7, 0x7a, 0xf1, 0xc1, 0xaa, 0x8e, 0x25, 0xb0, - 0xdd, 0xef, 0x9c, 0xe0, 0x31, 0x1e, 0x22, 0x41, 0xa8, 0x6f, 0x96, 0xe3, 0xe8, 0x13, 0x3c, 0xd6, - 0x2e, 0xa0, 0x92, 0x54, 0x16, 0x71, 0x95, 0x24, 0xd7, 0xa7, 0x0f, 0x97, 0x76, 0x97, 0x2c, 0xe9, - 0x2c, 0x62, 0xbb, 0x84, 0x6a, 0xe8, 0xdb, 0xd4, 0x77, 0x15, 0xdd, 0x9a, 0xa4, 0x7b, 0xb5, 0x84, - 0xee, 0x4a, 0x41, 0xef, 0xf2, 0x55, 0x12, 0x86, 0x13, 0x3c, 0x6e, 0xfe, 0x55, 0x84, 0xed, 0x05, - 0x73, 0xd5, 0xde, 0x40, 0xc5, 0xc5, 0xdc, 0x09, 0x08, 0x8b, 0x62, 0xf4, 0xc2, 0x7e, 0xe1, 0xa0, - 0x72, 0xf4, 0xdc, 0x88, 0x05, 0x63, 0x64, 0x39, 0xa4, 0x60, 0x8c, 0x93, 0x0c, 0x6a, 0xe6, 0xe3, - 0xb4, 0x06, 0x80, 0x43, 0x27, 0x13, 0xc2, 0x79, 0xc4, 0xb2, 0xba, 0x5f, 0x38, 0x28, 0x9b, 0x39, - 0x8b, 0xf6, 0x0d, 0x80, 0x2a, 0xdd, 0x62, 0x9e, 0x5e, 0x94, 0x59, 0xf6, 0x92, 0x2c, 0xb1, 0x74, - 0x8d, 0x54, 0xba, 0x46, 0x37, 0xb4, 0xbf, 0xc5, 0x73, 0xb3, 0xac, 0x42, 0xba, 0x9e, 0xf6, 0x3e, - 0x80, 0x2d, 0x1c, 0x8b, 0x79, 0xd6, 0x08, 0xcf, 0xf4, 0x92, 0xe4, 0xdf, 0xb0, 0x85, 0xd3, 0xf5, - 0xce, 0xf0, 0x4c, 0xfb, 0x1a, 0x8a, 0x8c, 0x32, 0x7d, 0x4d, 0xd2, 0x2e, 0x9b, 0x79, 0x37, 0xa0, - 0x74, 0x70, 0x39, 0xe8, 0x52, 0xce, 0xb1, 0x2c, 0xaa, 0xdd, 0xef, 0x98, 0x51, 0x9c, 0xf6, 0x12, - 0xb6, 0x26, 0x88, 0x0b, 0x1c, 0x58, 0x2c, 0xb4, 0xad, 0x00, 0xf9, 0xae, 0xbe, 0x2e, 0x33, 0xd4, - 0x62, 0x73, 0x37, 0xb4, 0x4d, 0xe4, 0xbb, 0xda, 0xc7, 0x50, 0x0f, 0xf0, 0x90, 0x44, 0x26, 0xec, - 0x5a, 0x98, 0x51, 0x67, 0xa4, 0x3f, 0xda, 0x2f, 0x1c, 0x94, 0xcc, 0xad, 0xcc, 0xfe, 0x26, 0x32, - 0x6b, 0x5f, 0xc2, 0xe3, 0x44, 0x0d, 0x49, 0xdf, 0x23, 0x4c, 0x86, 0x23, 0xa1, 0x6f, 0xc8, 0x80, - 0x1d, 0xe5, 0x6d, 0xc7, 0xce, 0x33, 0xe9, 0xd3, 0x5e, 0x81, 0x96, 0x46, 0x09, 0x27, 0x89, 0x28, - 0xcb, 0x88, 0x7a, 0x12, 0x21, 0x1c, 0x85, 0xde, 0x83, 0x8a, 0x43, 0x7d, 0x1e, 0x4e, 0x70, 0x60, - 0x11, 0x57, 0x87, 0x64, 0xe8, 0xb1, 0xe9, 0xdc, 0x6d, 0x0e, 0xe0, 0xc9, 0x92, 0x1b, 0xb8, 0x37, - 0xcf, 0xc2, 0xbd, 0x79, 0x7e, 0x06, 0xdb, 0x01, 0x76, 0xe8, 0x54, 0xf6, 0x39, 0x60, 0xb2, 0x18, - 0xee, 0xa9, 0xb5, 0xd6, 0x53, 0xd7, 0x29, 0x6b, 0x0b, 0xa7, 0xe7, 0x35, 0xff, 0x28, 0xc1, 0xf6, - 0x82, 0xeb, 0xf8, 0x97, 0x24, 0xcf, 0x61, 0x53, 0x51, 0x33, 0xcf, 0x1a, 0x13, 0x2e, 0xe4, 0x39, - 0x97, 0xcd, 0xca, 0x20, 0xa2, 0xed, 0x7a, 0x17, 0x84, 0x0b, 0xed, 0x43, 0xa8, 0x72, 0x81, 0x02, - 0x91, 0xcc, 0xa2, 0x28, 0x67, 0x51, 0x91, 0x36, 0x35, 0x86, 0x0f, 0x00, 0xb0, 0xef, 0x26, 0x80, - 0x92, 0x04, 0x94, 0xb1, 0xef, 0x2a, 0xf7, 0x33, 0x28, 0x0b, 0x2a, 0xd0, 0xd8, 0xe2, 0x48, 0x48, - 0x85, 0x94, 0xcc, 0x0d, 0x69, 0xe8, 0x21, 0x19, 0xab, 0x14, 0x62, 0x89, 0x99, 0x5c, 0x7a, 0xd5, - 0x2c, 0x2b, 0x4b, 0x7f, 0x16, 0x4d, 0x58, 0x4e, 0x5d, 0xf9, 0x1f, 0x49, 0x3f, 0x24, 0xa6, 0xfe, - 0x2c, 0x5a, 0xb3, 0x1b, 0xf7, 0x4b, 0x03, 0x2b, 0x85, 0x72, 0x32, 0x94, 0x6b, 0xae, 0x9a, 0x3b, - 0xa9, 0xb7, 0xa7, 0x9c, 0x3d, 0x32, 0xd4, 0xae, 0xa0, 0x16, 0x4d, 0xd0, 0x47, 0xbe, 0x88, 0xb0, - 0x5c, 0x2f, 0xcb, 0xeb, 0xfe, 0x7c, 0x89, 0x70, 0x3b, 0x0a, 0x7b, 0xec, 0x22, 0x16, 0x31, 0x91, - 0xa1, 0x8f, 0x44, 0x18, 0x60, 0x6e, 0x56, 0x13, 0x9a, 0x1e, 0x19, 0x72, 0xa9, 0x1e, 0xd5, 0x0c, - 0x0d, 0x05, 0x0b, 0x85, 0x45, 0xdc, 0x99, 0x94, 0x45, 0xcd, 0xac, 0x2b, 0xcf, 0xa5, 0x74, 0x9c, - 0xbb, 0x33, 0xed, 0x23, 0xd8, 0x8c, 0xdf, 0x07, 0xd9, 0x1c, 0x99, 0x60, 0xbd, 0x26, 0x91, 0xb5, - 0xd4, 0xda, 0x27, 0x13, 0xac, 0xfd, 0x08, 0xef, 0x85, 0xbe, 0x9b, 0xee, 0xd4, 0x22, 0xfe, 0x80, - 0xea, 0x9b, 0xf2, 0xd0, 0x96, 0x3d, 0x94, 0xed, 0x7e, 0xe7, 0x2a, 0x17, 0x72, 0xee, 0x0f, 0xa8, - 0x59, 0x0f, 0xef, 0x59, 0xa2, 0xfc, 0x0c, 0x05, 0x68, 0xc2, 0xad, 0x29, 0x0e, 0xe4, 0xab, 0xb1, - 0x15, 0xe7, 0x8f, 0xad, 0x3f, 0xc4, 0xc6, 0xe6, 0xaf, 0xf1, 0xb7, 0xe4, 0x3e, 0x61, 0x24, 0x8c, - 0x5c, 0xf9, 0xb1, 0xba, 0xaa, 0xc9, 0x93, 0x17, 0x2f, 0xe7, 0x35, 0x3c, 0xc9, 0x96, 0x93, 0x81, - 0xa3, 0xed, 0xac, 0x4a, 0xf4, 0x6e, 0xea, 0xbe, 0x4a, 0xbc, 0xd1, 0x7a, 0x1c, 0x78, 0x96, 0xae, - 0xe7, 0x4e, 0x58, 0xac, 0xd2, 0xf8, 0x2b, 0xf1, 0x62, 0xd9, 0xcb, 0x9e, 0x6c, 0x47, 0xb6, 0xad, - 0x27, 0x44, 0xf9, 0x04, 0x52, 0xd8, 0xf7, 0xa4, 0x55, 0x7a, 0x07, 0x69, 0xad, 0x3d, 0x20, 0xad, - 0x01, 0x3c, 0xce, 0xa4, 0x95, 0x0b, 0xe2, 0xfa, 0xfa, 0xff, 0xd4, 0xd8, 0x4e, 0xaa, 0xb1, 0x2c, - 0x0d, 0x6f, 0x4e, 0x60, 0x67, 0xd1, 0x37, 0x2c, 0x7a, 0x4a, 0xb3, 0x83, 0xb2, 0x46, 0x88, 0x8f, - 0xd4, 0xdd, 0xd7, 0xd2, 0xab, 0x3a, 0x43, 0x7c, 0xf4, 0xae, 0x2f, 0x0c, 0x81, 0xdd, 0x85, 0xdf, - 0xb8, 0xff, 0x9c, 0xef, 0x00, 0xea, 0x79, 0xb9, 0xe4, 0x44, 0xb0, 0x99, 0x93, 0x4c, 0x8f, 0x0c, - 0xdb, 0x17, 0xbf, 0xdd, 0x34, 0x0a, 0x6f, 0x6f, 0x1a, 0x85, 0x3f, 0x6f, 0x1a, 0x85, 0x9f, 0x6f, - 0x1b, 0x2b, 0x6f, 0x6f, 0x1b, 0x2b, 0xbf, 0xdf, 0x36, 0x56, 0x7e, 0x3a, 0x1a, 0x12, 0x31, 0x0a, - 0x6d, 0xc3, 0xa1, 0x93, 0x96, 0x9a, 0xa2, 0x33, 0x42, 0xc4, 0x4f, 0x7e, 0xb4, 0x66, 0xf9, 0x3f, - 0x46, 0x62, 0xce, 0x30, 0xb7, 0xd7, 0xe5, 0x3f, 0xa2, 0x2f, 0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, - 0x77, 0x8b, 0x8b, 0xe5, 0xe1, 0x09, 0x00, 0x00, + // 1072 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcd, 0x72, 0xe3, 0x44, + 0x17, 0x8d, 0x63, 0x27, 0x13, 0x5f, 0xdb, 0x89, 0x47, 0x49, 0x66, 0x54, 0x33, 0xdf, 0xe7, 0x04, + 0xcf, 0x30, 0x15, 0x60, 0x90, 0x49, 0x80, 0xd9, 0x41, 0x55, 0xec, 0x4c, 0x2a, 0x29, 0x02, 0x71, + 0xc9, 0x0e, 0x54, 0xb1, 0x51, 0xb5, 0xa4, 0xb6, 0xdd, 0x25, 0x5b, 0xdd, 0xa5, 0x6e, 0x39, 0xf6, + 0x5b, 0xb0, 0xe0, 0x89, 0x58, 0xb1, 0x9c, 0x25, 0xec, 0xa8, 0xe4, 0x09, 0x78, 0x03, 0x4a, 0xad, + 0xd6, 0x4f, 0x82, 0x1d, 0x18, 0x96, 0xbe, 0xf7, 0xdc, 0x73, 0xff, 0xce, 0x6d, 0x19, 0x9a, 0x36, + 0xb2, 0xe7, 0x63, 0xea, 0xb7, 0x6c, 0xe1, 0x70, 0x81, 0x3c, 0xe2, 0x0f, 0x5b, 0xd3, 0xc3, 0x16, + 0x43, 0x8e, 0x87, 0x85, 0xc1, 0x02, 0x2a, 0xa8, 0xb6, 0xab, 0x30, 0x46, 0x86, 0x31, 0xa6, 0x87, + 0xcf, 0x9a, 0x0e, 0xe5, 0x13, 0xca, 0x5b, 0x4e, 0x30, 0x67, 0x82, 0xb6, 0x38, 0x76, 0xd8, 0xd1, + 0x97, 0x6f, 0xbc, 0xc3, 0x96, 0x87, 0xe7, 0x3c, 0x0e, 0x7d, 0xf6, 0x52, 0x61, 0x32, 0x6a, 0x1b, + 0x0b, 0x74, 0x98, 0xfc, 0x56, 0xa8, 0xbd, 0x25, 0x45, 0x50, 0xa6, 0x00, 0xaf, 0x16, 0x03, 0x72, + 0xf5, 0x48, 0x5c, 0xd3, 0x86, 0xc7, 0x1d, 0xea, 0xf3, 0x70, 0x82, 0x83, 0xf3, 0x76, 0xa7, 0x2b, + 0x9b, 0xd0, 0xbe, 0x05, 0xe0, 0x63, 0xc4, 0x47, 0xd8, 0xb5, 0x06, 0x4c, 0x2f, 0xec, 0x17, 0x0f, + 0x2a, 0x47, 0x86, 0xb1, 0xb0, 0x27, 0xa3, 0x17, 0x03, 0x4f, 0x89, 0x8f, 0xc6, 0x44, 0xcc, 0xbb, + 0x01, 0x9d, 0x12, 0x17, 0x07, 0x66, 0x59, 0x31, 0x9c, 0xb2, 0xe6, 0x00, 0x9e, 0x2e, 0x41, 0x69, + 0xff, 0x03, 0xb0, 0x85, 0x63, 0x31, 0xcf, 0x1a, 0xe1, 0x99, 0x5e, 0xd8, 0x2f, 0x1c, 0x94, 0xcd, + 0x0d, 0x5b, 0x38, 0x5d, 0xef, 0x0c, 0xcf, 0xb4, 0x4f, 0x61, 0x3b, 0xc0, 0x0e, 0x9d, 0xe2, 0x40, + 0x56, 0x62, 0x45, 0x50, 0xee, 0xe9, 0xab, 0x12, 0x56, 0x4f, 0x5d, 0xa7, 0xac, 0x2d, 0x9c, 0x9e, + 0xd7, 0xfc, 0x65, 0x15, 0xb6, 0xdb, 0xfd, 0x4e, 0x2f, 0x2e, 0x2e, 0x6b, 0xe7, 0x18, 0xd6, 0x7d, + 0x7c, 0x9d, 0xb5, 0xf2, 0xf1, 0x92, 0x56, 0xbe, 0xc3, 0xd7, 0x7f, 0x6b, 0x63, 0xcd, 0xc7, 0xd7, + 0xa7, 0x4c, 0x3b, 0x07, 0x40, 0x8e, 0x20, 0x53, 0x6c, 0xb9, 0x78, 0xac, 0xaf, 0x3e, 0x48, 0x73, + 0x2c, 0x81, 0xed, 0x7e, 0xe7, 0x04, 0x8f, 0xf1, 0x10, 0x09, 0x42, 0x7d, 0xb3, 0x1c, 0x47, 0x9f, + 0xe0, 0xb1, 0x76, 0x01, 0x95, 0x64, 0xb8, 0x11, 0x57, 0x51, 0x72, 0x7d, 0xf2, 0xf0, 0x74, 0xef, + 0x92, 0x25, 0xcb, 0x89, 0xd8, 0x2e, 0xa1, 0x1a, 0xfa, 0x36, 0xf5, 0x5d, 0x45, 0x57, 0x92, 0x74, + 0xaf, 0x97, 0xd0, 0x5d, 0x29, 0xe8, 0x5d, 0xbe, 0x4a, 0xc2, 0x70, 0x82, 0xc7, 0xcd, 0x3f, 0x8b, + 0xb0, 0xbd, 0x60, 0x10, 0xda, 0x5b, 0xa8, 0xb8, 0x98, 0x3b, 0x01, 0x61, 0x51, 0x8c, 0x5c, 0x55, + 0xe5, 0xe8, 0x85, 0x11, 0xab, 0xd5, 0xc8, 0x72, 0x48, 0xb5, 0x1a, 0x27, 0x19, 0xd4, 0xcc, 0xc7, + 0x69, 0x0d, 0x00, 0x87, 0x4e, 0x26, 0x84, 0xf3, 0x88, 0x25, 0xde, 0x64, 0xce, 0xa2, 0x7d, 0x0d, + 0xa0, 0x4a, 0xb7, 0x98, 0xa7, 0x17, 0x65, 0x96, 0xbd, 0x24, 0x4b, 0x7c, 0x37, 0x46, 0x7a, 0x37, + 0x46, 0x37, 0xb4, 0xbf, 0xc1, 0x73, 0xb3, 0xac, 0x42, 0xba, 0xde, 0x3d, 0x41, 0x95, 0xee, 0x09, + 0xea, 0x2b, 0x28, 0x32, 0xca, 0xf4, 0x35, 0x49, 0xbb, 0x6c, 0xe6, 0xdd, 0x80, 0xd2, 0xc1, 0xe5, + 0xa0, 0x4b, 0x39, 0xc7, 0xb2, 0xa8, 0x76, 0xbf, 0x63, 0x46, 0x71, 0xda, 0x2b, 0xd8, 0x9a, 0x20, + 0x2e, 0x70, 0x60, 0xb1, 0xd0, 0xb6, 0x02, 0xe4, 0xbb, 0xfa, 0xba, 0xcc, 0x50, 0x8b, 0xcd, 0xdd, + 0xd0, 0x36, 0x91, 0xef, 0x6a, 0x1f, 0x41, 0x3d, 0xc0, 0x43, 0x12, 0x99, 0xb0, 0x6b, 0x61, 0x46, + 0x9d, 0x91, 0xfe, 0x68, 0xbf, 0x70, 0x50, 0x32, 0xb7, 0x32, 0xfb, 0xdb, 0xc8, 0xac, 0x7d, 0x01, + 0x4f, 0x12, 0x35, 0x24, 0x7d, 0x8f, 0x30, 0x19, 0x8e, 0x84, 0xbe, 0x21, 0x03, 0x76, 0x94, 0xb7, + 0x1d, 0x3b, 0xcf, 0xa4, 0x4f, 0x7b, 0x0d, 0x5a, 0x1a, 0x25, 0x9c, 0x24, 0xa2, 0x2c, 0x23, 0xea, + 0x49, 0x84, 0x70, 0x14, 0x7a, 0x0f, 0x2a, 0x8e, 0xba, 0x71, 0x8b, 0xb8, 0x3a, 0x24, 0x43, 0x57, + 0x67, 0xef, 0x36, 0x7f, 0x2f, 0xc1, 0xf6, 0x02, 0xd5, 0xfe, 0xc3, 0x75, 0xbe, 0x80, 0x4d, 0x75, + 0x93, 0xcc, 0xb3, 0xc6, 0x84, 0x0b, 0x79, 0x17, 0x65, 0xb3, 0x32, 0x88, 0xee, 0xb1, 0xeb, 0x5d, + 0x10, 0x2e, 0xb4, 0x0f, 0xa0, 0xca, 0x05, 0x0a, 0x44, 0x52, 0x63, 0x51, 0xd6, 0x58, 0x91, 0x36, + 0x55, 0xde, 0xff, 0x01, 0xb0, 0xef, 0x26, 0x80, 0x92, 0x04, 0x94, 0xb1, 0xef, 0x2a, 0xf7, 0x73, + 0x28, 0x0b, 0x2a, 0xd0, 0xd8, 0xe2, 0x48, 0xc8, 0xcd, 0x95, 0xcc, 0x0d, 0x69, 0xe8, 0x21, 0x19, + 0xab, 0x36, 0x67, 0x89, 0x99, 0x5c, 0x46, 0xd5, 0x2c, 0x2b, 0x4b, 0x7f, 0x16, 0x75, 0x2e, 0xa7, + 0xa1, 0xfc, 0x8f, 0xa4, 0x1f, 0x12, 0x53, 0x7f, 0x16, 0x8d, 0xdf, 0x8d, 0xfb, 0xa5, 0x81, 0x95, + 0x42, 0x39, 0x19, 0xca, 0xf1, 0x57, 0xcd, 0x9d, 0xd4, 0xdb, 0x53, 0xce, 0x1e, 0x19, 0x6a, 0x57, + 0x50, 0x8b, 0x9e, 0x1e, 0x1f, 0xf9, 0x22, 0xc2, 0x72, 0xbd, 0x2c, 0xaf, 0xee, 0xb3, 0x25, 0x82, + 0xea, 0x28, 0xec, 0xb1, 0x8b, 0x58, 0xc4, 0x44, 0x86, 0x3e, 0x12, 0x61, 0x80, 0xb9, 0x59, 0x4d, + 0x68, 0x7a, 0x64, 0xc8, 0xe5, 0x56, 0x55, 0x33, 0x34, 0x14, 0x2c, 0x14, 0x16, 0x71, 0x67, 0x72, + 0x5d, 0x35, 0xb3, 0xae, 0x3c, 0x97, 0xd2, 0x71, 0xee, 0xce, 0xb4, 0x0f, 0x61, 0x33, 0xbe, 0x5b, + 0xd9, 0x1c, 0x99, 0x60, 0xbd, 0x26, 0x91, 0xb5, 0xd4, 0xda, 0x27, 0x13, 0xac, 0xfd, 0x00, 0x8f, + 0x43, 0xdf, 0x4d, 0x77, 0x6a, 0x11, 0x7f, 0x40, 0xf5, 0x4d, 0x79, 0x00, 0xcb, 0x1e, 0xb0, 0x76, + 0xbf, 0x73, 0x95, 0x0b, 0x39, 0xf7, 0x07, 0xd4, 0xac, 0x87, 0xf7, 0x2c, 0x51, 0x7e, 0x86, 0x02, + 0x34, 0xe1, 0xd6, 0x14, 0x07, 0xf2, 0x9a, 0xb7, 0xe2, 0xfc, 0xb1, 0xf5, 0xfb, 0xd8, 0xd8, 0xfc, + 0xb9, 0x28, 0x1f, 0xe5, 0xfb, 0x84, 0x91, 0x30, 0x72, 0xe5, 0xc7, 0xea, 0xaa, 0x26, 0x4f, 0x51, + 0xbc, 0x9c, 0x37, 0xf0, 0x34, 0x5b, 0x4e, 0x06, 0x8e, 0xb6, 0xb3, 0x2a, 0xd1, 0xbb, 0xa9, 0xfb, + 0x2a, 0xf1, 0x46, 0xeb, 0x71, 0xe0, 0x79, 0xba, 0x9e, 0x3b, 0x61, 0xb1, 0x4a, 0xe3, 0x17, 0xf7, + 0xe5, 0xb2, 0x17, 0x37, 0xd9, 0x8e, 0x6c, 0x5b, 0x4f, 0x88, 0xf2, 0x09, 0xa4, 0xb0, 0xef, 0x49, + 0xab, 0xf4, 0x1e, 0xd2, 0x5a, 0x7b, 0x40, 0x5a, 0x03, 0x78, 0x92, 0x49, 0x2b, 0x17, 0xc4, 0xf5, + 0xf5, 0xff, 0xa8, 0xb1, 0x9d, 0x54, 0x63, 0x59, 0x1a, 0xde, 0x9c, 0xc0, 0xce, 0xa2, 0x6f, 0x4b, + 0xf4, 0xc4, 0x65, 0x07, 0x65, 0x8d, 0x10, 0x1f, 0xa9, 0xbb, 0xaf, 0xa5, 0x57, 0x75, 0x86, 0xf8, + 0xe8, 0x7d, 0x3f, 0xcd, 0x04, 0x76, 0x17, 0x7e, 0x7b, 0xfe, 0x75, 0xbe, 0x03, 0xa8, 0xe7, 0xe5, + 0x92, 0x13, 0xc1, 0x66, 0x4e, 0x32, 0x3d, 0x32, 0x6c, 0x5f, 0xfc, 0x7a, 0xd3, 0x28, 0xbc, 0xbb, + 0x69, 0x14, 0xfe, 0xb8, 0x69, 0x14, 0x7e, 0xba, 0x6d, 0xac, 0xbc, 0xbb, 0x6d, 0xac, 0xfc, 0x76, + 0xdb, 0x58, 0xf9, 0xf1, 0x68, 0x48, 0xc4, 0x28, 0xb4, 0x0d, 0x87, 0x4e, 0x5a, 0x6a, 0x8a, 0xce, + 0x08, 0x11, 0x3f, 0xf9, 0xd1, 0x9a, 0xe5, 0xff, 0x2d, 0x89, 0x39, 0xc3, 0xdc, 0x5e, 0x97, 0x7f, + 0x93, 0x3e, 0xff, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x20, 0x21, 0xce, 0x4d, 0xf6, 0x09, 0x00, 0x00, +} + +func (m *ConsumerIBCPacket) 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 *ConsumerIBCPacket) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConsumerIBCPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SlashedFp) > 0 { + for iNdEx := len(m.SlashedFp) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SlashedFp[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SlashedFinalityProvider) 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 *SlashedFinalityProvider) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SlashedFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.RecoveredFpBtcSk) > 0 { + i -= len(m.RecoveredFpBtcSk) + copy(dAtA[i:], m.RecoveredFpBtcSk) + i = encodeVarintPacket(dAtA, i, uint64(len(m.RecoveredFpBtcSk))) + i-- + dAtA[i] = 0x12 + } + if len(m.BtcPkHex) > 0 { + i -= len(m.BtcPkHex) + copy(dAtA[i:], m.BtcPkHex) + i = encodeVarintPacket(dAtA, i, uint64(len(m.BtcPkHex))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *BTCStakingIBCPacket) Marshal() (dAtA []byte, err error) { @@ -797,7 +909,7 @@ func (m *BTCStakingIBCPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPacket(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } } if len(m.SlashedDel) > 0 { @@ -811,7 +923,7 @@ func (m *BTCStakingIBCPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPacket(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } if len(m.ActiveDel) > 0 { @@ -825,20 +937,6 @@ func (m *BTCStakingIBCPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPacket(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a - } - } - if len(m.SlashedFp) > 0 { - for iNdEx := len(m.SlashedFp) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.SlashedFp[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPacket(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 } } @@ -961,7 +1059,7 @@ func (m *NewFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SlashedFinalityProvider) Marshal() (dAtA []byte, err error) { +func (m *ActiveBTCDelegation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -971,55 +1069,18 @@ func (m *SlashedFinalityProvider) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SlashedFinalityProvider) MarshalTo(dAtA []byte) (int, error) { +func (m *ActiveBTCDelegation) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SlashedFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ActiveBTCDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.RecoveredFpBtcSk) > 0 { - i -= len(m.RecoveredFpBtcSk) - copy(dAtA[i:], m.RecoveredFpBtcSk) - i = encodeVarintPacket(dAtA, i, uint64(len(m.RecoveredFpBtcSk))) - i-- - dAtA[i] = 0x12 - } - if len(m.BtcPkHex) > 0 { - i -= len(m.BtcPkHex) - copy(dAtA[i:], m.BtcPkHex) - i = encodeVarintPacket(dAtA, i, uint64(len(m.BtcPkHex))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ActiveBTCDelegation) 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 *ActiveBTCDelegation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ActiveBTCDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ParamsVersion != 0 { - i = encodeVarintPacket(dAtA, i, uint64(m.ParamsVersion)) + if m.ParamsVersion != 0 { + i = encodeVarintPacket(dAtA, i, uint64(m.ParamsVersion)) i-- dAtA[i] = 0x78 } @@ -1278,20 +1339,46 @@ func encodeVarintPacket(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *BTCStakingIBCPacket) Size() (n int) { +func (m *ConsumerIBCPacket) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.NewFp) > 0 { - for _, e := range m.NewFp { + if len(m.SlashedFp) > 0 { + for _, e := range m.SlashedFp { l = e.Size() n += 1 + l + sovPacket(uint64(l)) } } - if len(m.SlashedFp) > 0 { - for _, e := range m.SlashedFp { + return n +} + +func (m *SlashedFinalityProvider) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.BtcPkHex) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + l = len(m.RecoveredFpBtcSk) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } + return n +} + +func (m *BTCStakingIBCPacket) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.NewFp) > 0 { + for _, e := range m.NewFp { l = e.Size() n += 1 + l + sovPacket(uint64(l)) } @@ -1363,23 +1450,6 @@ func (m *NewFinalityProvider) Size() (n int) { return n } -func (m *SlashedFinalityProvider) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.BtcPkHex) - if l > 0 { - n += 1 + l + sovPacket(uint64(l)) - } - l = len(m.RecoveredFpBtcSk) - if l > 0 { - n += 1 + l + sovPacket(uint64(l)) - } - return n -} - func (m *ActiveBTCDelegation) Size() (n int) { if m == nil { return 0 @@ -1516,7 +1586,7 @@ func sovPacket(x uint64) (n int) { func sozPacket(x uint64) (n int) { return sovPacket(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *BTCStakingIBCPacket) Unmarshal(dAtA []byte) error { +func (m *ConsumerIBCPacket) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1539,15 +1609,15 @@ func (m *BTCStakingIBCPacket) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: BTCStakingIBCPacket: wiretype end group for non-group") + return fmt.Errorf("proto: ConsumerIBCPacket: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: BTCStakingIBCPacket: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ConsumerIBCPacket: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewFp", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SlashedFp", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1574,14 +1644,178 @@ func (m *BTCStakingIBCPacket) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.NewFp = append(m.NewFp, &NewFinalityProvider{}) - if err := m.NewFp[len(m.NewFp)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.SlashedFp = append(m.SlashedFp, &SlashedFinalityProvider{}) + if err := m.SlashedFp[len(m.SlashedFp)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SlashedFinalityProvider) 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 ErrIntOverflowPacket + } + 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: SlashedFinalityProvider: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SlashedFinalityProvider: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BtcPkHex", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BtcPkHex = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SlashedFp", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RecoveredFpBtcSk", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RecoveredFpBtcSk = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BTCStakingIBCPacket) 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 ErrIntOverflowPacket + } + 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: BTCStakingIBCPacket: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BTCStakingIBCPacket: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewFp", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1608,12 +1842,12 @@ func (m *BTCStakingIBCPacket) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SlashedFp = append(m.SlashedFp, &SlashedFinalityProvider{}) - if err := m.SlashedFp[len(m.SlashedFp)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.NewFp = append(m.NewFp, &NewFinalityProvider{}) + if err := m.NewFp[len(m.NewFp)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ActiveDel", wireType) } @@ -1647,7 +1881,7 @@ func (m *BTCStakingIBCPacket) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SlashedDel", wireType) } @@ -1681,7 +1915,7 @@ func (m *BTCStakingIBCPacket) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field UnbondedDel", wireType) } @@ -2079,120 +2313,6 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { } return nil } -func (m *SlashedFinalityProvider) 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 ErrIntOverflowPacket - } - 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: SlashedFinalityProvider: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SlashedFinalityProvider: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BtcPkHex", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPacket - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPacket - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPacket - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.BtcPkHex = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RecoveredFpBtcSk", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPacket - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPacket - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPacket - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RecoveredFpBtcSk = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipPacket(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthPacket - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *ActiveBTCDelegation) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 From 8f134e1947625a1dfb33b81366dc93e722b0aff1 Mon Sep 17 00:00:00 2001 From: Gurjot Singh <111540954+gusin13@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:34:37 -0400 Subject: [PATCH 21/85] feat: Store btcstaking events in kv store and send IBC packet (#235) --- proto/babylon/btcstaking/v1/packet.proto | 31 +- test/e2e/btc_staking_e2e_test.go | 19 +- test/e2e/btc_staking_integration_e2e_test.go | 43 +- .../chain/commands_btcstaking_integration.go | 4 +- testutil/datagen/btcstaking.go | 18 +- .../keeper/btc_consumer_delegations.go | 21 + x/btcstaking/keeper/btc_delegations.go | 56 +- .../keeper/btc_staking_consumer_events.go | 91 +++ .../btc_staking_consumer_events_test.go | 335 ++++++++ x/btcstaking/keeper/keeper_test.go | 7 +- x/btcstaking/keeper/msg_server.go | 16 +- .../types/btc_staking_consumer_events.go | 103 +++ x/btcstaking/types/keys.go | 1 + x/btcstaking/types/mocked_keepers.go | 16 +- x/btcstaking/types/packet.pb.go | 719 ++++++++++++++---- x/finality/keeper/grpc_query_test.go | 5 +- x/finality/keeper/msg_server_test.go | 8 +- x/finality/keeper/votes_bench_test.go | 4 +- x/zoneconcierge/abci.go | 2 + x/zoneconcierge/keeper/ibc_channels.go | 32 + .../ibc_packet_btc_staking_consumer_event.go | 51 ++ x/zoneconcierge/types/expected_keepers.go | 3 + x/zoneconcierge/types/mocked_keepers.go | 115 +-- 23 files changed, 1427 insertions(+), 273 deletions(-) create mode 100644 x/btcstaking/keeper/btc_staking_consumer_events.go create mode 100644 x/btcstaking/keeper/btc_staking_consumer_events_test.go create mode 100644 x/btcstaking/types/btc_staking_consumer_events.go create mode 100644 x/zoneconcierge/keeper/ibc_packet_btc_staking_consumer_event.go diff --git a/proto/babylon/btcstaking/v1/packet.proto b/proto/babylon/btcstaking/v1/packet.proto index cf09c93fa..16a0f9def 100644 --- a/proto/babylon/btcstaking/v1/packet.proto +++ b/proto/babylon/btcstaking/v1/packet.proto @@ -43,8 +43,8 @@ message NewFinalityProvider { // commission defines the commission rate of the finality provider. // It forms as a string converted from "cosmossdk.io/math.LegacyDec" string commission = 2; - // babylon_pk is the Babylon secp256k1 PK of this finality provider - cosmos.crypto.secp256k1.PubKey babylon_pk = 3; + // addr is the bech32 address identifier of the finality provider. + string addr = 3; // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider // the PK follows encoding in BIP-340 spec in hex format string btc_pk_hex = 4; @@ -53,24 +53,22 @@ message NewFinalityProvider { // master_pub_rand is the master public randomness of the finality provider // encoded as a base58 string string master_pub_rand = 6; - // registered_epoch is the epoch when this finality provider is registered - uint64 registered_epoch = 7; // slashed_babylon_height indicates the Babylon height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - uint64 slashed_babylon_height = 8; + uint64 slashed_babylon_height = 7; // slashed_btc_height indicates the BTC height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - uint64 slashed_btc_height = 9; + uint64 slashed_btc_height = 8; // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in Babylon. - string consumer_id = 10; + string consumer_id = 9; } // ActiveBTCDelegation is an IBC packet sent from Babylon to consumer // upon a BTC delegation newly receives covenant signatures and thus becomes active -message ActiveBTCDelegation { +message ActiveBTCDelegation { // btc_pk_hex is the Bitcoin secp256k1 PK of this BTC delegation // the PK follows encoding in BIP-340 spec in hex format string btc_pk_hex = 1; @@ -157,3 +155,20 @@ message UnbondedBTCDelegation { // It proves that the BTC delegator wants to unbond bytes unbonding_tx_sig = 2; } + +// BTCStakingConsumerEvent defines the structure for storing BTC staking events +// which will be later sent to consumer chains as IBC packets. +message BTCStakingConsumerEvent { + // oneof event represents a mutually exclusive choice among different event types. + // Only one event type can be set within each BTCStakingEvent message instance. + oneof event { + // NewFinalityProvider represents the event of a new finality provider being created. + NewFinalityProvider new_fp = 1; + // ActiveBTCDelegation represents the event of an active BTC delegation. + ActiveBTCDelegation active_del = 2; + // SlashedBTCDelegation represents the event of a slashed BTC delegation. + SlashedBTCDelegation slashed_del = 3; + // UnbondedBTCDelegation represents the event of an unbonded BTC delegation. + UnbondedBTCDelegation unbonded_del = 4; + } +} \ No newline at end of file diff --git a/test/e2e/btc_staking_e2e_test.go b/test/e2e/btc_staking_e2e_test.go index 20ed80621..08edcfe05 100644 --- a/test/e2e/btc_staking_e2e_test.go +++ b/test/e2e/btc_staking_e2e_test.go @@ -79,7 +79,22 @@ func (s *BTCStakingTestSuite) Test1CreateFinalityProviderAndDelegation() { nonValidatorNode, err := chainA.GetNodeAtIndex(2) s.NoError(err) - cacheFP = s.CreateNodeFP(nonValidatorNode) + //cacheFP = s.CreateNodeFP(nonValidatorNode) + /* + create a random finality provider on Babylon + */ + // NOTE: we use the node's secret key as Babylon secret key for the finality provider + fp, err := datagen.GenRandomCustomFinalityProvider(r, fpBTCSK, nonValidatorNode.SecretKey, "") + s.NoError(err) + nonValidatorNode.CreateFinalityProvider("val", fp.BtcPk, fp.Pop, fp.Description.Moniker, fp.Description.Identity, fp.Description.Website, fp.Description.SecurityContact, fp.Description.Details, fp.Commission) + + // wait for a block so that above txs take effect + nonValidatorNode.WaitForNextBlock() + + // query the existence of finality provider and assert equivalence + actualFps := nonValidatorNode.QueryFinalityProviders() + s.Len(actualFps, 1) + s.equalFinalityProviderResp(fp, actualFps[0]) /* create a random BTC delegation under this finality provider @@ -854,7 +869,7 @@ func (s *BTCStakingTestSuite) CreateNodeFP(node *chain.NodeConfig) (newFP *bstyp nodeAddr, err := sdk.AccAddressFromBech32(node.PublicAddress) s.NoError(err) - newFP, err = datagen.GenRandomFinalityProviderWithBTCBabylonSKs(r, fpBTCSK, nodeAddr) + newFP, err = datagen.GenRandomFinalityProviderWithBTCBabylonSKs(r, fpBTCSK, nodeAddr, "") s.NoError(err) node.CreateFinalityProvider(newFP.Addr, newFP.BtcPk, newFP.Pop, newFP.Description.Moniker, newFP.Description.Identity, newFP.Description.Website, newFP.Description.SecurityContact, newFP.Description.Details, newFP.Commission) diff --git a/test/e2e/btc_staking_integration_e2e_test.go b/test/e2e/btc_staking_integration_e2e_test.go index 41a7978b7..04fe5dab4 100644 --- a/test/e2e/btc_staking_integration_e2e_test.go +++ b/test/e2e/btc_staking_integration_e2e_test.go @@ -1,12 +1,8 @@ package e2e import ( - "errors" - "fmt" "math" - "time" - "github.com/babylonchain/babylon/crypto/eots" "github.com/babylonchain/babylon/test/e2e/configurer" "github.com/babylonchain/babylon/test/e2e/configurer/chain" "github.com/babylonchain/babylon/test/e2e/initialization" @@ -15,7 +11,6 @@ import ( btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" bstypes "github.com/babylonchain/babylon/x/btcstaking/types" bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" - ckpttypes "github.com/babylonchain/babylon/x/checkpointing/types" "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/wire" @@ -144,12 +139,10 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerFP(babylonNode *cha */ // NOTE: we use the node's secret key as Babylon secret key for the finality provider czFpBTCSK, _, _ := datagen.GenRandomBTCKeyPair(r) - sr, _, err := eots.NewMasterRandPair(r) - s.NoError(err) - czFp, err := datagen.GenRandomCustomFinalityProvider(r, czFpBTCSK, babylonNode.SecretKey, sr) + czFp, err := datagen.GenRandomCustomFinalityProvider(r, czFpBTCSK, babylonNode.SecretKey, consumerId) s.NoError(err) babylonNode.CreateConsumerFinalityProvider( - czFp.BabylonPk, czFp.BtcPk, czFp.Pop, czFp.MasterPubRand, consumerId, czFp.Description.Moniker, + czFp.BabylonPk, czFp.BtcPk, czFp.Pop, consumerId, czFp.Description.Moniker, czFp.Description.Identity, czFp.Description.Website, czFp.Description.SecurityContact, czFp.Description.Details, czFp.Commission, ) @@ -177,11 +170,9 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyBabylonFP(babylonNode *chai */ // NOTE: we use the node's secret key as Babylon secret key for the finality provider babylonFpBTCSK, _, _ := datagen.GenRandomBTCKeyPair(r) - sr, _, err := eots.NewMasterRandPair(r) - s.NoError(err) - babylonFp, err := datagen.GenRandomCustomFinalityProvider(r, babylonFpBTCSK, babylonNode.SecretKey, sr) + babylonFp, err := datagen.GenRandomCustomFinalityProvider(r, babylonFpBTCSK, babylonNode.SecretKey, "") s.NoError(err) - babylonNode.CreateFinalityProvider(babylonFp.BabylonPk, babylonFp.BtcPk, babylonFp.Pop, babylonFp.MasterPubRand, babylonFp.Description.Moniker, babylonFp.Description.Identity, babylonFp.Description.Website, babylonFp.Description.SecurityContact, babylonFp.Description.Details, babylonFp.Commission) + babylonNode.CreateFinalityProvider(babylonFp.BabylonPk, babylonFp.BtcPk, babylonFp.Pop, babylonFp.Description.Moniker, babylonFp.Description.Identity, babylonFp.Description.Website, babylonFp.Description.SecurityContact, babylonFp.Description.Details, babylonFp.Commission) // wait for a block so that above txs take effect babylonNode.WaitForNextBlock() @@ -202,32 +193,6 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyBabylonFP(babylonNode *chai // helper function: create a Babylon delegation and restake to Babylon and consumer finality providers func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNode *chain.NodeConfig, babylonFp *bstypes.FinalityProviderResponse, consumerFp *bsctypes.FinalityProviderResponse) (*btcec.PublicKey, string) { - // finalise epochs until the registered epoch of the finality provider - // so that the finality provider can receive BTC delegations - // TODO: it is assumed here that babylonFp is registered after consumerFp so - // if we finalize registered epoch of babylonFp the other would also get finalized - // ideally we should get registered epoch of each restaked fp and finalize it. - var ( - startEpoch = uint64(1) - endEpoch = babylonFp.RegisteredEpoch - ) - // wait until the end epoch is sealed - s.Eventually(func() bool { - ch, _ := nonValidatorNode.QueryCurrentHeight() - ce, _ := nonValidatorNode.QueryCurrentEpoch() - fmt.Println("current height", ch) - fmt.Println("current epoch", ce) - resp, err := nonValidatorNode.QueryRawCheckpoint(endEpoch) - if err != nil { - if !errors.Is(err, ckpttypes.ErrCkptDoesNotExist) { - return false - } - } - return resp.Status == ckpttypes.Sealed - }, time.Minute, time.Second*5) - // finalise these epochs - nonValidatorNode.FinalizeSealedEpochs(startEpoch, endEpoch) - /* create a random BTC delegation restaking to Babylon and consumer finality providers */ diff --git a/test/e2e/configurer/chain/commands_btcstaking_integration.go b/test/e2e/configurer/chain/commands_btcstaking_integration.go index c91bb62eb..2782b2ec3 100644 --- a/test/e2e/configurer/chain/commands_btcstaking_integration.go +++ b/test/e2e/configurer/chain/commands_btcstaking_integration.go @@ -21,7 +21,7 @@ func (n *NodeConfig) RegisterConsumer(consumerId, consumerName, consumerDesc str n.LogActionF("successfully registered consumer on babylon") } -func (n *NodeConfig) CreateConsumerFinalityProvider(babylonPK *secp256k1.PubKey, btcPK *bbn.BIP340PubKey, pop *bstypes.ProofOfPossession, masterPubRand, consumerId, moniker, identity, website, securityContract, details string, commission *sdkmath.LegacyDec) { +func (n *NodeConfig) CreateConsumerFinalityProvider(babylonPK *secp256k1.PubKey, btcPK *bbn.BIP340PubKey, pop *bstypes.ProofOfPossession, consumerId, moniker, identity, website, securityContract, details string, commission *sdkmath.LegacyDec) { n.LogActionF("creating consumer finality provider") // get babylon PK hex @@ -35,7 +35,7 @@ func (n *NodeConfig) CreateConsumerFinalityProvider(babylonPK *secp256k1.PubKey, require.NoError(n.t, err) cmd := []string{ - "babylond", "tx", "btcstaking", "create-finality-provider", babylonPKHex, btcPKHex, popHex, masterPubRand, "--from=val", "--consumer-id", consumerId, "--moniker", moniker, "--identity", identity, "--website", website, "--security-contact", securityContract, "--details", details, "--commission-rate", commission.String(), + "babylond", "tx", "btcstaking", "create-finality-provider", babylonPKHex, btcPKHex, popHex, "--from=val", "--consumer-id", consumerId, "--moniker", moniker, "--identity", identity, "--website", website, "--security-contact", securityContract, "--details", details, "--commission-rate", commission.String(), } _, _, err = n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) require.NoError(n.t, err) diff --git a/testutil/datagen/btcstaking.go b/testutil/datagen/btcstaking.go index a7d3821dd..834e003d4 100644 --- a/testutil/datagen/btcstaking.go +++ b/testutil/datagen/btcstaking.go @@ -1,6 +1,7 @@ package datagen import ( + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "math/rand" "testing" @@ -26,12 +27,12 @@ const ( ) func GenRandomFinalityProvider(r *rand.Rand) (*bstypes.FinalityProvider, error) { - // key pairs + // BTC key pairs btcSK, _, err := GenRandomBTCKeyPair(r) if err != nil { return nil, err } - return GenRandomFinalityProviderWithBTCSK(r, btcSK) + return GenRandomFinalityProviderWithBTCSK(r, btcSK, "") } func CreateNFinalityProviders(r *rand.Rand, t *testing.T, n int) []*bstypes.FinalityProvider { @@ -44,8 +45,8 @@ func CreateNFinalityProviders(r *rand.Rand, t *testing.T, n int) []*bstypes.Fina return fps } -func GenRandomFinalityProviderWithBTCSK(r *rand.Rand, btcSK *btcec.PrivateKey) (*bstypes.FinalityProvider, error) { - return GenRandomFinalityProviderWithBTCBabylonSKs(r, btcSK, GenRandomAccount().GetAddress()) +func GenRandomFinalityProviderWithBTCSK(r *rand.Rand, btcSK *btcec.PrivateKey, consumerID string) (*bstypes.FinalityProvider, error) { + return GenRandomFinalityProviderWithBTCBabylonSKs(r, btcSK, GenRandomAccount().GetAddress(), consumerID) } func GenRandomCommission(r *rand.Rand) sdkmath.LegacyDec { @@ -56,7 +57,7 @@ func GenRandomDescription(r *rand.Rand) *stakingtypes.Description { return &stakingtypes.Description{Moniker: GenRandomHexStr(r, 10)} } -func GenRandomFinalityProviderWithBTCBabylonSKs(r *rand.Rand, btcSK *btcec.PrivateKey, fpAddr sdk.AccAddress) (*bstypes.FinalityProvider, error) { +func GenRandomFinalityProviderWithBTCBabylonSKs(r *rand.Rand, btcSK *btcec.PrivateKey, fpAddr sdk.AccAddress, consumerID string) (*bstypes.FinalityProvider, error) { // commission commission := GenRandomCommission(r) // description @@ -75,10 +76,15 @@ func GenRandomFinalityProviderWithBTCBabylonSKs(r *rand.Rand, btcSK *btcec.Priva BtcPk: bip340PK, Addr: fpAddr.String(), Pop: pop, - ConsumerId: "", // TODO: parameterise + ConsumerId: consumerID, }, nil } +func GenRandomCustomFinalityProvider(r *rand.Rand, btcSK *btcec.PrivateKey, bbnSK cryptotypes.PrivKey, consumerID string) (*bstypes.FinalityProvider, error) { + fpAddr := sdk.MustAccAddressFromBech32(bbnSK.PubKey().Address().String()) + return GenRandomFinalityProviderWithBTCBabylonSKs(r, btcSK, fpAddr, consumerID) +} + // TODO: accomodate presign unbonding flow func GenRandomBTCDelegation( r *rand.Rand, diff --git a/x/btcstaking/keeper/btc_consumer_delegations.go b/x/btcstaking/keeper/btc_consumer_delegations.go index 7bae74394..2bc1692b0 100644 --- a/x/btcstaking/keeper/btc_consumer_delegations.go +++ b/x/btcstaking/keeper/btc_consumer_delegations.go @@ -92,6 +92,27 @@ func (k Keeper) GetBTCConsumerDelegatorDelegationsResponses( return btcDels, pageRes, nil } +// SetConsumerFinalityProvider checks conditions and sets a new finality provider for a consumer. +func (k Keeper) SetConsumerFinalityProvider(ctx context.Context, fp *bstypes.FinalityProvider, consumerID string) error { + // check if the finality provider already exists to prevent duplicates + if k.bscKeeper.HasConsumerFinalityProvider(ctx, fp.BtcPk) { + return bstypes.ErrFpRegistered + } + // verify that the consumer is registered within the btcstkconsumer module + if !k.bscKeeper.IsConsumerRegistered(ctx, consumerID) { + return bstypes.ErrConsumerIDNotRegistered + } + // set the finality provider in btcstkconsumer module + k.bscKeeper.SetConsumerFinalityProvider(ctx, fp) + + // record the event in btc staking consumer event store + if err := k.AddBTCStakingConsumerEvent(ctx, consumerID, bstypes.CreateNewFinalityProviderEvent(fp)); err != nil { + return err + } + + return nil +} + // getBTCConsumerDelegatorDelegationIndex gets the BTC delegation index with a given BTC PK under a given finality provider func (k Keeper) getBTCConsumerDelegatorDelegationIndex(ctx context.Context, fpBTCPK *bbn.BIP340PubKey, delBTCPK *bbn.BIP340PubKey) *bstypes.BTCDelegatorDelegationIndex { // ensure the finality provider exists diff --git a/x/btcstaking/keeper/btc_delegations.go b/x/btcstaking/keeper/btc_delegations.go index 827ed9149..fb3ffeb4e 100644 --- a/x/btcstaking/keeper/btc_delegations.go +++ b/x/btcstaking/keeper/btc_delegations.go @@ -108,6 +108,21 @@ func (k Keeper) addCovenantSigsToBTCDelegation( activeEvent := types.NewEventPowerDistUpdateWithBTCDel(event) btcTip := k.btclcKeeper.GetTipInfo(ctx) k.addPowerDistUpdateEvent(ctx, btcTip.Height, activeEvent) + + // get consumer ids of only non-Babylon finality providers + restakedFPConsumerIDs, err := k.restakedFPConsumerIDs(ctx, btcDel.FpBtcPkList) + if err != nil { + panic(fmt.Errorf("failed to get consumer ids for the restaked BTC delegation: %w", err)) + } + consumerEvent, err := types.CreateActiveBTCDelegationEvent(btcDel) + if err != nil { + panic(fmt.Errorf("failed to create active BTC delegation event: %w", err)) + } + for _, consumerID := range restakedFPConsumerIDs { + if err := k.AddBTCStakingConsumerEvent(ctx, consumerID, consumerEvent); err != nil { + panic(fmt.Errorf("failed to add active BTC delegation event: %w", err)) + } + } } } @@ -137,6 +152,22 @@ func (k Keeper) btcUndelegate( unbondedEvent := types.NewEventPowerDistUpdateWithBTCDel(event) btcTip := k.btclcKeeper.GetTipInfo(ctx) k.addPowerDistUpdateEvent(ctx, btcTip.Height, unbondedEvent) + + // get consumer ids of only non-Babylon finality providers + restakedFPConsumerIDs, err := k.restakedFPConsumerIDs(ctx, btcDel.FpBtcPkList) + if err != nil { + panic(fmt.Errorf("failed to get consumer ids for the restaked BTC delegation: %w", err)) + } + // create consumer event for unbonded BTC delegation and add it to the consumer's event store + consumerEvent, err := types.CreateUnbondedBTCDelegationEvent(btcDel) + if err != nil { + panic(fmt.Errorf("failed to create unbonded BTC delegation event: %w", err)) + } + for _, consumerID := range restakedFPConsumerIDs { + if err = k.AddBTCStakingConsumerEvent(ctx, consumerID, consumerEvent); err != nil { + panic(fmt.Errorf("failed to add active BTC delegation event: %w", err)) + } + } } func (k Keeper) setBTCDelegation(ctx context.Context, btcDel *types.BTCDelegation) { @@ -150,10 +181,8 @@ func (k Keeper) setBTCDelegation(ctx context.Context, btcDel *types.BTCDelegatio // one of them is a Babylon finality provider. It also checks whether the BTC stake is // restaked to FPs of consumer chains func (k Keeper) validateRestakedFPs(ctx context.Context, fpBTCPKs []bbn.BIP340PubKey) (bool, error) { - var ( - restakedToBabylon = false - restakedToConsumers = false - ) + restakedToBabylon := false + restakedToConsumers := false for _, fpBTCPK := range fpBTCPKs { // find the fp and determine whether it's Babylon fp or consumer chain fp @@ -162,7 +191,6 @@ func (k Keeper) validateRestakedFPs(ctx context.Context, fpBTCPKs []bbn.BIP340Pu if fp.IsSlashed() { return false, types.ErrFpAlreadySlashed } - // ensure the finality provider's registered epoch is finalised restakedToBabylon = true continue } else if consumerID, err := k.bscKeeper.GetConsumerOfFinalityProvider(ctx, &fpBTCPK); err == nil { @@ -174,7 +202,6 @@ func (k Keeper) validateRestakedFPs(ctx context.Context, fpBTCPKs []bbn.BIP340Pu if fp.IsSlashed() { return false, types.ErrFpAlreadySlashed } - // ensure the finality provider's registered epoch is finalised restakedToConsumers = true continue } else { @@ -188,6 +215,23 @@ func (k Keeper) validateRestakedFPs(ctx context.Context, fpBTCPKs []bbn.BIP340Pu return restakedToConsumers, nil } +// restakedFPConsumerIDs returns the consumer IDs of non-Babylon finality providers +func (k Keeper) restakedFPConsumerIDs(ctx context.Context, fpBTCPKs []bbn.BIP340PubKey) ([]string, error) { + var consumerIDs []string + + for _, fpBTCPK := range fpBTCPKs { + if _, err := k.GetFinalityProvider(ctx, fpBTCPK); err == nil { + continue + } else if consumerID, err := k.bscKeeper.GetConsumerOfFinalityProvider(ctx, &fpBTCPK); err == nil { + consumerIDs = append(consumerIDs, consumerID) + } else { + return nil, types.ErrFpNotFound.Wrapf("finality provider pk %s is not found", fpBTCPK.MarshalHex()) + } + } + + return consumerIDs, nil +} + // GetBTCDelegation gets the BTC delegation with a given staking tx hash func (k Keeper) GetBTCDelegation(ctx context.Context, stakingTxHashStr string) (*types.BTCDelegation, error) { // decode staking tx hash string diff --git a/x/btcstaking/keeper/btc_staking_consumer_events.go b/x/btcstaking/keeper/btc_staking_consumer_events.go new file mode 100644 index 000000000..e37c16942 --- /dev/null +++ b/x/btcstaking/keeper/btc_staking_consumer_events.go @@ -0,0 +1,91 @@ +package keeper + +import ( + "context" + "fmt" + + "cosmossdk.io/store/prefix" + "github.com/babylonchain/babylon/x/btcstaking/types" + "github.com/cosmos/cosmos-sdk/runtime" +) + +func (k Keeper) AddBTCStakingConsumerEvent(ctx context.Context, consumerID string, event *types.BTCStakingConsumerEvent) error { + store := k.btcStakingConsumerEventStore(ctx, consumerID) + storeKey := []byte(consumerID) + + // If the consumer already has events, append the new event to the existing list + // TODO: repeated marshalling/unmarshalling is inefficient; consider refactoring + var events types.BTCStakingIBCPacket + if store.Has(storeKey) { + eventsBytes := store.Get(storeKey) + k.cdc.MustUnmarshal(eventsBytes, &events) + } + + switch { + case event.GetNewFp() != nil: + events.NewFp = append(events.NewFp, event.GetNewFp()) + case event.GetActiveDel() != nil: + events.ActiveDel = append(events.ActiveDel, event.GetActiveDel()) + case event.GetSlashedDel() != nil: + events.SlashedDel = append(events.SlashedDel, event.GetSlashedDel()) + case event.GetUnbondedDel() != nil: + events.UnbondedDel = append(events.UnbondedDel, event.GetUnbondedDel()) + default: + return fmt.Errorf("unrecognized event type for event %+v", event) + } + + eventsBytes := k.cdc.MustMarshal(&events) + store.Set(storeKey, eventsBytes) + + return nil +} + +// GetBTCStakingConsumerIBCPacket gets BTC staking consumer IBC packet for a given consumer ID. +func (k Keeper) GetBTCStakingConsumerIBCPacket(ctx context.Context, consumerID string) *types.BTCStakingIBCPacket { + store := k.btcStakingConsumerEventStore(ctx, consumerID) + storeKey := []byte(consumerID) + if !store.Has(storeKey) { + return nil + } + + var events types.BTCStakingIBCPacket + eventsBytes := store.Get(storeKey) + k.cdc.MustUnmarshal(eventsBytes, &events) + return &events +} + +// GetAllBTCStakingConsumerIBCPackets retrieves all BTC staking consumer IBC packets from the store, +// returning a map where the keys are consumer IDs and the values are the corresponding BTCStakingIBCPacket. +func (k Keeper) GetAllBTCStakingConsumerIBCPackets(ctx context.Context) map[string]*types.BTCStakingIBCPacket { + storeAdaptor := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + evStore := prefix.NewStore(storeAdaptor, types.BTCStakingEventKey) + iter := evStore.Iterator(nil, nil) + defer iter.Close() + + // Initialize the map to hold consumer ID keys and IBC packet values. + allEvents := make(map[string]*types.BTCStakingIBCPacket) + for ; iter.Valid(); iter.Next() { + var events types.BTCStakingIBCPacket + k.cdc.MustUnmarshal(iter.Value(), &events) + consumerID := string(iter.Key()) + allEvents[consumerID] = &events + } + + return allEvents +} + +func (k Keeper) DeleteBTCStakingConsumerIBCPacket(ctx context.Context, consumerID string) { + store := k.btcStakingConsumerEventStore(ctx, consumerID) + storeKey := []byte(consumerID) + store.Delete(storeKey) +} + +// btcStakingConsumerEventStore returns the KVStore of the btc staking event +// prefix: BTCStakingEventKey || consumer ID +// key: BTCStakingConsumerEventType +// value: BTCStakingConsumerEvents (a list of BTCStakingConsumerEvent) +func (k Keeper) btcStakingConsumerEventStore(ctx context.Context, consumerID string) prefix.Store { + storeAdaptor := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + evStore := prefix.NewStore(storeAdaptor, types.BTCStakingEventKey) + return prefix.NewStore(evStore, []byte(consumerID)) +} diff --git a/x/btcstaking/keeper/btc_staking_consumer_events_test.go b/x/btcstaking/keeper/btc_staking_consumer_events_test.go new file mode 100644 index 000000000..565850840 --- /dev/null +++ b/x/btcstaking/keeper/btc_staking_consumer_events_test.go @@ -0,0 +1,335 @@ +package keeper_test + +import ( + "math/rand" + "testing" + + "github.com/babylonchain/babylon/testutil/datagen" + bbn "github.com/babylonchain/babylon/types" + "github.com/babylonchain/babylon/x/btcstaking/types" + bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" + "github.com/btcsuite/btcd/btcec/v2" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" +) + +func FuzzSetBTCStakingEventStore_NewFp(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // mock BTC light client and BTC checkpoint modules + btclcKeeper := types.NewMockBTCLightClientKeeper(ctrl) + btccKeeper := types.NewMockBtcCheckpointKeeper(ctrl) + ckptKeeper := types.NewMockCheckpointingKeeper(ctrl) + h := NewHelper(t, btclcKeeper, btccKeeper, ckptKeeper) + h.GenAndApplyParams(r) + + // register a random consumer on Babylon + randomConsumer := registerAndVerifyConsumer(t, r, h) + + // create new consumer finality providers, this will create on Babylon and insert + // events in the events store + var fps []*types.FinalityProvider + for i := 0; i < int(datagen.RandomInt(r, 10))+1; i++ { + _, _, fp, err := h.CreateConsumerFinalityProvider(r, randomConsumer.ConsumerId) + require.NoError(t, err) + fps = append(fps, fp) + } + + // fetch the events from kv store and expect only events related to new finality provider + evs := h.BTCStakingKeeper.GetBTCStakingConsumerIBCPacket(h.Ctx, randomConsumer.ConsumerId) + require.NotNil(t, evs) + require.NotNil(t, evs.GetNewFp()) + require.Equal(t, len(evs.GetNewFp()), len(fps)) + + // there should be no other events in the store + require.Nil(t, evs.GetActiveDel()) + require.Nil(t, evs.GetSlashedDel()) + require.Nil(t, evs.GetUnbondedDel()) + + // Prepare a map of finality providers based on btc pk hex + fpsMap := make(map[string]*types.FinalityProvider) + for _, fp := range fps { + fpsMap[fp.BtcPk.MarshalHex()] = fp + } + // Assert the contents of staking events + for _, evFp := range evs.GetNewFp() { + fp := fpsMap[evFp.BtcPkHex] + require.NotNil(t, fp) + + // Assert individual fields + require.Equal(t, fp.Description.Moniker, evFp.Description.Moniker) + require.Equal(t, fp.Commission.String(), evFp.Commission) + require.Equal(t, fp.BabylonPk, evFp.BabylonPk) + require.Equal(t, fp.BtcPk.MarshalHex(), evFp.BtcPkHex) + require.Equal(t, fp.Pop, evFp.Pop) + require.Equal(t, fp.SlashedBabylonHeight, evFp.SlashedBabylonHeight) + require.Equal(t, fp.SlashedBtcHeight, evFp.SlashedBtcHeight) + require.Equal(t, fp.ConsumerId, evFp.ConsumerId) + } + }) +} + +func FuzzSetBTCStakingEventStore_ActiveDel(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // mock BTC light client and BTC checkpoint modules + btclcKeeper := types.NewMockBTCLightClientKeeper(ctrl) + btccKeeper := types.NewMockBtcCheckpointKeeper(ctrl) + ckptKeeper := types.NewMockCheckpointingKeeper(ctrl) + h := NewHelper(t, btclcKeeper, btccKeeper, ckptKeeper) + + // set all parameters + covenantSKs, _ := h.GenAndApplyParams(r) + changeAddress, err := datagen.GenRandomBTCAddress(r, h.Net) + require.NoError(t, err) + + // register a random consumer on Babylon + randomConsumer := registerAndVerifyConsumer(t, r, h) + // create new consumer finality provider + _, consumerFpPK, _, err := h.CreateConsumerFinalityProvider(r, randomConsumer.ConsumerId) + require.NoError(t, err) + // create new Babylon finality provider + _, babylonFpPK, _ := h.CreateFinalityProvider(r) + + // generate and insert new BTC delegation, restake to 1 consumer fp and 1 babylon fp + stakingValue := int64(2 * 10e8) + stakingTxHash, _, _, msgCreateBTCDel, _, err := h.CreateDelegation( + r, + []*btcec.PublicKey{consumerFpPK, babylonFpPK}, + changeAddress.EncodeAddress(), + stakingValue, + 1000, + ) + h.NoError(err) + + // delegation related assertions + actualDel, err := h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingTxHash) + h.NoError(err) + require.False(h.t, actualDel.HasCovenantQuorums(h.BTCStakingKeeper.GetParams(h.Ctx).CovenantQuorum)) + // create cov sigs to activate the delegation + msgs := h.GenerateCovenantSignaturesMessages(r, covenantSKs, msgCreateBTCDel, actualDel) + bogusMsg := *msgs[0] + bogusMsg.StakingTxHash = datagen.GenRandomBtcdHash(r).String() + _, err = h.MsgServer.AddCovenantSigs(h.Ctx, &bogusMsg) + h.Error(err) + for _, msg := range msgs { + _, err = h.MsgServer.AddCovenantSigs(h.Ctx, msg) + h.NoError(err) + // check that submitting the same covenant signature does not produce an error + _, err = h.MsgServer.AddCovenantSigs(h.Ctx, msg) + h.NoError(err) + } + // ensure the BTC delegation now has voting power as it has been activated + actualDel, err = h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingTxHash) + h.NoError(err) + require.True(h.t, actualDel.HasCovenantQuorums(h.BTCStakingKeeper.GetParams(h.Ctx).CovenantQuorum)) + require.True(h.t, actualDel.BtcUndelegation.HasCovenantQuorums(h.BTCStakingKeeper.GetParams(h.Ctx).CovenantQuorum)) + votingPower := actualDel.VotingPower(h.BTCLightClientKeeper.GetTipInfo(h.Ctx).Height, h.BTCCheckpointKeeper.GetParams(h.Ctx).CheckpointFinalizationTimeout, h.BTCStakingKeeper.GetParams(h.Ctx).CovenantQuorum) + require.Equal(t, uint64(stakingValue), votingPower) + + // event store related assertions + evs := h.BTCStakingKeeper.GetBTCStakingConsumerIBCPacket(h.Ctx, randomConsumer.ConsumerId) + require.NotNil(t, evs) + require.NotNil(t, evs.GetActiveDel()) + require.NotNil(t, evs.GetNewFp()) + // we created 2 finality providers but only 1 of them is consumer fp, so expect only 1 fp in the event store + require.Equal(t, 1, len(evs.GetNewFp())) + require.Equal(t, 1, len(evs.GetActiveDel())) + // there should be no other events in the store + require.Nil(t, evs.GetSlashedDel()) + require.Nil(t, evs.GetUnbondedDel()) + // Assert the contents of the staking event + ev := evs.GetActiveDel()[0] + require.NotNil(t, ev) + require.Equal(t, actualDel.BtcPk.MarshalHex(), ev.BtcPkHex) + require.Equal(t, actualDel.StartHeight, ev.StartHeight) + require.Equal(t, actualDel.EndHeight, ev.EndHeight) + require.Equal(t, actualDel.TotalSat, ev.TotalSat) + require.Equal(t, actualDel.StakingTx, ev.StakingTx) + require.Equal(t, actualDel.StakingOutputIdx, ev.StakingOutputIdx) + require.Equal(t, actualDel.UnbondingTime, ev.UnbondingTime) + }) +} + +func FuzzSetBTCStakingEventStore_UnbondedDel(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // mock BTC light client and BTC checkpoint modules + btclcKeeper := types.NewMockBTCLightClientKeeper(ctrl) + btccKeeper := types.NewMockBtcCheckpointKeeper(ctrl) + ckptKeeper := types.NewMockCheckpointingKeeper(ctrl) + h := NewHelper(t, btclcKeeper, btccKeeper, ckptKeeper) + + // set all parameters + covenantSKs, _ := h.GenAndApplyParams(r) + + bsParams := h.BTCStakingKeeper.GetParams(h.Ctx) + wValue := h.BTCCheckpointKeeper.GetParams(h.Ctx).CheckpointFinalizationTimeout + changeAddress, err := datagen.GenRandomBTCAddress(r, h.Net) + require.NoError(t, err) + + // register a random consumer on Babylon + randomConsumer := registerAndVerifyConsumer(t, r, h) + // create new consumer finality provider + _, consumerFpPK, _, err := h.CreateConsumerFinalityProvider(r, randomConsumer.ConsumerId) + require.NoError(t, err) + // create new Babylon finality provider + _, babylonFpPK, _ := h.CreateFinalityProvider(r) + + // generate and insert new BTC delegation + stakingValue := int64(2 * 10e8) + stakingTxHash, delSK, _, msgCreateBTCDel, actualDel, err := h.CreateDelegation( + r, + []*btcec.PublicKey{consumerFpPK, babylonFpPK}, + changeAddress.EncodeAddress(), + stakingValue, + 1000, + ) + h.NoError(err) + + // add covenant signatures to this BTC delegation + h.CreateCovenantSigs(r, covenantSKs, msgCreateBTCDel, actualDel) + + // ensure the BTC delegation is bonded right now + actualDel, err = h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingTxHash) + h.NoError(err) + btcTip := h.BTCLightClientKeeper.GetTipInfo(h.Ctx).Height + status := actualDel.GetStatus(btcTip, wValue, bsParams.CovenantQuorum) + require.Equal(t, types.BTCDelegationStatus_ACTIVE, status) + + // construct unbonding msg + delUnbondingSig, err := actualDel.SignUnbondingTx(&bsParams, h.Net, delSK) + h.NoError(err) + msg := &types.MsgBTCUndelegate{ + Signer: datagen.GenRandomAccount().Address, + StakingTxHash: stakingTxHash, + UnbondingTxSig: bbn.NewBIP340SignatureFromBTCSig(delUnbondingSig), + } + + // ensure the system does not panick due to a bogus unbonding msg + bogusMsg := *msg + bogusMsg.StakingTxHash = datagen.GenRandomBtcdHash(r).String() + _, err = h.MsgServer.BTCUndelegate(h.Ctx, &bogusMsg) + h.Error(err) + + // unbond + _, err = h.MsgServer.BTCUndelegate(h.Ctx, msg) + h.NoError(err) + + // ensure the BTC delegation is unbonded + actualDel, err = h.BTCStakingKeeper.GetBTCDelegation(h.Ctx, stakingTxHash) + h.NoError(err) + status = actualDel.GetStatus(btcTip, wValue, bsParams.CovenantQuorum) + require.Equal(t, types.BTCDelegationStatus_UNBONDED, status) + + // event store related assertions + evs := h.BTCStakingKeeper.GetBTCStakingConsumerIBCPacket(h.Ctx, randomConsumer.ConsumerId) + require.NotNil(t, evs) + require.NotNil(t, evs.GetActiveDel()) + require.NotNil(t, evs.GetNewFp()) + require.NotNil(t, evs.GetUnbondedDel()) + // we created 2 finality providers but only 1 of them is consumer fp, so expect only 1 fp in the event store + require.Equal(t, 1, len(evs.GetNewFp())) + require.Equal(t, 1, len(evs.GetActiveDel())) + require.Equal(t, 1, len(evs.GetUnbondedDel())) + // there should be no other events in the store + require.Nil(t, evs.GetSlashedDel()) + // Assert the contents of the staking event + ev := evs.GetUnbondedDel()[0] + require.NotNil(t, ev) + require.Equal(t, actualDel.MustGetStakingTxHash().String(), ev.StakingTxHash) + require.Equal(t, actualDel.BtcUndelegation.DelegatorUnbondingSig.MustMarshal(), ev.UnbondingTxSig) + }) +} + +func FuzzDeleteBTCStakingEventStore(f *testing.F) { + datagen.AddRandomSeedsToFuzzer(f, 10) + + f.Fuzz(func(t *testing.T, seed int64) { + r := rand.New(rand.NewSource(seed)) + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + // mock BTC light client and BTC checkpoint modules + btclcKeeper := types.NewMockBTCLightClientKeeper(ctrl) + btccKeeper := types.NewMockBtcCheckpointKeeper(ctrl) + ckptKeeper := types.NewMockCheckpointingKeeper(ctrl) + h := NewHelper(t, btclcKeeper, btccKeeper, ckptKeeper) + h.GenAndApplyParams(r) + + // register random number of consumers on Babylon + // and create 1 finality provider for each consumer + randNum := int(datagen.RandomInt(r, 10)) + 1 + var consumerIds []string + for i := 0; i < randNum; i++ { + randomConsumer := registerAndVerifyConsumer(t, r, h) + _, _, _, err := h.CreateConsumerFinalityProvider(r, randomConsumer.ConsumerId) + require.NoError(t, err) + + evs := h.BTCStakingKeeper.GetBTCStakingConsumerIBCPacket(h.Ctx, randomConsumer.ConsumerId) + require.NotNil(t, evs) + require.NotNil(t, evs.GetNewFp()) + require.Equal(t, len(evs.GetNewFp()), 1) + + consumerIds = append(consumerIds, randomConsumer.ConsumerId) + } + + // delete events for only 1 random consumer + h.BTCStakingKeeper.DeleteBTCStakingConsumerIBCPacket(h.Ctx, consumerIds[0]) + + // assert that the events for the deleted consumer are no longer in the store + latestStoreState := h.BTCStakingKeeper.GetBTCStakingConsumerIBCPacket(h.Ctx, consumerIds[0]) + require.Nil(t, latestStoreState) + + // assert that the events for the other consumers are still in the store + for i := 1; i < randNum; i++ { + latestStoreState = h.BTCStakingKeeper.GetBTCStakingConsumerIBCPacket(h.Ctx, consumerIds[i]) + require.NotNil(t, latestStoreState) + require.NotNil(t, latestStoreState.GetNewFp()) + require.Equal(t, len(latestStoreState.GetNewFp()), 1) + } + }) +} + +// helper function: register a random consumer on Babylon and verify the registration +func registerAndVerifyConsumer(t *testing.T, r *rand.Rand, h *Helper) *bsctypes.ConsumerRegister { + // Generate a random consumer register + randomConsumer := datagen.GenRandomConsumerRegister(r) + + // Check that the consumer is not already registered + isRegistered := h.BTCStkConsumerKeeper.IsConsumerRegistered(h.Ctx, randomConsumer.ConsumerId) + require.False(t, isRegistered) + + // Attempt to fetch the consumer from the database + dbConsumer, err := h.BTCStkConsumerKeeper.GetConsumerRegister(h.Ctx, randomConsumer.ConsumerId) + require.Error(t, err) + require.Nil(t, dbConsumer) + + // Register the consumer + h.BTCStkConsumerKeeper.SetConsumerRegister(h.Ctx, randomConsumer) + + // Verify that the consumer is now registered + dbConsumer, err = h.BTCStkConsumerKeeper.GetConsumerRegister(h.Ctx, randomConsumer.ConsumerId) + require.NoError(t, err) + require.NotNil(t, dbConsumer) + require.Equal(t, randomConsumer.ConsumerId, dbConsumer.ConsumerId) + require.Equal(t, randomConsumer.ConsumerName, dbConsumer.ConsumerName) + require.Equal(t, randomConsumer.ConsumerDescription, dbConsumer.ConsumerDescription) + + return dbConsumer +} diff --git a/x/btcstaking/keeper/keeper_test.go b/x/btcstaking/keeper/keeper_test.go index eb91029f7..83785bf0b 100644 --- a/x/btcstaking/keeper/keeper_test.go +++ b/x/btcstaking/keeper/keeper_test.go @@ -120,7 +120,8 @@ func (h *Helper) GenAndApplyCustomParams( func CreateFinalityProvider(r *rand.Rand, t *testing.T) *types.FinalityProvider { fpSK, _, err := datagen.GenRandomBTCKeyPair(r) require.NoError(t, err) - fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, fpSK) + + fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, fpSK, "") require.NoError(t, err) return &types.FinalityProvider{ @@ -135,7 +136,7 @@ func CreateFinalityProvider(r *rand.Rand, t *testing.T) *types.FinalityProvider func (h *Helper) CreateFinalityProvider(r *rand.Rand) (*btcec.PrivateKey, *btcec.PublicKey, *types.FinalityProvider) { fpSK, fpPK, err := datagen.GenRandomBTCKeyPair(r) h.NoError(err) - fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, fpSK) + fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, fpSK, "") h.NoError(err) msgNewFp := types.MsgCreateFinalityProvider{ Addr: fp.Addr, @@ -156,7 +157,7 @@ func (h *Helper) CreateConsumerFinalityProvider(r *rand.Rand, consumerID string) if err != nil { return nil, nil, nil, err } - fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, fpSK) + fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, fpSK, consumerID) if err != nil { return nil, nil, nil, err } diff --git a/x/btcstaking/keeper/msg_server.go b/x/btcstaking/keeper/msg_server.go index b5e48dbb6..57cb7deac 100644 --- a/x/btcstaking/keeper/msg_server.go +++ b/x/btcstaking/keeper/msg_server.go @@ -106,15 +106,9 @@ func (ms msgServer) CreateFinalityProvider(goCtx context.Context, req *types.Msg if consumerID == ctx.ChainID() { ms.SetFinalityProvider(ctx, &fp) } else { - // ensure finality provider does not already exist - if ms.bscKeeper.HasConsumerFinalityProvider(ctx, req.BtcPk) { - return nil, types.ErrFpRegistered + if err := ms.SetConsumerFinalityProvider(ctx, &fp, consumerID); err != nil { + return nil, err } - // Check that consumer is registered in the btcstkconsumer module - if !ms.bscKeeper.IsConsumerRegistered(ctx, consumerID) { - return nil, types.ErrConsumerIDNotRegistered - } - ms.bscKeeper.SetConsumerFinalityProvider(ctx, &fp) } // notify subscriber @@ -168,9 +162,9 @@ func (ms msgServer) EditFinalityProvider(ctx context.Context, req *types.MsgEdit return &types.MsgEditFinalityProviderResponse{}, nil } -// caluculateMinimumUnbondingValue calculates minimum unbonding value basend on current staking output value +// calculateMinimumUnbondingValue calculates minimum unbonding value basend on current staking output value // and params.MinUnbondingRate -func caluculateMinimumUnbondingValue( +func calculateMinimumUnbondingValue( stakingOutput *wire.TxOut, params *types.Params, ) btcutil.Amount { @@ -457,7 +451,7 @@ func (ms msgServer) CreateBTCDelegation(goCtx context.Context, req *types.MsgCre return nil, types.ErrInvalidUnbondingTx.Wrapf("unbonding tx fee must be larger that 0") } - minUnbondingValue := caluculateMinimumUnbondingValue(stakingMsgTx.TxOut[stakingOutputIdx], &vp.Params) + minUnbondingValue := calculateMinimumUnbondingValue(stakingMsgTx.TxOut[stakingOutputIdx], &vp.Params) if btcutil.Amount(unbondingMsgTx.TxOut[0].Value) < minUnbondingValue { return nil, types.ErrInvalidUnbondingTx.Wrapf("unbonding output value must be at least %s, based on staking output", minUnbondingValue) } diff --git a/x/btcstaking/types/btc_staking_consumer_events.go b/x/btcstaking/types/btc_staking_consumer_events.go new file mode 100644 index 000000000..f1c0f205f --- /dev/null +++ b/x/btcstaking/types/btc_staking_consumer_events.go @@ -0,0 +1,103 @@ +package types + +import "fmt" + +func CreateNewFinalityProviderEvent(fp *FinalityProvider) *BTCStakingConsumerEvent { + event := &BTCStakingConsumerEvent{ + Event: &BTCStakingConsumerEvent_NewFp{ + NewFp: &NewFinalityProvider{ + Description: fp.Description, + Commission: fp.Commission.String(), + Addr: fp.Addr, + BtcPkHex: fp.BtcPk.MarshalHex(), + Pop: fp.Pop, + SlashedBabylonHeight: fp.SlashedBabylonHeight, + SlashedBtcHeight: fp.SlashedBtcHeight, + ConsumerId: fp.ConsumerId, + }, + }, + } + + return event +} + +func CreateActiveBTCDelegationEvent(activeDel *BTCDelegation) (*BTCStakingConsumerEvent, error) { + fpBtcPkHexList := make([]string, len(activeDel.FpBtcPkList)) + for i, fpBtcPk := range activeDel.FpBtcPkList { + fpBtcPkHexList[i] = fpBtcPk.MarshalHex() + } + + slashingTxBytes, err := activeDel.SlashingTx.Marshal() + if err != nil { + return nil, fmt.Errorf("failed to marshal SlashingTx: %w", err) + } + + delegatorSlashingSigBytes, err := activeDel.DelegatorSig.Marshal() + if err != nil { + return nil, fmt.Errorf("failed to marshal DelegatorSig: %w", err) + } + + if activeDel.BtcUndelegation.DelegatorUnbondingSig != nil { + return nil, fmt.Errorf("unexpected DelegatorUnbondingSig in active delegation") + } + + unbondingSlashingTxBytes, err := activeDel.BtcUndelegation.SlashingTx.Marshal() + if err != nil { + return nil, fmt.Errorf("failed to marshal BtcUndelegation.SlashingTx: %w", err) + } + + delegatorUnbondingSlashingSigBytes, err := activeDel.BtcUndelegation.DelegatorSlashingSig.Marshal() + if err != nil { + return nil, fmt.Errorf("failed to marshal BtcUndelegation.DelegatorSlashingSig: %w", err) + } + + event := &BTCStakingConsumerEvent{ + Event: &BTCStakingConsumerEvent_ActiveDel{ + ActiveDel: &ActiveBTCDelegation{ + BtcPkHex: activeDel.BtcPk.MarshalHex(), + FpBtcPkList: fpBtcPkHexList, + StartHeight: activeDel.StartHeight, + EndHeight: activeDel.EndHeight, + TotalSat: activeDel.TotalSat, + StakingTx: activeDel.StakingTx, + SlashingTx: slashingTxBytes, + DelegatorSlashingSig: delegatorSlashingSigBytes, + CovenantSigs: activeDel.CovenantSigs, + StakingOutputIdx: activeDel.StakingOutputIdx, + UnbondingTime: activeDel.UnbondingTime, + UndelegationInfo: &BTCUndelegationInfo{ + UnbondingTx: activeDel.BtcUndelegation.UnbondingTx, + SlashingTx: unbondingSlashingTxBytes, + DelegatorSlashingSig: delegatorUnbondingSlashingSigBytes, + CovenantUnbondingSigList: activeDel.BtcUndelegation.CovenantUnbondingSigList, + CovenantSlashingSigs: activeDel.BtcUndelegation.CovenantSlashingSigs, + }, + ParamsVersion: activeDel.ParamsVersion, + }, + }, + } + + return event, nil +} + +func CreateUnbondedBTCDelegationEvent(unbondedDel *BTCDelegation) (*BTCStakingConsumerEvent, error) { + if unbondedDel.BtcUndelegation.DelegatorUnbondingSig == nil { + return nil, fmt.Errorf("missing DelegatorUnbondingSig in unbonded delegation") + } + + unbondingTxSigBytes, err := unbondedDel.BtcUndelegation.DelegatorUnbondingSig.Marshal() + if err != nil { + return nil, fmt.Errorf("failed to marshal DelegatorUnbondingSig: %w", err) + } + + event := &BTCStakingConsumerEvent{ + Event: &BTCStakingConsumerEvent_UnbondedDel{ + UnbondedDel: &UnbondedBTCDelegation{ + StakingTxHash: unbondedDel.MustGetStakingTxHash().String(), + UnbondingTxSig: unbondingTxSigBytes, + }, + }, + } + + return event, nil +} diff --git a/x/btcstaking/types/keys.go b/x/btcstaking/types/keys.go index 74a0748db..54a56cb81 100644 --- a/x/btcstaking/types/keys.go +++ b/x/btcstaking/types/keys.go @@ -24,4 +24,5 @@ var ( VotingPowerDistCacheKey = []byte{0x07} // key prefix for voting power distribution cache PowerDistUpdateKey = []byte{0x08} // key prefix for power distribution update events BTCConsumerDelegatorKey = []byte{0x09} // key prefix for the Consumer BTC delegators + BTCStakingEventKey = []byte{0x0A} // key prefix for the BTC staking events ) diff --git a/x/btcstaking/types/mocked_keepers.go b/x/btcstaking/types/mocked_keepers.go index 71804bf57..7e189f867 100644 --- a/x/btcstaking/types/mocked_keepers.go +++ b/x/btcstaking/types/mocked_keepers.go @@ -207,18 +207,18 @@ func (m *MockBTCStkConsumerKeeper) EXPECT() *MockBTCStkConsumerKeeperMockRecorde } // GetConsumerFinalityProvider mocks base method. -func (m *MockBTCStkConsumerKeeper) GetConsumerFinalityProvider(ctx context.Context, chainID string, fpBTCPK *types.BIP340PubKey) (*FinalityProvider, error) { +func (m *MockBTCStkConsumerKeeper) GetConsumerFinalityProvider(ctx context.Context, consumerID string, fpBTCPK *types.BIP340PubKey) (*FinalityProvider, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetConsumerFinalityProvider", ctx, chainID, fpBTCPK) + ret := m.ctrl.Call(m, "GetConsumerFinalityProvider", ctx, consumerID, fpBTCPK) ret0, _ := ret[0].(*FinalityProvider) ret1, _ := ret[1].(error) return ret0, ret1 } // GetConsumerFinalityProvider indicates an expected call of GetConsumerFinalityProvider. -func (mr *MockBTCStkConsumerKeeperMockRecorder) GetConsumerFinalityProvider(ctx, chainID, fpBTCPK interface{}) *gomock.Call { +func (mr *MockBTCStkConsumerKeeperMockRecorder) GetConsumerFinalityProvider(ctx, consumerID, fpBTCPK interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConsumerFinalityProvider", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).GetConsumerFinalityProvider), ctx, chainID, fpBTCPK) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConsumerFinalityProvider", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).GetConsumerFinalityProvider), ctx, consumerID, fpBTCPK) } // GetConsumerOfFinalityProvider mocks base method. @@ -251,17 +251,17 @@ func (mr *MockBTCStkConsumerKeeperMockRecorder) HasConsumerFinalityProvider(ctx, } // IsConsumerRegistered mocks base method. -func (m *MockBTCStkConsumerKeeper) IsConsumerRegistered(ctx context.Context, chainID string) bool { +func (m *MockBTCStkConsumerKeeper) IsConsumerRegistered(ctx context.Context, consumerID string) bool { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IsConsumerRegistered", ctx, chainID) + ret := m.ctrl.Call(m, "IsConsumerRegistered", ctx, consumerID) ret0, _ := ret[0].(bool) return ret0 } // IsConsumerRegistered indicates an expected call of IsConsumerRegistered. -func (mr *MockBTCStkConsumerKeeperMockRecorder) IsConsumerRegistered(ctx, chainID interface{}) *gomock.Call { +func (mr *MockBTCStkConsumerKeeperMockRecorder) IsConsumerRegistered(ctx, consumerID interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsConsumerRegistered", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).IsConsumerRegistered), ctx, chainID) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsConsumerRegistered", reflect.TypeOf((*MockBTCStkConsumerKeeper)(nil).IsConsumerRegistered), ctx, consumerID) } // SetConsumerFinalityProvider mocks base method. diff --git a/x/btcstaking/types/packet.pb.go b/x/btcstaking/types/packet.pb.go index 0b5873476..f4207e3a4 100644 --- a/x/btcstaking/types/packet.pb.go +++ b/x/btcstaking/types/packet.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - secp256k1 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + _ "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" types "github.com/cosmos/cosmos-sdk/x/staking/types" proto "github.com/cosmos/gogoproto/proto" io "io" @@ -207,8 +207,8 @@ type NewFinalityProvider struct { // commission defines the commission rate of the finality provider. // It forms as a string converted from "cosmossdk.io/math.LegacyDec" Commission string `protobuf:"bytes,2,opt,name=commission,proto3" json:"commission,omitempty"` - // babylon_pk is the Babylon secp256k1 PK of this finality provider - BabylonPk *secp256k1.PubKey `protobuf:"bytes,3,opt,name=babylon_pk,json=babylonPk,proto3" json:"babylon_pk,omitempty"` + // addr is the bech32 address identifier of the finality provider. + Addr string `protobuf:"bytes,3,opt,name=addr,proto3" json:"addr,omitempty"` // btc_pk_hex is the Bitcoin secp256k1 PK of this finality provider // the PK follows encoding in BIP-340 spec in hex format BtcPkHex string `protobuf:"bytes,4,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` @@ -217,19 +217,17 @@ type NewFinalityProvider struct { // master_pub_rand is the master public randomness of the finality provider // encoded as a base58 string MasterPubRand string `protobuf:"bytes,6,opt,name=master_pub_rand,json=masterPubRand,proto3" json:"master_pub_rand,omitempty"` - // registered_epoch is the epoch when this finality provider is registered - RegisteredEpoch uint64 `protobuf:"varint,7,opt,name=registered_epoch,json=registeredEpoch,proto3" json:"registered_epoch,omitempty"` // slashed_babylon_height indicates the Babylon height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - SlashedBabylonHeight uint64 `protobuf:"varint,8,opt,name=slashed_babylon_height,json=slashedBabylonHeight,proto3" json:"slashed_babylon_height,omitempty"` + SlashedBabylonHeight uint64 `protobuf:"varint,7,opt,name=slashed_babylon_height,json=slashedBabylonHeight,proto3" json:"slashed_babylon_height,omitempty"` // slashed_btc_height indicates the BTC height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - SlashedBtcHeight uint64 `protobuf:"varint,9,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` + SlashedBtcHeight uint64 `protobuf:"varint,8,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in Babylon. - ConsumerId string `protobuf:"bytes,10,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` + ConsumerId string `protobuf:"bytes,9,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` } func (m *NewFinalityProvider) Reset() { *m = NewFinalityProvider{} } @@ -279,11 +277,11 @@ func (m *NewFinalityProvider) GetCommission() string { return "" } -func (m *NewFinalityProvider) GetBabylonPk() *secp256k1.PubKey { +func (m *NewFinalityProvider) GetAddr() string { if m != nil { - return m.BabylonPk + return m.Addr } - return nil + return "" } func (m *NewFinalityProvider) GetBtcPkHex() string { @@ -307,13 +305,6 @@ func (m *NewFinalityProvider) GetMasterPubRand() string { return "" } -func (m *NewFinalityProvider) GetRegisteredEpoch() uint64 { - if m != nil { - return m.RegisteredEpoch - } - return 0 -} - func (m *NewFinalityProvider) GetSlashedBabylonHeight() uint64 { if m != nil { return m.SlashedBabylonHeight @@ -718,6 +709,122 @@ func (m *UnbondedBTCDelegation) GetUnbondingTxSig() []byte { return nil } +// BTCStakingConsumerEvent defines the structure for storing BTC staking events +// which will be later sent to consumer chains as IBC packets. +type BTCStakingConsumerEvent struct { + // oneof event represents a mutually exclusive choice among different event types. + // Only one event type can be set within each BTCStakingEvent message instance. + // + // Types that are valid to be assigned to Event: + // *BTCStakingConsumerEvent_NewFp + // *BTCStakingConsumerEvent_ActiveDel + // *BTCStakingConsumerEvent_SlashedDel + // *BTCStakingConsumerEvent_UnbondedDel + Event isBTCStakingConsumerEvent_Event `protobuf_oneof:"event"` +} + +func (m *BTCStakingConsumerEvent) Reset() { *m = BTCStakingConsumerEvent{} } +func (m *BTCStakingConsumerEvent) String() string { return proto.CompactTextString(m) } +func (*BTCStakingConsumerEvent) ProtoMessage() {} +func (*BTCStakingConsumerEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_3ed0d17ad14d6c0e, []int{8} +} +func (m *BTCStakingConsumerEvent) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BTCStakingConsumerEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BTCStakingConsumerEvent.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 *BTCStakingConsumerEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_BTCStakingConsumerEvent.Merge(m, src) +} +func (m *BTCStakingConsumerEvent) XXX_Size() int { + return m.Size() +} +func (m *BTCStakingConsumerEvent) XXX_DiscardUnknown() { + xxx_messageInfo_BTCStakingConsumerEvent.DiscardUnknown(m) +} + +var xxx_messageInfo_BTCStakingConsumerEvent proto.InternalMessageInfo + +type isBTCStakingConsumerEvent_Event interface { + isBTCStakingConsumerEvent_Event() + MarshalTo([]byte) (int, error) + Size() int +} + +type BTCStakingConsumerEvent_NewFp struct { + NewFp *NewFinalityProvider `protobuf:"bytes,1,opt,name=new_fp,json=newFp,proto3,oneof" json:"new_fp,omitempty"` +} +type BTCStakingConsumerEvent_ActiveDel struct { + ActiveDel *ActiveBTCDelegation `protobuf:"bytes,2,opt,name=active_del,json=activeDel,proto3,oneof" json:"active_del,omitempty"` +} +type BTCStakingConsumerEvent_SlashedDel struct { + SlashedDel *SlashedBTCDelegation `protobuf:"bytes,3,opt,name=slashed_del,json=slashedDel,proto3,oneof" json:"slashed_del,omitempty"` +} +type BTCStakingConsumerEvent_UnbondedDel struct { + UnbondedDel *UnbondedBTCDelegation `protobuf:"bytes,4,opt,name=unbonded_del,json=unbondedDel,proto3,oneof" json:"unbonded_del,omitempty"` +} + +func (*BTCStakingConsumerEvent_NewFp) isBTCStakingConsumerEvent_Event() {} +func (*BTCStakingConsumerEvent_ActiveDel) isBTCStakingConsumerEvent_Event() {} +func (*BTCStakingConsumerEvent_SlashedDel) isBTCStakingConsumerEvent_Event() {} +func (*BTCStakingConsumerEvent_UnbondedDel) isBTCStakingConsumerEvent_Event() {} + +func (m *BTCStakingConsumerEvent) GetEvent() isBTCStakingConsumerEvent_Event { + if m != nil { + return m.Event + } + return nil +} + +func (m *BTCStakingConsumerEvent) GetNewFp() *NewFinalityProvider { + if x, ok := m.GetEvent().(*BTCStakingConsumerEvent_NewFp); ok { + return x.NewFp + } + return nil +} + +func (m *BTCStakingConsumerEvent) GetActiveDel() *ActiveBTCDelegation { + if x, ok := m.GetEvent().(*BTCStakingConsumerEvent_ActiveDel); ok { + return x.ActiveDel + } + return nil +} + +func (m *BTCStakingConsumerEvent) GetSlashedDel() *SlashedBTCDelegation { + if x, ok := m.GetEvent().(*BTCStakingConsumerEvent_SlashedDel); ok { + return x.SlashedDel + } + return nil +} + +func (m *BTCStakingConsumerEvent) GetUnbondedDel() *UnbondedBTCDelegation { + if x, ok := m.GetEvent().(*BTCStakingConsumerEvent_UnbondedDel); ok { + return x.UnbondedDel + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*BTCStakingConsumerEvent) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*BTCStakingConsumerEvent_NewFp)(nil), + (*BTCStakingConsumerEvent_ActiveDel)(nil), + (*BTCStakingConsumerEvent_SlashedDel)(nil), + (*BTCStakingConsumerEvent_UnbondedDel)(nil), + } +} + func init() { proto.RegisterType((*ConsumerIBCPacket)(nil), "babylon.btcstaking.v1.ConsumerIBCPacket") proto.RegisterType((*SlashedFinalityProvider)(nil), "babylon.btcstaking.v1.SlashedFinalityProvider") @@ -727,6 +834,7 @@ func init() { proto.RegisterType((*BTCUndelegationInfo)(nil), "babylon.btcstaking.v1.BTCUndelegationInfo") proto.RegisterType((*SlashedBTCDelegation)(nil), "babylon.btcstaking.v1.SlashedBTCDelegation") proto.RegisterType((*UnbondedBTCDelegation)(nil), "babylon.btcstaking.v1.UnbondedBTCDelegation") + proto.RegisterType((*BTCStakingConsumerEvent)(nil), "babylon.btcstaking.v1.BTCStakingConsumerEvent") } func init() { @@ -734,74 +842,76 @@ func init() { } var fileDescriptor_3ed0d17ad14d6c0e = []byte{ - // 1072 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcd, 0x72, 0xe3, 0x44, - 0x17, 0x8d, 0x63, 0x27, 0x13, 0x5f, 0xdb, 0x89, 0x47, 0x49, 0x66, 0x54, 0x33, 0xdf, 0xe7, 0x04, - 0xcf, 0x30, 0x15, 0x60, 0x90, 0x49, 0x80, 0xd9, 0x41, 0x55, 0xec, 0x4c, 0x2a, 0x29, 0x02, 0x71, - 0xc9, 0x0e, 0x54, 0xb1, 0x51, 0xb5, 0xa4, 0xb6, 0xdd, 0x25, 0x5b, 0xdd, 0xa5, 0x6e, 0x39, 0xf6, - 0x5b, 0xb0, 0xe0, 0x89, 0x58, 0xb1, 0x9c, 0x25, 0xec, 0xa8, 0xe4, 0x09, 0x78, 0x03, 0x4a, 0xad, - 0xd6, 0x4f, 0x82, 0x1d, 0x18, 0x96, 0xbe, 0xf7, 0xdc, 0x73, 0xff, 0xce, 0x6d, 0x19, 0x9a, 0x36, - 0xb2, 0xe7, 0x63, 0xea, 0xb7, 0x6c, 0xe1, 0x70, 0x81, 0x3c, 0xe2, 0x0f, 0x5b, 0xd3, 0xc3, 0x16, - 0x43, 0x8e, 0x87, 0x85, 0xc1, 0x02, 0x2a, 0xa8, 0xb6, 0xab, 0x30, 0x46, 0x86, 0x31, 0xa6, 0x87, - 0xcf, 0x9a, 0x0e, 0xe5, 0x13, 0xca, 0x5b, 0x4e, 0x30, 0x67, 0x82, 0xb6, 0x38, 0x76, 0xd8, 0xd1, - 0x97, 0x6f, 0xbc, 0xc3, 0x96, 0x87, 0xe7, 0x3c, 0x0e, 0x7d, 0xf6, 0x52, 0x61, 0x32, 0x6a, 0x1b, - 0x0b, 0x74, 0x98, 0xfc, 0x56, 0xa8, 0xbd, 0x25, 0x45, 0x50, 0xa6, 0x00, 0xaf, 0x16, 0x03, 0x72, - 0xf5, 0x48, 0x5c, 0xd3, 0x86, 0xc7, 0x1d, 0xea, 0xf3, 0x70, 0x82, 0x83, 0xf3, 0x76, 0xa7, 0x2b, - 0x9b, 0xd0, 0xbe, 0x05, 0xe0, 0x63, 0xc4, 0x47, 0xd8, 0xb5, 0x06, 0x4c, 0x2f, 0xec, 0x17, 0x0f, - 0x2a, 0x47, 0x86, 0xb1, 0xb0, 0x27, 0xa3, 0x17, 0x03, 0x4f, 0x89, 0x8f, 0xc6, 0x44, 0xcc, 0xbb, - 0x01, 0x9d, 0x12, 0x17, 0x07, 0x66, 0x59, 0x31, 0x9c, 0xb2, 0xe6, 0x00, 0x9e, 0x2e, 0x41, 0x69, - 0xff, 0x03, 0xb0, 0x85, 0x63, 0x31, 0xcf, 0x1a, 0xe1, 0x99, 0x5e, 0xd8, 0x2f, 0x1c, 0x94, 0xcd, - 0x0d, 0x5b, 0x38, 0x5d, 0xef, 0x0c, 0xcf, 0xb4, 0x4f, 0x61, 0x3b, 0xc0, 0x0e, 0x9d, 0xe2, 0x40, - 0x56, 0x62, 0x45, 0x50, 0xee, 0xe9, 0xab, 0x12, 0x56, 0x4f, 0x5d, 0xa7, 0xac, 0x2d, 0x9c, 0x9e, - 0xd7, 0xfc, 0x65, 0x15, 0xb6, 0xdb, 0xfd, 0x4e, 0x2f, 0x2e, 0x2e, 0x6b, 0xe7, 0x18, 0xd6, 0x7d, - 0x7c, 0x9d, 0xb5, 0xf2, 0xf1, 0x92, 0x56, 0xbe, 0xc3, 0xd7, 0x7f, 0x6b, 0x63, 0xcd, 0xc7, 0xd7, - 0xa7, 0x4c, 0x3b, 0x07, 0x40, 0x8e, 0x20, 0x53, 0x6c, 0xb9, 0x78, 0xac, 0xaf, 0x3e, 0x48, 0x73, - 0x2c, 0x81, 0xed, 0x7e, 0xe7, 0x04, 0x8f, 0xf1, 0x10, 0x09, 0x42, 0x7d, 0xb3, 0x1c, 0x47, 0x9f, - 0xe0, 0xb1, 0x76, 0x01, 0x95, 0x64, 0xb8, 0x11, 0x57, 0x51, 0x72, 0x7d, 0xf2, 0xf0, 0x74, 0xef, - 0x92, 0x25, 0xcb, 0x89, 0xd8, 0x2e, 0xa1, 0x1a, 0xfa, 0x36, 0xf5, 0x5d, 0x45, 0x57, 0x92, 0x74, - 0xaf, 0x97, 0xd0, 0x5d, 0x29, 0xe8, 0x5d, 0xbe, 0x4a, 0xc2, 0x70, 0x82, 0xc7, 0xcd, 0x3f, 0x8b, - 0xb0, 0xbd, 0x60, 0x10, 0xda, 0x5b, 0xa8, 0xb8, 0x98, 0x3b, 0x01, 0x61, 0x51, 0x8c, 0x5c, 0x55, - 0xe5, 0xe8, 0x85, 0x11, 0xab, 0xd5, 0xc8, 0x72, 0x48, 0xb5, 0x1a, 0x27, 0x19, 0xd4, 0xcc, 0xc7, - 0x69, 0x0d, 0x00, 0x87, 0x4e, 0x26, 0x84, 0xf3, 0x88, 0x25, 0xde, 0x64, 0xce, 0xa2, 0x7d, 0x0d, - 0xa0, 0x4a, 0xb7, 0x98, 0xa7, 0x17, 0x65, 0x96, 0xbd, 0x24, 0x4b, 0x7c, 0x37, 0x46, 0x7a, 0x37, - 0x46, 0x37, 0xb4, 0xbf, 0xc1, 0x73, 0xb3, 0xac, 0x42, 0xba, 0xde, 0x3d, 0x41, 0x95, 0xee, 0x09, - 0xea, 0x2b, 0x28, 0x32, 0xca, 0xf4, 0x35, 0x49, 0xbb, 0x6c, 0xe6, 0xdd, 0x80, 0xd2, 0xc1, 0xe5, - 0xa0, 0x4b, 0x39, 0xc7, 0xb2, 0xa8, 0x76, 0xbf, 0x63, 0x46, 0x71, 0xda, 0x2b, 0xd8, 0x9a, 0x20, - 0x2e, 0x70, 0x60, 0xb1, 0xd0, 0xb6, 0x02, 0xe4, 0xbb, 0xfa, 0xba, 0xcc, 0x50, 0x8b, 0xcd, 0xdd, - 0xd0, 0x36, 0x91, 0xef, 0x6a, 0x1f, 0x41, 0x3d, 0xc0, 0x43, 0x12, 0x99, 0xb0, 0x6b, 0x61, 0x46, - 0x9d, 0x91, 0xfe, 0x68, 0xbf, 0x70, 0x50, 0x32, 0xb7, 0x32, 0xfb, 0xdb, 0xc8, 0xac, 0x7d, 0x01, - 0x4f, 0x12, 0x35, 0x24, 0x7d, 0x8f, 0x30, 0x19, 0x8e, 0x84, 0xbe, 0x21, 0x03, 0x76, 0x94, 0xb7, - 0x1d, 0x3b, 0xcf, 0xa4, 0x4f, 0x7b, 0x0d, 0x5a, 0x1a, 0x25, 0x9c, 0x24, 0xa2, 0x2c, 0x23, 0xea, - 0x49, 0x84, 0x70, 0x14, 0x7a, 0x0f, 0x2a, 0x8e, 0xba, 0x71, 0x8b, 0xb8, 0x3a, 0x24, 0x43, 0x57, - 0x67, 0xef, 0x36, 0x7f, 0x2f, 0xc1, 0xf6, 0x02, 0xd5, 0xfe, 0xc3, 0x75, 0xbe, 0x80, 0x4d, 0x75, - 0x93, 0xcc, 0xb3, 0xc6, 0x84, 0x0b, 0x79, 0x17, 0x65, 0xb3, 0x32, 0x88, 0xee, 0xb1, 0xeb, 0x5d, - 0x10, 0x2e, 0xb4, 0x0f, 0xa0, 0xca, 0x05, 0x0a, 0x44, 0x52, 0x63, 0x51, 0xd6, 0x58, 0x91, 0x36, - 0x55, 0xde, 0xff, 0x01, 0xb0, 0xef, 0x26, 0x80, 0x92, 0x04, 0x94, 0xb1, 0xef, 0x2a, 0xf7, 0x73, - 0x28, 0x0b, 0x2a, 0xd0, 0xd8, 0xe2, 0x48, 0xc8, 0xcd, 0x95, 0xcc, 0x0d, 0x69, 0xe8, 0x21, 0x19, - 0xab, 0x36, 0x67, 0x89, 0x99, 0x5c, 0x46, 0xd5, 0x2c, 0x2b, 0x4b, 0x7f, 0x16, 0x75, 0x2e, 0xa7, - 0xa1, 0xfc, 0x8f, 0xa4, 0x1f, 0x12, 0x53, 0x7f, 0x16, 0x8d, 0xdf, 0x8d, 0xfb, 0xa5, 0x81, 0x95, - 0x42, 0x39, 0x19, 0xca, 0xf1, 0x57, 0xcd, 0x9d, 0xd4, 0xdb, 0x53, 0xce, 0x1e, 0x19, 0x6a, 0x57, - 0x50, 0x8b, 0x9e, 0x1e, 0x1f, 0xf9, 0x22, 0xc2, 0x72, 0xbd, 0x2c, 0xaf, 0xee, 0xb3, 0x25, 0x82, - 0xea, 0x28, 0xec, 0xb1, 0x8b, 0x58, 0xc4, 0x44, 0x86, 0x3e, 0x12, 0x61, 0x80, 0xb9, 0x59, 0x4d, - 0x68, 0x7a, 0x64, 0xc8, 0xe5, 0x56, 0x55, 0x33, 0x34, 0x14, 0x2c, 0x14, 0x16, 0x71, 0x67, 0x72, - 0x5d, 0x35, 0xb3, 0xae, 0x3c, 0x97, 0xd2, 0x71, 0xee, 0xce, 0xb4, 0x0f, 0x61, 0x33, 0xbe, 0x5b, - 0xd9, 0x1c, 0x99, 0x60, 0xbd, 0x26, 0x91, 0xb5, 0xd4, 0xda, 0x27, 0x13, 0xac, 0xfd, 0x00, 0x8f, - 0x43, 0xdf, 0x4d, 0x77, 0x6a, 0x11, 0x7f, 0x40, 0xf5, 0x4d, 0x79, 0x00, 0xcb, 0x1e, 0xb0, 0x76, - 0xbf, 0x73, 0x95, 0x0b, 0x39, 0xf7, 0x07, 0xd4, 0xac, 0x87, 0xf7, 0x2c, 0x51, 0x7e, 0x86, 0x02, - 0x34, 0xe1, 0xd6, 0x14, 0x07, 0xf2, 0x9a, 0xb7, 0xe2, 0xfc, 0xb1, 0xf5, 0xfb, 0xd8, 0xd8, 0xfc, - 0xb9, 0x28, 0x1f, 0xe5, 0xfb, 0x84, 0x91, 0x30, 0x72, 0xe5, 0xc7, 0xea, 0xaa, 0x26, 0x4f, 0x51, - 0xbc, 0x9c, 0x37, 0xf0, 0x34, 0x5b, 0x4e, 0x06, 0x8e, 0xb6, 0xb3, 0x2a, 0xd1, 0xbb, 0xa9, 0xfb, - 0x2a, 0xf1, 0x46, 0xeb, 0x71, 0xe0, 0x79, 0xba, 0x9e, 0x3b, 0x61, 0xb1, 0x4a, 0xe3, 0x17, 0xf7, - 0xe5, 0xb2, 0x17, 0x37, 0xd9, 0x8e, 0x6c, 0x5b, 0x4f, 0x88, 0xf2, 0x09, 0xa4, 0xb0, 0xef, 0x49, - 0xab, 0xf4, 0x1e, 0xd2, 0x5a, 0x7b, 0x40, 0x5a, 0x03, 0x78, 0x92, 0x49, 0x2b, 0x17, 0xc4, 0xf5, - 0xf5, 0xff, 0xa8, 0xb1, 0x9d, 0x54, 0x63, 0x59, 0x1a, 0xde, 0x9c, 0xc0, 0xce, 0xa2, 0x6f, 0x4b, - 0xf4, 0xc4, 0x65, 0x07, 0x65, 0x8d, 0x10, 0x1f, 0xa9, 0xbb, 0xaf, 0xa5, 0x57, 0x75, 0x86, 0xf8, - 0xe8, 0x7d, 0x3f, 0xcd, 0x04, 0x76, 0x17, 0x7e, 0x7b, 0xfe, 0x75, 0xbe, 0x03, 0xa8, 0xe7, 0xe5, - 0x92, 0x13, 0xc1, 0x66, 0x4e, 0x32, 0x3d, 0x32, 0x6c, 0x5f, 0xfc, 0x7a, 0xd3, 0x28, 0xbc, 0xbb, - 0x69, 0x14, 0xfe, 0xb8, 0x69, 0x14, 0x7e, 0xba, 0x6d, 0xac, 0xbc, 0xbb, 0x6d, 0xac, 0xfc, 0x76, - 0xdb, 0x58, 0xf9, 0xf1, 0x68, 0x48, 0xc4, 0x28, 0xb4, 0x0d, 0x87, 0x4e, 0x5a, 0x6a, 0x8a, 0xce, - 0x08, 0x11, 0x3f, 0xf9, 0xd1, 0x9a, 0xe5, 0xff, 0x2d, 0x89, 0x39, 0xc3, 0xdc, 0x5e, 0x97, 0x7f, - 0x93, 0x3e, 0xff, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x20, 0x21, 0xce, 0x4d, 0xf6, 0x09, 0x00, 0x00, + // 1102 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4d, 0x73, 0x1a, 0x47, + 0x13, 0x66, 0x05, 0xfa, 0xa0, 0x01, 0x59, 0x5e, 0x49, 0xd6, 0x96, 0xfd, 0xbe, 0x58, 0xc1, 0x8e, + 0x4b, 0x95, 0x38, 0x10, 0x29, 0x89, 0x6f, 0x39, 0x08, 0x64, 0x15, 0xaa, 0x28, 0x16, 0x59, 0x50, + 0x52, 0x95, 0xcb, 0xd6, 0xec, 0xee, 0x00, 0x53, 0xc0, 0xcc, 0xd6, 0xce, 0x80, 0xd0, 0xbf, 0xc8, + 0x21, 0xa7, 0xfc, 0x9c, 0x9c, 0x72, 0xf4, 0x2d, 0xc9, 0x2d, 0x25, 0xfd, 0x91, 0xd4, 0xce, 0xce, + 0x7e, 0x80, 0x41, 0x09, 0xb9, 0x41, 0xf7, 0xd3, 0xdf, 0x4f, 0x4f, 0x2f, 0x54, 0x6c, 0x64, 0xdf, + 0x0e, 0x19, 0xad, 0xd9, 0xc2, 0xe1, 0x02, 0x0d, 0x08, 0xed, 0xd5, 0x26, 0xc7, 0x35, 0x0f, 0x39, + 0x03, 0x2c, 0xaa, 0x9e, 0xcf, 0x04, 0xd3, 0xf7, 0x15, 0xa6, 0x9a, 0x60, 0xaa, 0x93, 0xe3, 0xa7, + 0x15, 0x87, 0xf1, 0x11, 0xe3, 0x35, 0xc7, 0xbf, 0xf5, 0x04, 0xab, 0x71, 0xec, 0x78, 0x27, 0x5f, + 0xbd, 0x19, 0x1c, 0xd7, 0x06, 0xf8, 0x96, 0x87, 0xa6, 0x4f, 0x5f, 0x2a, 0x4c, 0xe2, 0xda, 0xc6, + 0x02, 0x1d, 0x47, 0xff, 0x15, 0xea, 0xf9, 0x92, 0x24, 0x98, 0xa7, 0x00, 0xaf, 0x16, 0x03, 0x52, + 0xf9, 0x48, 0x5c, 0xc5, 0x86, 0xc7, 0x0d, 0x46, 0xf9, 0x78, 0x84, 0xfd, 0x8b, 0x7a, 0xa3, 0x25, + 0x8b, 0xd0, 0xbf, 0x05, 0xe0, 0x43, 0xc4, 0xfb, 0xd8, 0xb5, 0xba, 0x9e, 0xa1, 0x1d, 0x66, 0x8f, + 0x0a, 0x27, 0xd5, 0xea, 0xc2, 0x9a, 0xaa, 0xed, 0x10, 0x78, 0x4e, 0x28, 0x1a, 0x12, 0x71, 0xdb, + 0xf2, 0xd9, 0x84, 0xb8, 0xd8, 0x37, 0xf3, 0xca, 0xc3, 0xb9, 0x57, 0xe9, 0xc2, 0xc1, 0x12, 0x94, + 0xfe, 0x3f, 0x00, 0x5b, 0x38, 0x96, 0x37, 0xb0, 0xfa, 0x78, 0x6a, 0x68, 0x87, 0xda, 0x51, 0xde, + 0xdc, 0xb2, 0x85, 0xd3, 0x1a, 0x34, 0xf1, 0x54, 0xff, 0x0c, 0x76, 0x7d, 0xec, 0xb0, 0x09, 0xf6, + 0x65, 0x26, 0x56, 0x00, 0xe5, 0x03, 0x63, 0x4d, 0xc2, 0x76, 0x62, 0xd5, 0xb9, 0x57, 0x17, 0x4e, + 0x7b, 0x50, 0xf9, 0x75, 0x0d, 0x76, 0xeb, 0x9d, 0x46, 0x3b, 0x4c, 0x2e, 0x29, 0xe7, 0x14, 0x36, + 0x28, 0xbe, 0x49, 0x4a, 0xf9, 0x64, 0x49, 0x29, 0xef, 0xf0, 0xcd, 0x07, 0x65, 0xac, 0x53, 0x7c, + 0x73, 0xee, 0xe9, 0x17, 0x00, 0xc8, 0x11, 0x64, 0x82, 0x2d, 0x17, 0x0f, 0x8d, 0xb5, 0x07, 0xdd, + 0x9c, 0x4a, 0x60, 0xbd, 0xd3, 0x38, 0xc3, 0x43, 0xdc, 0x43, 0x82, 0x30, 0x6a, 0xe6, 0x43, 0xeb, + 0x33, 0x3c, 0xd4, 0x2f, 0xa1, 0x10, 0x35, 0x37, 0xf0, 0x95, 0x95, 0xbe, 0x3e, 0x7d, 0xb8, 0xbb, + 0xb3, 0xce, 0xa2, 0xe1, 0x04, 0xde, 0xae, 0xa0, 0x38, 0xa6, 0x36, 0xa3, 0xae, 0x72, 0x97, 0x93, + 0xee, 0x5e, 0x2f, 0x71, 0x77, 0xad, 0xa0, 0xb3, 0xfe, 0x0a, 0x91, 0x87, 0x33, 0x3c, 0xac, 0xfc, + 0x92, 0x85, 0xdd, 0x05, 0x8d, 0xd0, 0xdf, 0x42, 0xc1, 0xc5, 0xdc, 0xf1, 0x89, 0x17, 0xd8, 0xc8, + 0x51, 0x15, 0x4e, 0x5e, 0x54, 0x43, 0xb6, 0x56, 0x93, 0x18, 0x92, 0xad, 0xd5, 0xb3, 0x04, 0x6a, + 0xa6, 0xed, 0xf4, 0x32, 0x80, 0xc3, 0x46, 0x23, 0xc2, 0x79, 0xe0, 0x25, 0x9c, 0x64, 0x4a, 0xa2, + 0xeb, 0x90, 0x43, 0xae, 0xeb, 0x1b, 0x59, 0xa9, 0x91, 0xbf, 0xe7, 0x48, 0x92, 0x9b, 0x23, 0xc9, + 0xd7, 0x90, 0xf5, 0x98, 0x67, 0xac, 0xcb, 0x84, 0x96, 0xf5, 0xb1, 0xe5, 0x33, 0xd6, 0xbd, 0xea, + 0xb6, 0x18, 0xe7, 0x58, 0x06, 0xaa, 0x77, 0x1a, 0x66, 0x60, 0xa7, 0xbf, 0x82, 0x47, 0x23, 0xc4, + 0x05, 0xf6, 0x2d, 0x6f, 0x6c, 0x5b, 0x3e, 0xa2, 0xae, 0xb1, 0x21, 0x23, 0x94, 0x42, 0x71, 0x6b, + 0x6c, 0x9b, 0x88, 0xba, 0xfa, 0x97, 0xf0, 0x24, 0x1a, 0x9b, 0x0a, 0x61, 0xf5, 0x31, 0xe9, 0xf5, + 0x85, 0xb1, 0x79, 0xa8, 0x1d, 0xe5, 0xcc, 0x3d, 0xa5, 0xad, 0x87, 0xca, 0xa6, 0xd4, 0xe9, 0xaf, + 0x41, 0x8f, 0xad, 0x84, 0x13, 0x59, 0x6c, 0x49, 0x8b, 0x9d, 0xc8, 0x42, 0x38, 0x0a, 0xfd, 0x1c, + 0x0a, 0x8e, 0x5a, 0x46, 0x8b, 0xb8, 0x46, 0x3e, 0xea, 0x8e, 0xda, 0x4f, 0xb7, 0xf2, 0x67, 0x0e, + 0x76, 0x17, 0xd0, 0xeb, 0x1f, 0xd6, 0xe8, 0x05, 0x6c, 0xab, 0xe5, 0xf1, 0x06, 0xd6, 0x90, 0x70, + 0x21, 0x09, 0x9c, 0x37, 0x0b, 0xdd, 0x60, 0x71, 0x5a, 0x83, 0x4b, 0xc2, 0x85, 0xfe, 0x11, 0x14, + 0xb9, 0x40, 0xbe, 0x88, 0x72, 0xcc, 0xca, 0x1c, 0x0b, 0x52, 0xa6, 0xd2, 0xfb, 0x3f, 0x00, 0xa6, + 0x6e, 0x04, 0xc8, 0x49, 0x40, 0x1e, 0x53, 0x57, 0xa9, 0x9f, 0x41, 0x5e, 0x30, 0x81, 0x86, 0x16, + 0x47, 0x42, 0x8e, 0x23, 0x67, 0x6e, 0x49, 0x41, 0x1b, 0x49, 0x5b, 0x35, 0x0e, 0x4b, 0x4c, 0x65, + 0x87, 0x8b, 0x66, 0x5e, 0x49, 0x3a, 0xd3, 0xa0, 0x72, 0xd9, 0x0d, 0xa5, 0xdf, 0x94, 0x7a, 0x88, + 0x44, 0x9d, 0x69, 0xd0, 0x7e, 0x37, 0xac, 0x97, 0xf9, 0x56, 0x0c, 0xe5, 0xa4, 0x27, 0x9b, 0x59, + 0x34, 0xf7, 0x62, 0x6d, 0x5b, 0x29, 0xdb, 0xa4, 0xa7, 0x5f, 0x43, 0x29, 0x78, 0x23, 0x28, 0xa2, + 0x22, 0xc0, 0x72, 0x23, 0x2f, 0xd7, 0xe3, 0xf3, 0x25, 0x2c, 0x69, 0x28, 0xec, 0xa9, 0x8b, 0xbc, + 0xc0, 0x13, 0xe9, 0x51, 0x24, 0xc6, 0x3e, 0xe6, 0x66, 0x31, 0x72, 0xd3, 0x26, 0x3d, 0x2e, 0xa7, + 0xaa, 0x8a, 0x61, 0x63, 0xe1, 0x8d, 0x85, 0x45, 0xdc, 0xa9, 0x01, 0x87, 0xda, 0x51, 0xc9, 0xdc, + 0x51, 0x9a, 0x2b, 0xa9, 0xb8, 0x70, 0xa7, 0xfa, 0xc7, 0xb0, 0x1d, 0x2e, 0x98, 0x2c, 0x8e, 0x8c, + 0xb0, 0x51, 0x92, 0xc8, 0x52, 0x2c, 0xed, 0x90, 0x11, 0xd6, 0x7f, 0x80, 0xc7, 0x63, 0xea, 0xc6, + 0x33, 0xb5, 0x08, 0xed, 0x32, 0x63, 0x5b, 0xb2, 0x7a, 0xd9, 0x4b, 0x53, 0xef, 0x34, 0xae, 0x53, + 0x26, 0x17, 0xb4, 0xcb, 0xcc, 0x9d, 0xf1, 0x9c, 0x24, 0x88, 0xef, 0x21, 0x1f, 0x8d, 0xb8, 0x35, + 0xc1, 0xbe, 0x5c, 0xbb, 0x47, 0x61, 0xfc, 0x50, 0xfa, 0x7d, 0x28, 0xac, 0xfc, 0x9c, 0x95, 0xaf, + 0xe7, 0xbc, 0xc3, 0x80, 0x18, 0xa9, 0xf4, 0x43, 0x76, 0x15, 0xa3, 0x37, 0x23, 0x1c, 0xce, 0x1b, + 0x38, 0x48, 0x86, 0x93, 0x80, 0x83, 0xe9, 0xac, 0x49, 0xf4, 0x7e, 0xac, 0xbe, 0x8e, 0xb4, 0xc1, + 0x78, 0x1c, 0x78, 0x16, 0x8f, 0x67, 0xc6, 0x2c, 0x64, 0x69, 0xf8, 0x34, 0xbe, 0x5c, 0xf6, 0x34, + 0x46, 0xd3, 0x91, 0x65, 0x1b, 0x91, 0xa3, 0x74, 0x00, 0x49, 0xec, 0x39, 0x6a, 0xe5, 0x56, 0xa0, + 0xd6, 0xfa, 0x03, 0xd4, 0xea, 0xc2, 0x93, 0x84, 0x5a, 0x29, 0x23, 0x6e, 0x6c, 0xfc, 0x47, 0x8e, + 0xed, 0xc5, 0x1c, 0x4b, 0xc2, 0xf0, 0xca, 0x08, 0xf6, 0x16, 0x1d, 0x81, 0xe0, 0xdd, 0x4a, 0x16, + 0xca, 0xea, 0x23, 0xde, 0x57, 0x7b, 0x5f, 0x8a, 0xb7, 0xaa, 0x89, 0x78, 0x7f, 0xd5, 0x1b, 0x4a, + 0x60, 0x7f, 0xe1, 0x91, 0xf8, 0xd7, 0xf1, 0x8e, 0x60, 0x27, 0x4d, 0x97, 0x14, 0x09, 0xb6, 0x53, + 0x94, 0x69, 0x93, 0x5e, 0xe5, 0xf7, 0x35, 0x38, 0x48, 0xce, 0x75, 0xf4, 0x15, 0xf2, 0x76, 0x82, + 0xa9, 0xd0, 0x1b, 0xa9, 0x93, 0xad, 0xad, 0x76, 0xb2, 0x9b, 0x99, 0xe8, 0x68, 0x7f, 0x33, 0x77, + 0xb4, 0xb5, 0xd5, 0x8e, 0x76, 0x33, 0x93, 0x3e, 0xdb, 0xef, 0xe6, 0xcf, 0xb6, 0xb6, 0xe2, 0xd9, + 0x6e, 0x66, 0x66, 0x0e, 0xf7, 0x77, 0x1f, 0x1c, 0x6e, 0x6d, 0xd5, 0xc3, 0xdd, 0xcc, 0xcc, 0x9c, + 0xee, 0xfa, 0x26, 0xac, 0xe3, 0xa0, 0x7b, 0xf5, 0xcb, 0xdf, 0xee, 0xca, 0xda, 0xfb, 0xbb, 0xb2, + 0xf6, 0xd7, 0x5d, 0x59, 0xfb, 0xe9, 0xbe, 0x9c, 0x79, 0x7f, 0x5f, 0xce, 0xfc, 0x71, 0x5f, 0xce, + 0xfc, 0x78, 0xd2, 0x23, 0xa2, 0x3f, 0xb6, 0xab, 0x0e, 0x1b, 0xd5, 0x54, 0x24, 0xa7, 0x8f, 0x08, + 0x8d, 0xfe, 0xd4, 0xa6, 0xe9, 0x0f, 0x46, 0x71, 0xeb, 0x61, 0x6e, 0x6f, 0xc8, 0x2f, 0xc5, 0x2f, + 0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x51, 0x29, 0xdc, 0xa2, 0xf9, 0x0a, 0x00, 0x00, } func (m *ConsumerIBCPacket) Marshal() (dAtA []byte, err error) { @@ -982,21 +1092,16 @@ func (m *NewFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.ConsumerId) i = encodeVarintPacket(dAtA, i, uint64(len(m.ConsumerId))) i-- - dAtA[i] = 0x52 + dAtA[i] = 0x4a } if m.SlashedBtcHeight != 0 { i = encodeVarintPacket(dAtA, i, uint64(m.SlashedBtcHeight)) i-- - dAtA[i] = 0x48 + dAtA[i] = 0x40 } if m.SlashedBabylonHeight != 0 { i = encodeVarintPacket(dAtA, i, uint64(m.SlashedBabylonHeight)) i-- - dAtA[i] = 0x40 - } - if m.RegisteredEpoch != 0 { - i = encodeVarintPacket(dAtA, i, uint64(m.RegisteredEpoch)) - i-- dAtA[i] = 0x38 } if len(m.MasterPubRand) > 0 { @@ -1025,15 +1130,10 @@ func (m *NewFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x22 } - if m.BabylonPk != nil { - { - size, err := m.BabylonPk.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPacket(dAtA, i, uint64(size)) - } + if len(m.Addr) > 0 { + i -= len(m.Addr) + copy(dAtA[i:], m.Addr) + i = encodeVarintPacket(dAtA, i, uint64(len(m.Addr))) i-- dAtA[i] = 0x1a } @@ -1328,6 +1428,122 @@ func (m *UnbondedBTCDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *BTCStakingConsumerEvent) 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 *BTCStakingConsumerEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BTCStakingConsumerEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Event != nil { + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *BTCStakingConsumerEvent_NewFp) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BTCStakingConsumerEvent_NewFp) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.NewFp != nil { + { + size, err := m.NewFp.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *BTCStakingConsumerEvent_ActiveDel) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BTCStakingConsumerEvent_ActiveDel) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ActiveDel != nil { + { + size, err := m.ActiveDel.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *BTCStakingConsumerEvent_SlashedDel) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BTCStakingConsumerEvent_SlashedDel) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SlashedDel != nil { + { + size, err := m.SlashedDel.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *BTCStakingConsumerEvent_UnbondedDel) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BTCStakingConsumerEvent_UnbondedDel) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.UnbondedDel != nil { + { + size, err := m.UnbondedDel.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPacket(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} func encodeVarintPacket(dAtA []byte, offset int, v uint64) int { offset -= sovPacket(v) base := offset @@ -1418,8 +1634,8 @@ func (m *NewFinalityProvider) Size() (n int) { if l > 0 { n += 1 + l + sovPacket(uint64(l)) } - if m.BabylonPk != nil { - l = m.BabylonPk.Size() + l = len(m.Addr) + if l > 0 { n += 1 + l + sovPacket(uint64(l)) } l = len(m.BtcPkHex) @@ -1434,9 +1650,6 @@ func (m *NewFinalityProvider) Size() (n int) { if l > 0 { n += 1 + l + sovPacket(uint64(l)) } - if m.RegisteredEpoch != 0 { - n += 1 + sovPacket(uint64(m.RegisteredEpoch)) - } if m.SlashedBabylonHeight != 0 { n += 1 + sovPacket(uint64(m.SlashedBabylonHeight)) } @@ -1580,6 +1793,67 @@ func (m *UnbondedBTCDelegation) Size() (n int) { return n } +func (m *BTCStakingConsumerEvent) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Event != nil { + n += m.Event.Size() + } + return n +} + +func (m *BTCStakingConsumerEvent_NewFp) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NewFp != nil { + l = m.NewFp.Size() + n += 1 + l + sovPacket(uint64(l)) + } + return n +} +func (m *BTCStakingConsumerEvent_ActiveDel) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ActiveDel != nil { + l = m.ActiveDel.Size() + n += 1 + l + sovPacket(uint64(l)) + } + return n +} +func (m *BTCStakingConsumerEvent_SlashedDel) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SlashedDel != nil { + l = m.SlashedDel.Size() + n += 1 + l + sovPacket(uint64(l)) + } + return n +} +func (m *BTCStakingConsumerEvent_UnbondedDel) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.UnbondedDel != nil { + l = m.UnbondedDel.Size() + n += 1 + l + sovPacket(uint64(l)) + } + return n +} + func sovPacket(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2069,9 +2343,9 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BabylonPk", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowPacket @@ -2081,27 +2355,23 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthPacket } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthPacket } if postIndex > l { return io.ErrUnexpectedEOF } - if m.BabylonPk == nil { - m.BabylonPk = &secp256k1.PubKey{} - } - if err := m.BabylonPk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Addr = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { @@ -2204,25 +2474,6 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { m.MasterPubRand = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RegisteredEpoch", wireType) - } - m.RegisteredEpoch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPacket - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RegisteredEpoch |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SlashedBabylonHeight", wireType) } @@ -2241,7 +2492,7 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { break } } - case 9: + case 8: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SlashedBtcHeight", wireType) } @@ -2260,7 +2511,7 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { break } } - case 10: + case 9: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } @@ -3197,6 +3448,196 @@ func (m *UnbondedBTCDelegation) Unmarshal(dAtA []byte) error { } return nil } +func (m *BTCStakingConsumerEvent) 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 ErrIntOverflowPacket + } + 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: BTCStakingConsumerEvent: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BTCStakingConsumerEvent: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewFp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &NewFinalityProvider{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &BTCStakingConsumerEvent_NewFp{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ActiveDel", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ActiveBTCDelegation{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &BTCStakingConsumerEvent_ActiveDel{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashedDel", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SlashedBTCDelegation{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &BTCStakingConsumerEvent_SlashedDel{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondedDel", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &UnbondedBTCDelegation{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &BTCStakingConsumerEvent_UnbondedDel{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPacket(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPacket + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipPacket(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/finality/keeper/grpc_query_test.go b/x/finality/keeper/grpc_query_test.go index e756ead0a..3de56cd85 100644 --- a/x/finality/keeper/grpc_query_test.go +++ b/x/finality/keeper/grpc_query_test.go @@ -198,9 +198,10 @@ func FuzzListPubRandCommit(f *testing.F) { sk, _, err := datagen.GenRandomBTCKeyPair(r) bip340PK := bbn.NewBIP340PubKeyFromBTCPK(sk.PubKey()) require.NoError(t, err) - + bbnSK, _, err := datagen.GenRandomSecp256k1KeyPair(r) + require.NoError(t, err) // register finality provider - fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, sk) + fp, err := datagen.GenRandomCustomFinalityProvider(r, sk, bbnSK, "") require.NoError(t, err) bsKeeper.EXPECT().GetFinalityProvider(gomock.Any(), gomock.Eq(bip340PK.MustMarshal())).Return(fp, nil).AnyTimes() bsKeeper.EXPECT().HasFinalityProvider(gomock.Any(), gomock.Eq(bip340PK.MustMarshal())).Return(true).AnyTimes() diff --git a/x/finality/keeper/msg_server_test.go b/x/finality/keeper/msg_server_test.go index 1401db82e..07a799904 100644 --- a/x/finality/keeper/msg_server_test.go +++ b/x/finality/keeper/msg_server_test.go @@ -107,7 +107,9 @@ func FuzzAddFinalitySig(f *testing.F) { // create and register a random finality provider btcSK, btcPK, err := datagen.GenRandomBTCKeyPair(r) require.NoError(t, err) - fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, btcSK) + bbnSK, _, err := datagen.GenRandomSecp256k1KeyPair(r) + require.NoError(t, err) + fp, err := datagen.GenRandomCustomFinalityProvider(r, btcSK, bbnSK, "") require.NoError(t, err) fpBTCPK := bbn.NewBIP340PubKeyFromBTCPK(btcPK) fpBTCPKBytes := fpBTCPK.MustMarshal() @@ -213,7 +215,9 @@ func TestVoteForConflictingHashShouldRetrieveEvidenceAndSlash(t *testing.T) { // create and register a random finality provider btcSK, btcPK, err := datagen.GenRandomBTCKeyPair(r) require.NoError(t, err) - fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, btcSK) + bbnSK, _, err := datagen.GenRandomSecp256k1KeyPair(r) + require.NoError(t, err) + fp, err := datagen.GenRandomCustomFinalityProvider(r, btcSK, bbnSK, "") require.NoError(t, err) fpBTCPK := bbn.NewBIP340PubKeyFromBTCPK(btcPK) fpBTCPKBytes := fpBTCPK.MustMarshal() diff --git a/x/finality/keeper/votes_bench_test.go b/x/finality/keeper/votes_bench_test.go index ec35ffcdc..05ac0bae2 100644 --- a/x/finality/keeper/votes_bench_test.go +++ b/x/finality/keeper/votes_bench_test.go @@ -31,7 +31,9 @@ func benchmarkAddFinalitySig(b *testing.B) { require.NoError(b, err) fpBTCPK := bbn.NewBIP340PubKeyFromBTCPK(btcPK) fpBTCPKBytes := fpBTCPK.MustMarshal() - fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, btcSK) + bbnSK, _, err := datagen.GenRandomSecp256k1KeyPair(r) + require.NoError(b, err) + fp, err := datagen.GenRandomCustomFinalityProvider(r, btcSK, bbnSK, "") require.NoError(b, err) // register the finality provider diff --git a/x/zoneconcierge/abci.go b/x/zoneconcierge/abci.go index 7ea1514bb..7ae1855e0 100644 --- a/x/zoneconcierge/abci.go +++ b/x/zoneconcierge/abci.go @@ -19,5 +19,7 @@ func BeginBlocker(ctx context.Context, k keeper.Keeper) error { func EndBlocker(ctx context.Context, k keeper.Keeper) ([]abci.ValidatorUpdate, error) { defer telemetry.ModuleMeasureSince(types.ModuleName, time.Now(), telemetry.MetricKeyEndBlocker) + + k.BroadcastBTCStakingConsumerEvents(ctx) return []abci.ValidatorUpdate{}, nil } diff --git a/x/zoneconcierge/keeper/ibc_channels.go b/x/zoneconcierge/keeper/ibc_channels.go index d1ad90dc6..a2b263528 100644 --- a/x/zoneconcierge/keeper/ibc_channels.go +++ b/x/zoneconcierge/keeper/ibc_channels.go @@ -2,6 +2,7 @@ package keeper import ( "context" + sdk "github.com/cosmos/cosmos-sdk/types" channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" ) @@ -29,6 +30,37 @@ func (k Keeper) GetAllOpenZCChannels(ctx context.Context) []channeltypes.Identif return openZCChannels } +// MapClientIDToChannels creates a map of IBC client IDs to their corresponding channels +func (k Keeper) MapClientIDToChannels(ctx context.Context) map[string][]channeltypes.IdentifiedChannel { + openZCChannels := k.GetAllOpenZCChannels(ctx) + clientChannelMap := make(map[string][]channeltypes.IdentifiedChannel) + sdkCtx := sdk.UnwrapSDKContext(ctx) + + for _, channel := range openZCChannels { + ibcClientID, err := k.getIBCClientID(ctx, channel) + if err != nil { + k.Logger(sdkCtx).Error("Failed to get IBC client ID, skipping channel", "channelID", channel.ChannelId, "error", err) + continue + } + + clientChannelMap[ibcClientID] = append(clientChannelMap[ibcClientID], channel) + } + + return clientChannelMap +} + +// getIBCClientID gets the IBC client ID associated with the given channel +func (k Keeper) getIBCClientID(ctx context.Context, channel channeltypes.IdentifiedChannel) (string, error) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + // get clientState under this channel + clientID, _, err := k.channelKeeper.GetChannelClientState(sdkCtx, channel.PortId, channel.ChannelId) + if err != nil { + return "", err + } + + return clientID, nil +} + // isChannelUninitialized checks whether the channel is not initilialised yet // it's done by checking whether the packet sequence number is 1 (the first sequence number) or not func (k Keeper) isChannelUninitialized(ctx context.Context, channel channeltypes.IdentifiedChannel) bool { diff --git a/x/zoneconcierge/keeper/ibc_packet_btc_staking_consumer_event.go b/x/zoneconcierge/keeper/ibc_packet_btc_staking_consumer_event.go new file mode 100644 index 000000000..1a9a12714 --- /dev/null +++ b/x/zoneconcierge/keeper/ibc_packet_btc_staking_consumer_event.go @@ -0,0 +1,51 @@ +package keeper + +import ( + "context" + + "github.com/babylonchain/babylon/x/zoneconcierge/types" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// BroadcastBTCStakingConsumerEvents retrieves all BTC staking consumer events from the event store, +// sends them to corresponding consumers via open IBC channels, and then deletes the events from the store. +func (k Keeper) BroadcastBTCStakingConsumerEvents( + ctx context.Context, +) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + + // Retrieve all BTC staking consumer events. + consumerIBCPacketMap := k.bsKeeper.GetAllBTCStakingConsumerIBCPackets(ctx) + + // Map client IDs to their corresponding open channels. + clientChannelMap := k.MapClientIDToChannels(ctx) + + // Iterate through all consumer events and send them to the corresponding open IBC channel. + for consumerID, ibcPacket := range consumerIBCPacketMap { + // Check if there are open channels for the current consumer ID. + channels, ok := clientChannelMap[consumerID] + if !ok { + k.Logger(sdkCtx).Error("No channels found for clientID", "clientID", consumerID) + continue + } + + // Prepare the packet for ZoneConcierge. + zcPacket := &types.ZoneconciergePacketData{ + Packet: &types.ZoneconciergePacketData_BtcStaking{ + BtcStaking: ibcPacket, + }, + } + + // Iterate through the list of channels and send the IBC packet to each. + for _, channel := range channels { + // Send the IBC packet. + if err := k.SendIBCPacket(ctx, channel, zcPacket); err != nil { + k.Logger(sdkCtx).Error("Failed to send BTC staking consumer events", "clientID", consumerID, "channelID", channel.ChannelId, "error", err) + continue + } + } + + // Delete the events for the current consumer ID from the store after successful transmission. + k.bsKeeper.DeleteBTCStakingConsumerIBCPacket(ctx, consumerID) + } +} diff --git a/x/zoneconcierge/types/expected_keepers.go b/x/zoneconcierge/types/expected_keepers.go index 5ff831980..eea165dcf 100644 --- a/x/zoneconcierge/types/expected_keepers.go +++ b/x/zoneconcierge/types/expected_keepers.go @@ -4,6 +4,7 @@ import ( "context" bbn "github.com/babylonchain/babylon/types" + bstypes "github.com/babylonchain/babylon/x/btcstaking/types" clienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" //nolint:staticcheck btcctypes "github.com/babylonchain/babylon/x/btccheckpoint/types" @@ -105,4 +106,6 @@ type EpochingKeeper interface { } type BTCStakingKeeper interface { + GetAllBTCStakingConsumerIBCPackets(ctx context.Context) map[string]*bstypes.BTCStakingIBCPacket + DeleteBTCStakingConsumerIBCPacket(ctx context.Context, consumerID string) } diff --git a/x/zoneconcierge/types/mocked_keepers.go b/x/zoneconcierge/types/mocked_keepers.go index 2cb590833..fef6dac78 100644 --- a/x/zoneconcierge/types/mocked_keepers.go +++ b/x/zoneconcierge/types/mocked_keepers.go @@ -11,13 +11,14 @@ import ( types "github.com/babylonchain/babylon/types" types0 "github.com/babylonchain/babylon/x/btccheckpoint/types" types1 "github.com/babylonchain/babylon/x/btclightclient/types" - types2 "github.com/babylonchain/babylon/x/checkpointing/types" - types3 "github.com/babylonchain/babylon/x/epoching/types" - types4 "github.com/cosmos/cosmos-sdk/types" - types5 "github.com/cosmos/ibc-go/modules/capability/types" - types6 "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" - types7 "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types" - types8 "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" + types2 "github.com/babylonchain/babylon/x/btcstaking/types" + types3 "github.com/babylonchain/babylon/x/checkpointing/types" + types4 "github.com/babylonchain/babylon/x/epoching/types" + types5 "github.com/cosmos/cosmos-sdk/types" + types6 "github.com/cosmos/ibc-go/modules/capability/types" + types7 "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" + types8 "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types" + types9 "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" exported "github.com/cosmos/ibc-go/v8/modules/core/exported" gomock "github.com/golang/mock/gomock" ) @@ -46,10 +47,10 @@ func (m *MockAccountKeeper) EXPECT() *MockAccountKeeperMockRecorder { } // GetModuleAccount mocks base method. -func (m *MockAccountKeeper) GetModuleAccount(ctx context.Context, name string) types4.ModuleAccountI { +func (m *MockAccountKeeper) GetModuleAccount(ctx context.Context, name string) types5.ModuleAccountI { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetModuleAccount", ctx, name) - ret0, _ := ret[0].(types4.ModuleAccountI) + ret0, _ := ret[0].(types5.ModuleAccountI) return ret0 } @@ -60,10 +61,10 @@ func (mr *MockAccountKeeperMockRecorder) GetModuleAccount(ctx, name interface{}) } // GetModuleAddress mocks base method. -func (m *MockAccountKeeper) GetModuleAddress(name string) types4.AccAddress { +func (m *MockAccountKeeper) GetModuleAddress(name string) types5.AccAddress { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetModuleAddress", name) - ret0, _ := ret[0].(types4.AccAddress) + ret0, _ := ret[0].(types5.AccAddress) return ret0 } @@ -97,7 +98,7 @@ func (m *MockBankKeeper) EXPECT() *MockBankKeeperMockRecorder { } // BlockedAddr mocks base method. -func (m *MockBankKeeper) BlockedAddr(addr types4.AccAddress) bool { +func (m *MockBankKeeper) BlockedAddr(addr types5.AccAddress) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BlockedAddr", addr) ret0, _ := ret[0].(bool) @@ -111,7 +112,7 @@ func (mr *MockBankKeeperMockRecorder) BlockedAddr(addr interface{}) *gomock.Call } // BurnCoins mocks base method. -func (m *MockBankKeeper) BurnCoins(ctx context.Context, moduleName string, amt types4.Coins) error { +func (m *MockBankKeeper) BurnCoins(ctx context.Context, moduleName string, amt types5.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BurnCoins", ctx, moduleName, amt) ret0, _ := ret[0].(error) @@ -125,7 +126,7 @@ func (mr *MockBankKeeperMockRecorder) BurnCoins(ctx, moduleName, amt interface{} } // MintCoins mocks base method. -func (m *MockBankKeeper) MintCoins(ctx context.Context, moduleName string, amt types4.Coins) error { +func (m *MockBankKeeper) MintCoins(ctx context.Context, moduleName string, amt types5.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MintCoins", ctx, moduleName, amt) ret0, _ := ret[0].(error) @@ -139,7 +140,7 @@ func (mr *MockBankKeeperMockRecorder) MintCoins(ctx, moduleName, amt interface{} } // SendCoins mocks base method. -func (m *MockBankKeeper) SendCoins(ctx context.Context, fromAddr, toAddr types4.AccAddress, amt types4.Coins) error { +func (m *MockBankKeeper) SendCoins(ctx context.Context, fromAddr, toAddr types5.AccAddress, amt types5.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SendCoins", ctx, fromAddr, toAddr, amt) ret0, _ := ret[0].(error) @@ -153,7 +154,7 @@ func (mr *MockBankKeeperMockRecorder) SendCoins(ctx, fromAddr, toAddr, amt inter } // SendCoinsFromAccountToModule mocks base method. -func (m *MockBankKeeper) SendCoinsFromAccountToModule(ctx context.Context, senderAddr types4.AccAddress, recipientModule string, amt types4.Coins) error { +func (m *MockBankKeeper) SendCoinsFromAccountToModule(ctx context.Context, senderAddr types5.AccAddress, recipientModule string, amt types5.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SendCoinsFromAccountToModule", ctx, senderAddr, recipientModule, amt) ret0, _ := ret[0].(error) @@ -167,7 +168,7 @@ func (mr *MockBankKeeperMockRecorder) SendCoinsFromAccountToModule(ctx, senderAd } // SendCoinsFromModuleToAccount mocks base method. -func (m *MockBankKeeper) SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr types4.AccAddress, amt types4.Coins) error { +func (m *MockBankKeeper) SendCoinsFromModuleToAccount(ctx context.Context, senderModule string, recipientAddr types5.AccAddress, amt types5.Coins) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SendCoinsFromModuleToAccount", ctx, senderModule, recipientAddr, amt) ret0, _ := ret[0].(error) @@ -204,7 +205,7 @@ func (m *MockICS4Wrapper) EXPECT() *MockICS4WrapperMockRecorder { } // SendPacket mocks base method. -func (m *MockICS4Wrapper) SendPacket(ctx types4.Context, channelCap *types5.Capability, sourcePort, sourceChannel string, timeoutHeight types6.Height, timeoutTimestamp uint64, data []byte) (uint64, error) { +func (m *MockICS4Wrapper) SendPacket(ctx types5.Context, channelCap *types6.Capability, sourcePort, sourceChannel string, timeoutHeight types7.Height, timeoutTimestamp uint64, data []byte) (uint64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SendPacket", ctx, channelCap, sourcePort, sourceChannel, timeoutHeight, timeoutTimestamp, data) ret0, _ := ret[0].(uint64) @@ -242,10 +243,10 @@ func (m *MockChannelKeeper) EXPECT() *MockChannelKeeperMockRecorder { } // GetAllChannels mocks base method. -func (m *MockChannelKeeper) GetAllChannels(ctx types4.Context) []types8.IdentifiedChannel { +func (m *MockChannelKeeper) GetAllChannels(ctx types5.Context) []types9.IdentifiedChannel { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetAllChannels", ctx) - ret0, _ := ret[0].([]types8.IdentifiedChannel) + ret0, _ := ret[0].([]types9.IdentifiedChannel) return ret0 } @@ -256,10 +257,10 @@ func (mr *MockChannelKeeperMockRecorder) GetAllChannels(ctx interface{}) *gomock } // GetChannel mocks base method. -func (m *MockChannelKeeper) GetChannel(ctx types4.Context, srcPort, srcChan string) (types8.Channel, bool) { +func (m *MockChannelKeeper) GetChannel(ctx types5.Context, srcPort, srcChan string) (types9.Channel, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetChannel", ctx, srcPort, srcChan) - ret0, _ := ret[0].(types8.Channel) + ret0, _ := ret[0].(types9.Channel) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -271,7 +272,7 @@ func (mr *MockChannelKeeperMockRecorder) GetChannel(ctx, srcPort, srcChan interf } // GetChannelClientState mocks base method. -func (m *MockChannelKeeper) GetChannelClientState(ctx types4.Context, portID, channelID string) (string, exported.ClientState, error) { +func (m *MockChannelKeeper) GetChannelClientState(ctx types5.Context, portID, channelID string) (string, exported.ClientState, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetChannelClientState", ctx, portID, channelID) ret0, _ := ret[0].(string) @@ -287,7 +288,7 @@ func (mr *MockChannelKeeperMockRecorder) GetChannelClientState(ctx, portID, chan } // GetNextSequenceSend mocks base method. -func (m *MockChannelKeeper) GetNextSequenceSend(ctx types4.Context, portID, channelID string) (uint64, bool) { +func (m *MockChannelKeeper) GetNextSequenceSend(ctx types5.Context, portID, channelID string) (uint64, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetNextSequenceSend", ctx, portID, channelID) ret0, _ := ret[0].(uint64) @@ -325,7 +326,7 @@ func (m *MockClientKeeper) EXPECT() *MockClientKeeperMockRecorder { } // GetClientState mocks base method. -func (m *MockClientKeeper) GetClientState(ctx types4.Context, clientID string) (exported.ClientState, bool) { +func (m *MockClientKeeper) GetClientState(ctx types5.Context, clientID string) (exported.ClientState, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetClientState", ctx, clientID) ret0, _ := ret[0].(exported.ClientState) @@ -340,7 +341,7 @@ func (mr *MockClientKeeperMockRecorder) GetClientState(ctx, clientID interface{} } // SetClientState mocks base method. -func (m *MockClientKeeper) SetClientState(ctx types4.Context, clientID string, clientState exported.ClientState) { +func (m *MockClientKeeper) SetClientState(ctx types5.Context, clientID string, clientState exported.ClientState) { m.ctrl.T.Helper() m.ctrl.Call(m, "SetClientState", ctx, clientID, clientState) } @@ -375,10 +376,10 @@ func (m *MockConnectionKeeper) EXPECT() *MockConnectionKeeperMockRecorder { } // GetConnection mocks base method. -func (m *MockConnectionKeeper) GetConnection(ctx types4.Context, connectionID string) (types7.ConnectionEnd, bool) { +func (m *MockConnectionKeeper) GetConnection(ctx types5.Context, connectionID string) (types8.ConnectionEnd, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetConnection", ctx, connectionID) - ret0, _ := ret[0].(types7.ConnectionEnd) + ret0, _ := ret[0].(types8.ConnectionEnd) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -413,10 +414,10 @@ func (m *MockPortKeeper) EXPECT() *MockPortKeeperMockRecorder { } // BindPort mocks base method. -func (m *MockPortKeeper) BindPort(ctx types4.Context, portID string) *types5.Capability { +func (m *MockPortKeeper) BindPort(ctx types5.Context, portID string) *types6.Capability { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BindPort", ctx, portID) - ret0, _ := ret[0].(*types5.Capability) + ret0, _ := ret[0].(*types6.Capability) return ret0 } @@ -450,7 +451,7 @@ func (m *MockScopedKeeper) EXPECT() *MockScopedKeeperMockRecorder { } // AuthenticateCapability mocks base method. -func (m *MockScopedKeeper) AuthenticateCapability(ctx types4.Context, cap *types5.Capability, name string) bool { +func (m *MockScopedKeeper) AuthenticateCapability(ctx types5.Context, cap *types6.Capability, name string) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AuthenticateCapability", ctx, cap, name) ret0, _ := ret[0].(bool) @@ -464,7 +465,7 @@ func (mr *MockScopedKeeperMockRecorder) AuthenticateCapability(ctx, cap, name in } // ClaimCapability mocks base method. -func (m *MockScopedKeeper) ClaimCapability(ctx types4.Context, cap *types5.Capability, name string) error { +func (m *MockScopedKeeper) ClaimCapability(ctx types5.Context, cap *types6.Capability, name string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ClaimCapability", ctx, cap, name) ret0, _ := ret[0].(error) @@ -478,10 +479,10 @@ func (mr *MockScopedKeeperMockRecorder) ClaimCapability(ctx, cap, name interface } // GetCapability mocks base method. -func (m *MockScopedKeeper) GetCapability(ctx types4.Context, name string) (*types5.Capability, bool) { +func (m *MockScopedKeeper) GetCapability(ctx types5.Context, name string) (*types6.Capability, bool) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetCapability", ctx, name) - ret0, _ := ret[0].(*types5.Capability) + ret0, _ := ret[0].(*types6.Capability) ret1, _ := ret[1].(bool) return ret0, ret1 } @@ -493,11 +494,11 @@ func (mr *MockScopedKeeperMockRecorder) GetCapability(ctx, name interface{}) *go } // LookupModules mocks base method. -func (m *MockScopedKeeper) LookupModules(ctx types4.Context, name string) ([]string, *types5.Capability, error) { +func (m *MockScopedKeeper) LookupModules(ctx types5.Context, name string) ([]string, *types6.Capability, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LookupModules", ctx, name) ret0, _ := ret[0].([]string) - ret1, _ := ret[1].(*types5.Capability) + ret1, _ := ret[1].(*types6.Capability) ret2, _ := ret[2].(error) return ret0, ret1, ret2 } @@ -706,10 +707,10 @@ func (m *MockCheckpointingKeeper) EXPECT() *MockCheckpointingKeeperMockRecorder } // GetBLSPubKeySet mocks base method. -func (m *MockCheckpointingKeeper) GetBLSPubKeySet(ctx context.Context, epochNumber uint64) ([]*types2.ValidatorWithBlsKey, error) { +func (m *MockCheckpointingKeeper) GetBLSPubKeySet(ctx context.Context, epochNumber uint64) ([]*types3.ValidatorWithBlsKey, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBLSPubKeySet", ctx, epochNumber) - ret0, _ := ret[0].([]*types2.ValidatorWithBlsKey) + ret0, _ := ret[0].([]*types3.ValidatorWithBlsKey) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -735,10 +736,10 @@ func (mr *MockCheckpointingKeeperMockRecorder) GetLastFinalizedEpoch(ctx interfa } // GetRawCheckpoint mocks base method. -func (m *MockCheckpointingKeeper) GetRawCheckpoint(ctx context.Context, epochNumber uint64) (*types2.RawCheckpointWithMeta, error) { +func (m *MockCheckpointingKeeper) GetRawCheckpoint(ctx context.Context, epochNumber uint64) (*types3.RawCheckpointWithMeta, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetRawCheckpoint", ctx, epochNumber) - ret0, _ := ret[0].(*types2.RawCheckpointWithMeta) + ret0, _ := ret[0].(*types3.RawCheckpointWithMeta) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -773,10 +774,10 @@ func (m *MockEpochingKeeper) EXPECT() *MockEpochingKeeperMockRecorder { } // GetEpoch mocks base method. -func (m *MockEpochingKeeper) GetEpoch(ctx context.Context) *types3.Epoch { +func (m *MockEpochingKeeper) GetEpoch(ctx context.Context) *types4.Epoch { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetEpoch", ctx) - ret0, _ := ret[0].(*types3.Epoch) + ret0, _ := ret[0].(*types4.Epoch) return ret0 } @@ -787,10 +788,10 @@ func (mr *MockEpochingKeeperMockRecorder) GetEpoch(ctx interface{}) *gomock.Call } // GetHistoricalEpoch mocks base method. -func (m *MockEpochingKeeper) GetHistoricalEpoch(ctx context.Context, epochNumber uint64) (*types3.Epoch, error) { +func (m *MockEpochingKeeper) GetHistoricalEpoch(ctx context.Context, epochNumber uint64) (*types4.Epoch, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetHistoricalEpoch", ctx, epochNumber) - ret0, _ := ret[0].(*types3.Epoch) + ret0, _ := ret[0].(*types4.Epoch) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -823,3 +824,29 @@ func NewMockBTCStakingKeeper(ctrl *gomock.Controller) *MockBTCStakingKeeper { func (m *MockBTCStakingKeeper) EXPECT() *MockBTCStakingKeeperMockRecorder { return m.recorder } + +// DeleteBTCStakingConsumerIBCPacket mocks base method. +func (m *MockBTCStakingKeeper) DeleteBTCStakingConsumerIBCPacket(ctx context.Context, consumerID string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DeleteBTCStakingConsumerIBCPacket", ctx, consumerID) +} + +// DeleteBTCStakingConsumerIBCPacket indicates an expected call of DeleteBTCStakingConsumerIBCPacket. +func (mr *MockBTCStakingKeeperMockRecorder) DeleteBTCStakingConsumerIBCPacket(ctx, consumerID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBTCStakingConsumerIBCPacket", reflect.TypeOf((*MockBTCStakingKeeper)(nil).DeleteBTCStakingConsumerIBCPacket), ctx, consumerID) +} + +// GetAllBTCStakingConsumerIBCPackets mocks base method. +func (m *MockBTCStakingKeeper) GetAllBTCStakingConsumerIBCPackets(ctx context.Context) map[string]*types2.BTCStakingIBCPacket { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAllBTCStakingConsumerIBCPackets", ctx) + ret0, _ := ret[0].(map[string]*types2.BTCStakingIBCPacket) + return ret0 +} + +// GetAllBTCStakingConsumerIBCPackets indicates an expected call of GetAllBTCStakingConsumerIBCPackets. +func (mr *MockBTCStakingKeeperMockRecorder) GetAllBTCStakingConsumerIBCPackets(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllBTCStakingConsumerIBCPackets", reflect.TypeOf((*MockBTCStakingKeeper)(nil).GetAllBTCStakingConsumerIBCPackets), ctx) +} From 1ed71493638e4b0689171a131c77e2eae1130ee7 Mon Sep 17 00:00:00 2001 From: Gurjot Singh <111540954+gusin13@users.noreply.github.com> Date: Thu, 16 May 2024 13:51:37 -0400 Subject: [PATCH 22/85] tests: btcstaking events e2e tests (#240) --- proto/babylon/btcstaking/v1/packet.proto | 9 +- test/e2e/btc_staking_integration_e2e_test.go | 389 +++++++++++++++++- test/e2e/btc_timestamping_e2e_test.go | 10 +- test/e2e/bytecode/babylon_contract.wasm | Bin 676910 -> 722126 bytes test/e2e/bytecode/btc_staking.wasm | Bin 0 -> 323715 bytes test/e2e/bytecode/version.txt | 2 +- test/e2e/configurer/base.go | 37 +- test/e2e/configurer/chain/queries.go | 24 +- .../chain/queries_btcstaking_contract.go | 149 +++++++ test/e2e/configurer/chain/queries_ibc.go | 15 + test/e2e/configurer/factory.go | 12 +- test/e2e/configurer/setup.go | 8 +- test/e2e/scripts/copy_local_wasm.sh | 7 +- test/e2e/scripts/download_release.sh | 24 +- .../keeper/btc_staking_consumer_events.go | 16 +- x/btcstaking/types/packet.pb.go | 208 ++++------ 16 files changed, 695 insertions(+), 215 deletions(-) create mode 100644 test/e2e/bytecode/btc_staking.wasm create mode 100644 test/e2e/configurer/chain/queries_btcstaking_contract.go diff --git a/proto/babylon/btcstaking/v1/packet.proto b/proto/babylon/btcstaking/v1/packet.proto index 16a0f9def..227d2d444 100644 --- a/proto/babylon/btcstaking/v1/packet.proto +++ b/proto/babylon/btcstaking/v1/packet.proto @@ -50,20 +50,17 @@ message NewFinalityProvider { string btc_pk_hex = 4; // pop is the proof of possession of babylon_pk and btc_pk ProofOfPossessionBTC pop = 5; - // master_pub_rand is the master public randomness of the finality provider - // encoded as a base58 string - string master_pub_rand = 6; // slashed_babylon_height indicates the Babylon height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - uint64 slashed_babylon_height = 7; + uint64 slashed_babylon_height = 6; // slashed_btc_height indicates the BTC height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - uint64 slashed_btc_height = 8; + uint64 slashed_btc_height = 7; // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in Babylon. - string consumer_id = 9; + string consumer_id = 8; } // ActiveBTCDelegation is an IBC packet sent from Babylon to consumer diff --git a/test/e2e/btc_staking_integration_e2e_test.go b/test/e2e/btc_staking_integration_e2e_test.go index 04fe5dab4..069601a16 100644 --- a/test/e2e/btc_staking_integration_e2e_test.go +++ b/test/e2e/btc_staking_integration_e2e_test.go @@ -1,7 +1,9 @@ package e2e import ( + "encoding/hex" "math" + "time" "github.com/babylonchain/babylon/test/e2e/configurer" "github.com/babylonchain/babylon/test/e2e/configurer/chain" @@ -16,9 +18,14 @@ import ( "github.com/btcsuite/btcd/wire" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/types/query" + channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" "github.com/stretchr/testify/suite" ) +var ( + czDelBtcSk, czDelBtcPk, _ = datagen.GenRandomBTCKeyPair(r) +) + type BTCStakingIntegrationTestSuite struct { suite.Suite @@ -51,31 +58,81 @@ func (s *BTCStakingIntegrationTestSuite) TearDownSuite() { s.Require().NoError(err) } +// Test1RegisterNewConsumer registers a new consumer on Babylon func (s *BTCStakingIntegrationTestSuite) Test1RegisterNewConsumer() { chainA := s.configurer.GetChainConfig(0) chainA.WaitUntilHeight(1) - nonValidatorNode, err := chainA.GetNodeAtIndex(2) + babylonNode, err := chainA.GetNodeAtIndex(2) s.NoError(err) - s.registerVerifyConsumer(nonValidatorNode) + + consumerID := s.getIBCClientID() + s.registerVerifyConsumer(babylonNode, consumerID) } +// Test2CreateConsumerFinalityProvider - +// 1. Creates a consumer finality provider under the consumer registered in Test1RegisterNewConsumer +// 2. Verifies that the finality provider is stored in the smart contract func (s *BTCStakingIntegrationTestSuite) Test2CreateConsumerFinalityProvider() { chainA := s.configurer.GetChainConfig(0) chainA.WaitUntilHeight(1) nonValidatorNode, err := chainA.GetNodeAtIndex(2) s.NoError(err) - // get the consumer registered in Test1 + // retrieve the registered consumer in Test1 consumerRegistryList := nonValidatorNode.QueryConsumerRegistryList(&query.PageRequest{Limit: 1}) + s.NotNil(consumerRegistryList) + s.NotNil(consumerRegistryList.ConsumerIds) + s.Equal(1, len(consumerRegistryList.ConsumerIds)) consumerId := consumerRegistryList.ConsumerIds[0] - // create a random num of finality providers from 1 to 5 on the consumer - numFPs := datagen.RandomInt(r, 5) + 1 - for i := 0; i < int(numFPs); i++ { - s.createVerifyConsumerFP(nonValidatorNode, consumerId) + // generate a random number of finality providers from 1 to 5 + numConsumerFPs := datagen.RandomInt(r, 5) + 1 + var consumerFps []*bstypes.FinalityProvider + for i := 0; i < int(numConsumerFPs); i++ { + consumerFp := s.createVerifyConsumerFP(nonValidatorNode, consumerId) + consumerFps = append(consumerFps, consumerFp) + } + + czNode, err := s.configurer.GetChainConfig(1).GetNodeAtIndex(2) + s.NoError(err) + // retrieve staking contract address and query finality providers stored in the contract + stakingContracts, err := czNode.QueryContractsFromId(2) + s.NoError(err) + s.Equal(1, len(stakingContracts)) + stakingContractAddr := stakingContracts[0] + + // query the staking contract for finality providers + var dataFromContract *chain.ConsumerFpResponse + s.Eventually(func() bool { + // try to retrieve expected number of finality providers from the contract + dataFromContract, err = czNode.QueryConsumerFps(stakingContractAddr) + if err != nil { + return false + } + return len(dataFromContract.ConsumerFps) == int(numConsumerFPs) + }, time.Second*20, time.Second) + + // create a map of expected finality providers for verification + fpMap := make(map[string]*bstypes.FinalityProvider) + for _, czFp := range consumerFps { + fpMap[czFp.BtcPk.MarshalHex()] = czFp + } + + // validate that all finality providers match with the consumer list + for _, czFp := range dataFromContract.ConsumerFps { + fpFromMap, ok := fpMap[czFp.BtcPkHex] + s.True(ok) + s.Equal(fpFromMap.BtcPk.MarshalHex(), czFp.BtcPkHex) + //s.Equal(fpFromMap.RegisteredEpoch, czFp.RegisteredEpoch) // TODO: registered epoch doesn't match, investigate + s.Equal(fpFromMap.SlashedBabylonHeight, czFp.SlashedBabylonHeight) + s.Equal(fpFromMap.SlashedBtcHeight, czFp.SlashedBtcHeight) + s.Equal(fpFromMap.ConsumerId, czFp.ChainID) } } +// Test3RestakeDelegationToMultipleFPs creates a Babylon delegation and restakes +// it to both Babylon and consumer finality provider created in Test2CreateConsumerFinalityProvider +// This will create a delegation in pending state as covenant sigs are not provided func (s *BTCStakingIntegrationTestSuite) Test3RestakeDelegationToMultipleFPs() { chainA := s.configurer.GetChainConfig(0) chainA.WaitUntilHeight(1) @@ -116,10 +173,133 @@ func (s *BTCStakingIntegrationTestSuite) Test3RestakeDelegationToMultipleFPs() { s.Len(pendingDels.Dels[0].CovenantSigs, 0) } +// Test4ActivateDelegation - +// 1. Activates the delegation created in Test3RestakeDelegationToMultipleFPs by submitting covenant sigs +// 2. Verifies that the active delegation is stored in the smart contract +func (s *BTCStakingIntegrationTestSuite) Test4ActivateDelegation() { + chainA := s.configurer.GetChainConfig(0) + chainA.WaitUntilHeight(1) + nonValidatorNode, err := chainA.GetNodeAtIndex(2) + s.NoError(err) + + consumerRegistryList := nonValidatorNode.QueryConsumerRegistryList(&query.PageRequest{Limit: 1}) + consumerId := consumerRegistryList.ConsumerIds[0] + // get the consumer created in Test2 + consumerFp := nonValidatorNode.QueryConsumerFinalityProviders(consumerId)[0] + + // activate the delegation created in Test3 by submitting covenant sigs + s.submitCovenantSigs(nonValidatorNode, consumerFp) + + activeDelsSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) + s.Len(activeDelsSet, 1) + + activeDels, err := ParseRespsBTCDelToBTCDel(activeDelsSet[0]) + s.NoError(err) + s.NotNil(activeDels) + s.Len(activeDels.Dels, 1) + + activeDel := activeDels.Dels[0] + czNode, err := s.configurer.GetChainConfig(1).GetNodeAtIndex(2) + s.NoError(err) + stakingContracts, err := czNode.QueryContractsFromId(2) + s.NoError(err) + stakingContractAddr := stakingContracts[0] + + // query the staking contract for delegations + var dataFromContract *chain.ConsumerDelegationResponse + s.Eventually(func() bool { + // try to retrieve expected number of delegations from the contract + dataFromContract, err = czNode.QueryConsumerDelegations(stakingContractAddr) + if err != nil { + return false + } + return len(dataFromContract.ConsumerDelegations) == 1 + }, time.Second*20, time.Second) + + s.Equal(activeDel.BtcPk.MarshalHex(), dataFromContract.ConsumerDelegations[0].BtcPkHex) + s.Len(dataFromContract.ConsumerDelegations[0].FpBtcPkList, 2) + s.Equal(activeDel.FpBtcPkList[0].MarshalHex(), dataFromContract.ConsumerDelegations[0].FpBtcPkList[0]) + s.Equal(activeDel.FpBtcPkList[1].MarshalHex(), dataFromContract.ConsumerDelegations[0].FpBtcPkList[1]) + s.Equal(activeDel.StartHeight, dataFromContract.ConsumerDelegations[0].StartHeight) + s.Equal(activeDel.EndHeight, dataFromContract.ConsumerDelegations[0].EndHeight) + s.Equal(activeDel.TotalSat, dataFromContract.ConsumerDelegations[0].TotalSat) + s.Equal(hex.EncodeToString(activeDel.StakingTx), hex.EncodeToString(dataFromContract.ConsumerDelegations[0].StakingTx)) + s.Equal(activeDel.SlashingTx.ToHexStr(), hex.EncodeToString(dataFromContract.ConsumerDelegations[0].SlashingTx)) +} + +// Test5ContractQueries - +// 1. Query all finality providers stored in the staking contract +// 2. Query all BTC delegations stored in the staking contract +// 3. Query a single finality provider from the staking contract +// 4. Query a single BTC delegation from the staking contract +// 5. Query BTC delegations of a specific finality provider from the staking contract +func (s *BTCStakingIntegrationTestSuite) Test5ContractQueries() { + // 1. Already covered in Test2CreateConsumerFinalityProvider + // 2. Already covered in Test4ActivateDelegation + + chainA := s.configurer.GetChainConfig(0) + chainA.WaitUntilHeight(1) + nonValidatorNode, err := chainA.GetNodeAtIndex(2) + s.NoError(err) + consumerRegistryList := nonValidatorNode.QueryConsumerRegistryList(&query.PageRequest{Limit: 1}) + consumerId := consumerRegistryList.ConsumerIds[0] + consumerFp := nonValidatorNode.QueryConsumerFinalityProviders(consumerId)[0] + + czNode, err := s.configurer.GetChainConfig(1).GetNodeAtIndex(2) + s.NoError(err) + + stakingContracts, err := czNode.QueryContractsFromId(2) + s.NoError(err) + stakingContractAddr := stakingContracts[0] + + // 3. Query a single finality provider from the staking contract + contractFP, err := czNode.QuerySingleConsumerFp(stakingContractAddr, consumerFp.BtcPk.MarshalHex()) + s.NoError(err) + s.Equal(consumerFp.BtcPk.MarshalHex(), contractFP.BtcPkHex) + s.Equal(consumerFp.SlashedBabylonHeight, contractFP.SlashedBabylonHeight) + s.Equal(consumerFp.SlashedBtcHeight, contractFP.SlashedBtcHeight) + s.Equal(consumerFp.ConsumerId, contractFP.ChainID) + // TODO: check how to assert registered epoch, it is not present in the response + + // 4. Query a single BTC delegation from the staking contract + activeDelsSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) + s.Len(activeDelsSet, 1) + activeDels, err := ParseRespsBTCDelToBTCDel(activeDelsSet[0]) + s.NoError(err) + s.NotNil(activeDels) + s.Len(activeDels.Dels, 1) + activeDel := activeDels.Dels[0] + stakingTxHashHex := activeDel.MustGetStakingTxHash().String() + contractDel, err := czNode.QuerySingleConsumerDelegation(stakingContractAddr, stakingTxHashHex) + s.NoError(err) + s.Equal(activeDel.BtcPk.MarshalHex(), contractDel.BtcPkHex) + s.Len(contractDel.FpBtcPkList, 2) + s.Equal(activeDel.FpBtcPkList[0].MarshalHex(), contractDel.FpBtcPkList[0]) + s.Equal(activeDel.FpBtcPkList[1].MarshalHex(), contractDel.FpBtcPkList[1]) + s.Equal(activeDel.StartHeight, contractDel.StartHeight) + s.Equal(activeDel.EndHeight, contractDel.EndHeight) + s.Equal(activeDel.TotalSat, contractDel.TotalSat) + s.Equal(hex.EncodeToString(activeDel.StakingTx), hex.EncodeToString(contractDel.StakingTx)) + s.Equal(activeDel.SlashingTx.ToHexStr(), hex.EncodeToString(contractDel.SlashingTx)) + + // 5. Query BTC delegations of a specific finality provider from the staking contract + contractDelsByFp, err := czNode.QueryConsumerDelegationsByFp(stakingContractAddr, consumerFp.BtcPk.MarshalHex()) + s.NoError(err) + s.NotNil(contractDelsByFp) + s.Len(contractDelsByFp.StakingTxHashes, 1) + s.Equal(activeDel.MustGetStakingTxHash().String(), contractDelsByFp.StakingTxHashes[0]) +} + +// TODO: add test for unbonding/slashing when they are supported in smart contract + // helper function: register a random consumer on Babylon and verify it -func (s *BTCStakingIntegrationTestSuite) registerVerifyConsumer(babylonNode *chain.NodeConfig) *bsctypes.ConsumerRegister { +func (s *BTCStakingIntegrationTestSuite) registerVerifyConsumer(babylonNode *chain.NodeConfig, consumerID string) *bsctypes.ConsumerRegister { // Register a random consumer on Babylon - randomConsumer := datagen.GenRandomConsumerRegister(r) + randomConsumer := &bsctypes.ConsumerRegister{ + ConsumerId: consumerID, + ConsumerName: datagen.GenRandomHexStr(r, 5), + ConsumerDescription: "Chain description: " + datagen.GenRandomHexStr(r, 15), + } babylonNode.RegisterConsumer(randomConsumer.ConsumerId, randomConsumer.ConsumerName, randomConsumer.ConsumerDescription) babylonNode.WaitForNextBlock() @@ -198,8 +378,6 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod */ delBbnSk := nonValidatorNode.SecretKey - delBtcSk, delBtcPk, _ := datagen.GenRandomBTCKeyPair(r) - // BTC staking params, BTC delegation key pairs and PoP params := nonValidatorNode.QueryBTCStakingParams() @@ -212,7 +390,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod covenantBTCPKs = append(covenantBTCPKs, covenantPK.MustToBTCPK()) } // NOTE: we use the node's secret key as Babylon secret key for the BTC delegation - pop, err := bstypes.NewPoP(delBbnSk, delBtcSk) + pop, err := bstypes.NewPoP(delBbnSk, czDelBtcSk) s.NoError(err) // generate staking tx and slashing tx stakingTimeBlocks := uint16(math.MaxUint16) @@ -220,7 +398,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod r, s.T(), net, - delBtcSk, + czDelBtcSk, []*btcec.PublicKey{babylonFp.BtcPk.MustToBTCPK(), consumerFp.BtcPk.MustToBTCPK()}, covenantBTCPKs, covenantQuorum, @@ -241,7 +419,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod stakingMsgTx, datagen.StakingOutIdx, stakingSlashingPathInfo.GetPkScriptPath(), - delBtcSk, + czDelBtcSk, ) s.NoError(err) @@ -266,7 +444,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod r, s.T(), net, - delBtcSk, + czDelBtcSk, []*btcec.PublicKey{babylonFp.BtcPk.MustToBTCPK(), consumerFp.BtcPk.MustToBTCPK()}, covenantBTCPKs, covenantQuorum, @@ -277,11 +455,11 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod params.SlashingRate, unbondingTime, ) - delUnbondingSlashingSig, err := testUnbondingInfo.GenDelSlashingTxSig(delBtcSk) + delUnbondingSlashingSig, err := testUnbondingInfo.GenDelSlashingTxSig(czDelBtcSk) s.NoError(err) // submit the message for creating BTC delegation - delBTCPKs := []bbn.BIP340PubKey{*bbn.NewBIP340PubKeyFromBTCPK(delBtcPk)} + delBTCPKs := []bbn.BIP340PubKey{*bbn.NewBIP340PubKeyFromBTCPK(czDelBtcPk)} nonValidatorNode.CreateBTCDelegation( delBbnSk.PubKey().(*secp256k1.PubKey), delBTCPKs, @@ -303,5 +481,180 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod nonValidatorNode.WaitForNextBlock() nonValidatorNode.WaitForNextBlock() - return delBtcPk, stakingTxHash + return czDelBtcPk, stakingTxHash +} + +// helper function: verify if the ibc channels are open and get the ibc client id of the CZ node +func (s *BTCStakingIntegrationTestSuite) getIBCClientID() string { + chainA := s.configurer.GetChainConfig(0) + chainA.WaitUntilHeight(1) + babylonNode, err := chainA.GetNodeAtIndex(2) + s.NoError(err) + + chainB := s.configurer.GetChainConfig(1) + chainB.WaitUntilHeight(1) + czNode, err := chainB.GetNodeAtIndex(2) + s.NoError(err) + + var babylonChannel *channeltypes.IdentifiedChannel + s.Eventually(func() bool { + babylonChannelsResp, err := babylonNode.QueryIBCChannels() + if err != nil { + return false + } + if len(babylonChannelsResp.Channels) != 1 { + return false + } + // channel has to be open and ordered + babylonChannel = babylonChannelsResp.Channels[0] + if babylonChannel.State != channeltypes.OPEN { + return false + } + s.Equal(channeltypes.ORDERED, babylonChannel.Ordering) + // the counterparty has to be the Babylon smart contract + s.Contains(babylonChannel.Counterparty.PortId, "wasm.") + return true + }, time.Minute, time.Second*2) + + // Wait until the channel (CZ side) is open + var czChannel *channeltypes.IdentifiedChannel + s.Eventually(func() bool { + czChannelsResp, err := czNode.QueryIBCChannels() + if err != nil { + return false + } + if len(czChannelsResp.Channels) != 1 { + return false + } + czChannel = czChannelsResp.Channels[0] + if czChannel.State != channeltypes.OPEN { + return false + } + s.Equal(channeltypes.ORDERED, czChannel.Ordering) + s.Equal(babylonChannel.PortId, czChannel.Counterparty.PortId) + return true + }, time.Minute, time.Second*2) + + czChannelState, err := czNode.QueryChannelClientState(czChannel.ChannelId, czChannel.PortId) + s.NoError(err) + + nextSequenceRecv, err := czNode.QueryNextSequenceReceive(babylonChannel.Counterparty.ChannelId, babylonChannel.Counterparty.PortId) + s.NoError(err) + // there are no packets sent yet, so the next sequence receive should be 1 + s.Equal(uint64(1), nextSequenceRecv.NextSequenceReceive) + return czChannelState.IdentifiedClientState.GetClientId() +} + +// helper function: submit covenant sigs to activate the BTC delegation +func (s *BTCStakingIntegrationTestSuite) submitCovenantSigs(nonValidatorNode *chain.NodeConfig, consumerFp *bsctypes.FinalityProviderResponse) { + pendingDelsSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) + s.Len(pendingDelsSet, 1) + pendingDels := pendingDelsSet[0] + s.Len(pendingDels.Dels, 1) + pendingDelResp := pendingDels.Dels[0] + pendingDel, err := ParseRespBTCDelToBTCDel(pendingDelResp) + s.NoError(err) + s.Len(pendingDel.CovenantSigs, 0) + + slashingTx := pendingDel.SlashingTx + stakingTx := pendingDel.StakingTx + + stakingMsgTx, err := bbn.NewBTCTxFromBytes(stakingTx) + s.NoError(err) + stakingTxHash := stakingMsgTx.TxHash().String() + + params := nonValidatorNode.QueryBTCStakingParams() + + fpBTCPKs, err := bbn.NewBTCPKsFromBIP340PKs(pendingDel.FpBtcPkList) + s.NoError(err) + + stakingInfo, err := pendingDel.GetStakingInfo(params, net) + s.NoError(err) + + stakingSlashingPathInfo, err := stakingInfo.SlashingPathSpendInfo() + s.NoError(err) + + /* + generate and insert new covenant signature, in order to activate the BTC delegation + */ + // covenant signatures on slashing tx + covenantSlashingSigs, err := datagen.GenCovenantAdaptorSigs( + covenantSKs, + fpBTCPKs, + stakingMsgTx, + stakingSlashingPathInfo.GetPkScriptPath(), + slashingTx, + ) + s.NoError(err) + + // cov Schnorr sigs on unbonding signature + unbondingPathInfo, err := stakingInfo.UnbondingPathSpendInfo() + s.NoError(err) + unbondingTx, err := bbn.NewBTCTxFromBytes(pendingDel.BtcUndelegation.UnbondingTx) + s.NoError(err) + + covUnbondingSigs, err := datagen.GenCovenantUnbondingSigs( + covenantSKs, + stakingMsgTx, + pendingDel.StakingOutputIdx, + unbondingPathInfo.GetPkScriptPath(), + unbondingTx, + ) + s.NoError(err) + + unbondingInfo, err := pendingDel.GetUnbondingInfo(params, net) + s.NoError(err) + unbondingSlashingPathInfo, err := unbondingInfo.SlashingPathSpendInfo() + s.NoError(err) + covenantUnbondingSlashingSigs, err := datagen.GenCovenantAdaptorSigs( + covenantSKs, + fpBTCPKs, + unbondingTx, + unbondingSlashingPathInfo.GetPkScriptPath(), + pendingDel.BtcUndelegation.SlashingTx, + ) + s.NoError(err) + + for i := 0; i < int(covenantQuorum); i++ { + nonValidatorNode.AddCovenantSigs( + covenantSlashingSigs[i].CovPk, + stakingTxHash, + covenantSlashingSigs[i].AdaptorSigs, + bbn.NewBIP340SignatureFromBTCSig(covUnbondingSigs[i]), + covenantUnbondingSlashingSigs[i].AdaptorSigs, + ) + // wait for a block so that above txs take effect + nonValidatorNode.WaitForNextBlock() + } + + // wait for a block so that above txs take effect + nonValidatorNode.WaitForNextBlock() + nonValidatorNode.WaitForNextBlock() + + // ensure the BTC delegation has covenant sigs now + activeDelsSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) + s.Len(activeDelsSet, 1) + + activeDels, err := ParseRespsBTCDelToBTCDel(activeDelsSet[0]) + s.NoError(err) + s.NotNil(activeDels) + s.Len(activeDels.Dels, 1) + + activeDel := activeDels.Dels[0] + s.True(activeDel.HasCovenantQuorums(covenantQuorum)) + + // wait for a block so that above txs take effect and the voting power table + // is updated in the next block's BeginBlock + nonValidatorNode.WaitForNextBlock() + + // ensure BTC staking is activated + activatedHeight := nonValidatorNode.QueryActivatedHeight() + s.Positive(activatedHeight) + // ensure finality provider has voting power at activated height + currentBtcTip, err := nonValidatorNode.QueryTip() + s.NoError(err) + activeFps := nonValidatorNode.QueryActiveFinalityProvidersAtHeight(activatedHeight) + s.Len(activeFps, 1) + s.Equal(activeFps[0].VotingPower, activeDels.VotingPower(currentBtcTip.Height, initialization.BabylonBtcFinalizationPeriod, params.CovenantQuorum)) + s.Equal(activeFps[0].VotingPower, activeDel.VotingPower(currentBtcTip.Height, initialization.BabylonBtcFinalizationPeriod, params.CovenantQuorum)) } diff --git a/test/e2e/btc_timestamping_e2e_test.go b/test/e2e/btc_timestamping_e2e_test.go index db447f5d5..605f5deb9 100644 --- a/test/e2e/btc_timestamping_e2e_test.go +++ b/test/e2e/btc_timestamping_e2e_test.go @@ -3,11 +3,13 @@ package e2e import ( "crypto/sha256" "encoding/hex" + "encoding/json" "fmt" "math/rand" "strconv" "time" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/babylonchain/babylon/test/e2e/configurer" "github.com/babylonchain/babylon/test/e2e/initialization" bbn "github.com/babylonchain/babylon/types" @@ -275,11 +277,17 @@ func (s *BTCTimestampingTestSuite) Test6Wasm() { // the data is eventually included in the contract queryMsg := fmt.Sprintf(`{"check_data": { "data_hash": "%s" } }`, dataHashHex) var queryResult map[string]interface{} + var smartContractResponse *wasmtypes.QuerySmartContractStateResponse s.Eventually(func() bool { - queryResult, err = nonValidatorNode.QueryWasmSmartObject(contractAddr, queryMsg) + smartContractResponse, err = nonValidatorNode.QueryWasmSmart(contractAddr, queryMsg) return err == nil }, time.Second*10, time.Second) + s.NotNil(smartContractResponse) + s.NotNil(smartContractResponse.Data) + err = json.Unmarshal(smartContractResponse.Data, &queryResult) + s.NoError(err) + finalized := queryResult["finalized"].(bool) latestFinalizedEpoch := int(queryResult["latest_finalized_epoch"].(float64)) saveEpoch := int(queryResult["save_epoch"].(float64)) diff --git a/test/e2e/bytecode/babylon_contract.wasm b/test/e2e/bytecode/babylon_contract.wasm index 16075c9065de0d2dac3f5ab351c645669731687a..87029557d1153295228aed8ff65e721da98aaa64 100644 GIT binary patch delta 247222 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 z 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

+kH#Y6bJX%_o z!Lyi@E9x5RNZ^GKfnc6ByMqW;&}$142n)0h*_OmFd}7Wk?VWQK&C{xxv&XFx7I~K8 z86t46mKvgyZb31qn0|55H{$$?5Ku{_zP6p$R+Z$>>OB=ou&Lftk6|?RRO%{1yO3)! zOkg^9>Nh+1lb(luET9Zqfx`{42?Z8bwes~$et`|0)dw5w!J;#(50pVd*%MWy5-QnZ zk0@C!BpfQ>_pLpF6!3(SNg0D5TTcau*|q)st+ptnw;9Z)vBCq)N@TVUzgUhYGXd&K z6%;TlRPF%v6wCk$%axw75U1F$Qb|!)t>%kBQjY<2>S7IudbNZ>*xmz2f|&<;obAiOel z0r`=P^k@|cF!apuT~bnaxSywKMG9J8o{z{wQ7h1 z<=O+;uC(94n3r64yq@Ooe8}zbf4s9&&1+Du0U0ipfYZE9w#$}T-kOakS9Jn_DwSZU z*@avTHNCGh!L_E}==?UJlRqm}ln&I8lJ4UCIEWK&^kYr7c!sXG8fP<|hdVF~Bw!rj zW9#bwERJ9h|Njq;fY5&jM?_iP^mxWl>$XVmZ+gfb_;7|Klxu%MapO+*1h6pg$)_J)K={8JHU9WPhF!PxH8uZk81N78Y`8qvy zb#N9y4Wy^?QBU0iQ~uUiVg~3%P*Y!{rxHM=^Xr~Rg`?`jH5S z35zn8q(95`=iEeaY!vO~6H+YOw-xb9`-P&x!Zrbvs5yI>w1!5+7weO9(u4-JhJB0z zYtjODCO!jp3hmOAdvfKbU{%g7N;Ox}q3j^VH5=FI ztzw{^4U21PD~wDTof?BIi@pcD7C)0#Uir2n=Q_~)?nG@RQjMc^;>kf>NbGcDm&Jc# zGhU)DNP3C;>+jJ9w$|Tosof-9xe38~iz%_&bY*9uJ-FEfBWN}j-%ol>v3UB@h^A>> z(n3e@gdzCHzvFg{i=xPj%B}J6av`z0lV|GK66tmhJc><2RcixJ4=m4#ISm+*%ye<> zI4>1^{9QMyf`ewZ6pxe2j2I!NLHZORkj`Q)##ypibf~d8D8F20<2vWEpbSMr|3YY` zfSe$x!=+&Wa9(afiA2_C#tny|3|p^roakY7@Rij;3_f2kEBT*%*S)=x)XM?nlDQg+ zKNnA7u$d5W!_{=@xc8R`O>HIRi$X-E6U9!euAR-59mU&1)v{~wJ^f__A^M%0(VY$4 z+HN=EJPIXpbD)I>Ugq!mH&@aYk5Vg^IxZ@omM)FtS12ftN;r<2)6?JpyQgzg1x1m7C*#{qzJI+t!ZKmP z=V#1(_j#Tdv)|8BjHJB-5s!sGBGRsSr$6KSNTDW#;e!GU%D>Xcer6==Qdo7O zzATvP0^IX ziYYcygc4Y_VdqTs8yFzmCGZ;UX5n)gTu_PhC71T{Tnr*CAA4m#XrLaN86K*+Rh z0zplIXp1YxiEA1}V*RcOQ(;5~jsFW=H?I8ea^1L6&vhj*Y><9}a)HC7e?*EscuPiV zZp;OTqfGl`|k85jxfIAAy@MPSMV4@ zzJrgjG5+X=zDzu(xJ1pbX_cRb@RL@IfL!lul|LPqU~3si9S8EX$}`Ae8?BI4uIq%Y zT-UdvX>00~^*baBND=LZah3IlV zWRM)z)P>uPurIFtBQQr!T7o-z-s0?$FblTV;**5h;mBG!Qfobm`@(H^a=SL%zA_@b zy-&BQ5n~vowQ73hDdmdCRBUIQQSDJnO56Rp@xm%k(3;k{*kA;gHbj``=Mz9g+#BZ{a78gQtkZ?CDD+P}z*iT&1 zVp!u=+xc7-(24rg!El_EEb(1CE!y;Db`a6);DAXHw`M8Tg2BHWg%%g z1ZmqmF;OSX@50VTL>vAcG6CyJQyd*Op;HOj&VnSNc|Eh$9Tev;l+12~FK~rg zG6!-4F140t)&wvRQ`6qav}<03L8Y0c5^lP)$Fq}4RPg; z$M1MNa|p*8;c__(kkG;?N(BW~psn`@Qj1#Jeo5Qh5aHZVZl+0aS>n7wl^ddR9&uc^ zCn2jylBI)7&z8f2u{jn0bG>JY?vrcA;KuZI>S8OHg=8& zI^(UcH86~?u4M=lT`G-da?7(AOgMK`Ud48Ut)k;P!q=6m7~2s(Cx8(wX{G`+rb2lq zJ~EeN8Kma7xg|R%fo$rK#QI5tx-qF*4*}1rXOimK*}g`@*W6Cl=TUhCpI1tgV`g9n z&A{Ziy*2}I^DGf|)$S#rC**eyB(4>x7x5fSWQMV603Yh-MEMC&ilaak&0Olj{8?cX=~MZW%9NQ%)K;?x+{DDDQGQWaaL?H z*tI@e?$UK#wme(2)|ET3vsDAgl&5I`!;;g}$`Fn66#h-)5#BNlRLU?Rkq5Tf*_Od> zf?YvSpN40(r8KRSA;p`_0mCf*u>zQcn0V6k{W!iKH|YCu;rl7(gvafU0L1s|nLHZ$ zDjOzks(Oc8DM6yq6bQx&dOCRGrm}=J=@nEv2F7lV+~SH(~z434Pkkr_F;tWi9K|;guzA>=qd=vK(f;r8HGJ za*@g8eMbjD_|h+wvE&zWiMb9fffLiLx8R5Uk_HSsTfk<2!FG0a7PW6U{nc`Z!`#J)LfYoDSNIvgyl&q_Sn_D^I#HH8PR}t(0wCWr~kZ zigWOufKd#XRAl{cr}-*Ymw&N3bE5>eL(99=Af2rK?Wi?b{ksfU{ffeR6U(37Jz@DX zUAyYje|Gg(hFbo+QS;wf{`ISWtngsBe{A(17MA~ZZ)W-LD%43D~ zzS3AKnS|EK`b1|!dpNz6DRs@uoyukQyxd7#K+_Y#1=AYA5fnJQZ&%X?mKCYK7=F0OdGjcDl9U}%S(D=gC0&K(j1 zt1W0G8F^td+-*M(d$!p=I2=&QPj{B6LEin~Rmx+vsiGin|1;ikxr4k8ZA*MM=GcyhAlaQk%nMq)H zBZPJdtumoz+O`a)0&Q#C6_kgBms|3ZZY0k)OTcJ`CeQAMN07Nx#?__!~^_o#>AYMe=Vi-eJxv%9bjKn24~FV(cy9oKj%S=x4?y zS=)k{$&7lk_0h43fh|FVB)GzzS`zVbuVrFIw4x;2$*A>wRilSG)29CeTXVr0q8G$adP7h*}wWP^I>It5I)GHpMANMJ&n`?U+flf?+asbe*jQlEC!W%Kpj>i)x zVZ-SXN$({tyf{9*M*31vJcv-CQz85cD8@6{e6K8^xp;*M!18ZoOw&q5V&;Knv`3#= z=*m2hotL=;T_<#lO-ea^ZYDAiPBFy-6=oTXqGb9u*-GGR6Zn*TsFG^8HmNK4U_I4o z7ftbQeIh{|i*P2y@2U_55^>yoW&mE*!EtQb&Eh2^o#v~x1K}2{u~dyXi?Ese=tzG| zDw-O?yAV0Tk1^@Hk?D_d>5r!LN17x6K9kg#95Rl`l0F$!p=ml)AC7z1#so7P=4Q;u zuQe#y5DdvIsf9dJ+wcw*qu5@{*6fJ6q(SsI8no9eOXHk=tInofFEs4~s-qLhwA*Vz9bh8%Q$wQEIirBm`H^FPIV{P1C(LLfXVn?M zc00`2$c%_-Z{TV;1Ni|NzbZJ3csP}oWB>OORjr`w_y@7($rV- zolr?3$dwchF+w3ZR&N&nS$*k8Roa4XO{}DNkT0vn>EXe3U3@yNovu?))*}rk0kTg}-j22s8TY}r{i`}-i6t^q-FqhCYX2~pt7+Zj~ArDY6_7^89 zkuj9^NIJonE|p1vq=W>59OiH8oQo@9)z`oF)4TfHieKQAAPSYlQah0}XX_TvS0_P# zUAzD-=9l~d&%0rjFRAEUo|%X4;?f)yZ0wwS^j#P0OALEFn#;~L4y>up)|}G36-zZ+ zE!sj7Z+P`#>5gJOEz)8wx|W|?_$k*HKOg<%!@R$cU%vvo&gIJG*iuU+4&u4EOM9!6rQQGTH#VZPJ`8)^>SIL%|<+_JYlyE~}6d=1a(o*NBxc$Po z{k@%25PJD`N?h6Jyj%q<0$Vr+69fEZhzK{$Db@U+NhgNL?70(b~7 zvf1m_EQHx(B5YonP<{b)(_i$vi=Rgebeg8(UmY$DcJsafl*vQHj|wPq>tDF*Mk=<` z8erVOEkJb=Ag~|>v<86OBJ(Kd@7l(SV7!nQvkg2z_gH5U6me|jb=*j8Zg|vNkd-|K zJHS(Bp3wjB6VCZRM{x#_h(K^EA|Bh)2)0;ng2K#5_tHUews8MXQk)vW$$-`dIZjF} zlJ$}4C4CHr8CZrdwid=!h7l5>Mc*$jia?DFVVeyS7HdogX~zJL8Un4V$vP}wW4?@c z5cB;+H=Hofs%S2rQ}@NTysRHdbnVHbEQlet~U_m3C zP$`(&NXL`mf&MvBC1Xq0Ib%pEBkx0YcxDCN7xo1Gg&)_LB9k)mL@n!6rU97px(NK0 zrN^*7*nCi=gSfYoXanMxy&ut{J4sxIBci4dj-Z7ZA6?_0X)A0$u4hnpS2Ln*rp%7g z4O52cIG3b*g z>ig42nYmUf3xNv7&*V(%JMCFL7u{pil2L>dF9!*HFREMvr9!YgKSIP|TD&HXvJUD+ zG9a8vK|_jUNKvnc#REmMzb8_iP$yCWIwO2Z&&+lr9R42D6Jx_oqbv&|s=znJ;XoOx z#s5>qCA${=JO6-}d=nFZh!&2Kh9=vAR#>qG4@GbyB62*Qy_x+=8(BNUR* zeXI3>AHkQEc4kSNgdnU2{Iw8Ee@JU#(zx|9Gz1K{w9p(ISX~CAQ_9s_TPwr-rnbVo zhCso{(Zy0~-CBFy>f@JOyYFu+jP_^0w5{AiMf6Gf`AqZ!jZE)J-FF_W?HBs)+qgm{ObY)xMrrQowv4fFjs1IIKCpUId zp%r5%gW6%4-g?AzoueTMz$&LOX#w-T zY-dYpEc$w5@Ru$tkE>VNn<+Vz%07bUWJEKSexqB4&odWq<~l0Bh@sCiJs$Z?kmq97 zE=U}Z*TZrK8G>R#k8klO|Iv+NE6%U|`~K)UPb965sXpv|Pf?U@`YFvPjO;9Y-Y*9t zQL?pVW;oj$!}`IMLYd`dm ziZ4aK5@>Wy(+^*q8Mg(JUx*bgYc#s{8TOs$V1tQh;$kZLZS7vlDsi)BwMc7AD1K1% z>uZ}r#BGh_^IjxB0X{o9B7fcym0v-l}d287btv$Q)2i&Oj`*jY~cb*}VUDDP)j{ zZq&6Zp)>)_$gr^Rxl8+;M2|-Q^H<#1Rz3Qggc0H}eD=SfJbLm+J)sQA0tf+1gp`y+ zA<5UH^*7aI5)Vk()qw{jLYYxr!7X%erOJ*~z2v`XOlWnrUYX{5!*R^&#FHvav?7sj zDoiavvUr1V6=PT%_UeTGtMHvFJW_>ED&CkDNl_p)ev^s}Q;}1vMeML(okmV&#uhS% zihOBChFVgo)Wq^IllFs5i2UGm%syg|LXKD`#6;X$7}9KUW?%Mq{n<@u;v;*y)}Bru zs{Y>Ek{zQ8)~6Lr`tMKyo(!E)tTjJm1riv<&u9y8A6kD}!6%Xm$m9n!?CI`9^`O62 z0iq;o-ZIfujQhQ5uOrcjRGMOPyrij?8a?fu=##(d!#Ydv;W~M6~Q7w^E zO&%lIW}8|c^zn-jyB?XA7$jh3<84l2=^G(ZuSKJZDUBL21dYnZ-ve!`>JzbHn=3p> z#8T0Y_{X&ZB3h{F>5yvHNxi6wsWlR~4b6fmfuHTEh$@rxHX^G3P`{354m@Uy#G0_c zwgA6NB`YcBp%H0G%OzchH6oy5o8Z~;I0}V*_l?0{mll?w*NCf1giE_ag5%uS(H0lx z@!3`E^&=bdUIwP_+DYw1LqVNaoE$r?$p!&Zqn6v1ZZWV6K+oNU@QFsd{nu_TU? zWpTtH%OX*7#$GpC0BDG1qk)S0`$k$Y^a5v|bsE6yGq%^lnT`}^CRA~Tyg*dPL_@OU zPcaWw#x{=|r>mmiqVL(Dk)@p~{4R0Eb2yjtyjd*Jcajrm|Yhj{wK3{STLe zW7**}Vs}HbC9N&vd8QT_(FF;DcY-CSX|S3J)U09QD@^{!KLL6%M*;_b8dJoo=LQt} zgo=^KkH9uK=I8?lAgqyh(Ex}Cwa=oxL|n!M!wIzTYrOb@?OOB?sH!ASuw8#=Q(-O% zCkA((?!NKP%gt>OhSkm+dkUPzw9UNV(qPI1cEe!WIk%_ z9mSx=!nAHvUK?BrEX}aBxY{bylM;gp#Zz{hI29-#0+y=ffk#@N;xCFSz?~DP0zaM( zLTZ)gN}x^LWFkDXSVQs_pxcbBu37U2jEF0B?f?p|O|2*i#z4CvgVn|RM%S*LW%Pz9 z%G;Q}grxi<4Vku0;`41tm;YP7&~c2MZp5k?wrfUF$`oresK|j?7o4IN)u!r3=Qebo0s5-I{M> z(ZWI+O_ggbjT8RI87Og!os(6SY}Z%vsz)2^nswMv`ro}?@PCd5h*9H6^Y2I(#} zI!*;CDZEC~lvPJeP>sf|LZiCj3JAjRIyznoeW|nTsMzHyHmXX;jf`8#g^20QUTTz8 z?Xxo16l!!_>XSlx5<1?jC{E_v=y>5Z>9}<`kd(jQd4-}W9<4F81l8H&>N;OQ)v}Ta z9ZyF}sP60ZUv@y~IAM$f>9|eB06K2CyjQ^GId2A+LwLkLZPjU!z#_D49TJ!CuE%BM zk*`*9Ikb-+3OV{`tvV?#8~(fzR7RrmFFg{KO%s1@Y_5|^{ysv~q>^-wYg|wW@l9c~ z?ISj+#IV_A*OBzmHoBqq0Ho8?jZ!si5~6OCRudWZhe`b}F#N_pi&1ZIQ#txOx2pcBthz zjnhg@B=159Yk94{%^1`-t8UW}yfbuktnKNsj;fi&=p39y4dyIbpZ76`Fm9)ixWsY* zoNl#uWK*zF68C1~c$zfijAJr8h5}Ijv4(?}YJF1qtp>neF=?F=0p&|HCyUY>+@&?O zF4@qPRG2v&@ZBI|f(>O=)tJyys^pS0ZYWsS+{OVAc){ZEHYLqHYWic3b&_&*Uk!xY zqxRM6S|?5Z+G?Gw4$faStl-}9v=r)Ks;L5eOVZ1YHnvsP9OYiKxs6UT+{$WmnqyKw zc4qvKKbae|Aio8q$9JrZ*<4=;XUST)sVRtQ>y$$SmK4@al8_$ne>uGHp)Ph1^3j7? z#cXIZLT9t>_2Z!A5D-itZwW=A!(Ub`?4ND$KPVQC7!3nO?^`D_NO)?WuFlUMQJ7x2 zkBw{bDE5z1S$E=GU7-Mf?ypQ@K38RB{3d;Qw#-mSXPzxX=47Hn$Ku+PMYZC3YqmU0 z*ELxg&Do`xB@RNH43z{sN6?6EGqVx(q69-ii)a2OOJ|GPL8|QlVdp)7rz?cEk{DF7 zV4JpJ&g4RTe-{^Wg-zo^EXi zyE~)vJ2Q#G5ycM@or=RtSSpPJm-CQGiC285kN2;Wl(?rpDRBkq+BQ^%+%3vVY+;@u zy;|wb@3qATUB8u9GxgegZ^Y7%?#y4fGi>)i*Rv4 z#089^s2F{tCW0GoF-Gk%VnhWQ!%}R@ps0wbsKmjD5sZnb7|@`C!PhatS7R`uAyFgX z|9MW`d%I@=LCyCuKl;{Qr%s(Zb?Ve|_}zq!1qSn)FW!5@U_^?{Yu#UPh~ti}c|!X` zT&I->(c@l&d9>Lj28FutyDT3PmWi-O*dvntM_Okfy8nYXbY$M@HMhdE-``;YdW-G=TPhALto%L7{+U*oO2?TS=2Uos$bc#pgiy(C;X?EN zd2`@Uvi~qR-W7+NkAvf+01jf{etSz#c5mAljt-o=Uy+agM?&B{e6w4g9uMB^_S^Mx z9LNzut$@NWpLZ1^7>jZ(flhPch^j?kk19bS9R8vJZn?>oa)g^HH+Xs*y{V5ccFJ5l zGl2Q!Lw#|vQ~1TS6?SQ0PWNT+9R*z@c+(T8(wxVN1>FwCB#A?E`a z4k#nt!f^1%q(2_`5&{zXv<~W%m*4U06T5`q#yLWKYG(*La%Daa1(76Mcuakl-!sDy zjTx5~;8dPXfRZy%_iY@w-|-SK_qCd+|7Q#Ca&j0}6c9 z03J?BF^-^BxNFX*8CLL%xoj!FoXhxb!y_iV#4uv=Xz?+tUu{$<(SOaGvlvfiAvU4aPV45G$UfLrP3UKZ7%9VxsCmo#O z^2(0zpTuxjaLMrN@_=7g;8qRDA2eG59vTd$3bSFs(7@y(_-_$sRvZe1Sxs|g0ww#; zVuB4w5cx~gtHIJG>fr#7?pWrW8k%zr4bj93Ed9{Zc<*xF3~VFAx0qC4Bu=pkmUvfh zDs#?JZ`}({W+%4k0p-qk>wP_=-07$P{YtE_-dXOg0R@lbs)T zcAlZloaIR;WiObcUrjpK2lkMqXk!v>_F{?_`n;6W?MPUG%moWW4Y0LD)WWrm;;P|P zQE$6FDRCbRkx+`oiZ;r%9{H7pG;y6gDqh4IFYg^M8pe5&_Xr`!Sv;I-$(5(5zXW7@ zgR^Sf9F*`%7w2VTHj)R18M36(IS!TqKdN+kn21`e zNE}*Nu5wQ9Pl6Cb=a_;qP0A_7sCRD=3MOJ95Q1tnFfX;-(MzkG-Xk+P3v3*!Xq<<- z=f-x*Y~a?5=A}SV#HXE|AevR@!4{nE)!Ql7L#mx~NNo$Nox`lR^~P#}{PSw3KN`@pyYnCdH+Ofg zLlGw*;`Fj+=^GAleq!CL|L+i-=y<%|?crQuc_dTb|2HCH30$Q@U7Q`w%Q8hoPCE&- zjsZ3Iz*B=HSR|lSuYc3i`Jwf=?$FDjiP0l_Ii=PKx~7*?qA%~|T-nj@xC|C$_uOD{ z?^B05Pl(a-RlS|jupha%x6_Ml>ea`g4es0fI6WL==}|w^$H`d6vb|{_TUy5I)7Kf! z98>xlY`oUjY1iW*8l_wJb7atV>*xFn5Oh4u88n*td38NkTAhH)yyHd-Pv&hmUaK^s zcRpN>q{DSF-|7>lEli?B&OL`Yhrod4ODOfs@1a!8_9&ICyaCfNo@+74sXwc~)7!G2 zUZAHR?vxN64;=3N{B%~xb)I3=IdJ6(pblKL`h*kea2bPE>`udx$oGt-mV_%M={mvH zSzNZ~>T3r$U4r|TO9nWLLxW|RZW%YwG3IwWk$QrxpSnFS)I)+RP~U#_q_WlUGvm63!nzgjRq$O(qyVec+r zesutdHg>HeoCSHWaYSN>lI@8d@@I~4h7E2umTfU0Bep4J00*qEX9^2zu5U1+t6`vi ztL``0nHL&#WdMwmm+75@F&MY%PD29jw+X{K2JUy-5a+l~jSV!)f;^kgtvxDMHY~K~ zc)+F@FXwxH{WxQ5k^t>RCgbFEO%b40FoL#0Vi;wnPx^`-(@(!v7Xe& zk8nBxEfLd2>!Z2_^=7O>gR;hc>#|@T z4P`YS)JGrfTwvJ`&eIPcg9!$;y?Tt(p&CyVP&bV0%UKp|A(w=v%4}~Ne7khvvCeep z!4@6sTsw}i?Z0(#w9~M$fU)Cl7QzfC$l!>x9xQk33r0DUXk7WVQBJbZzdnVPgq4_3 zU~9{By6JAmITy9ilS__s29yz=4x~sk+1MTjBIi&rhR=>OjA7Jh=g2(YE;l0X(Y2$U zvExFUw#Z@l!cr07ck5VIk$*l6-i8u>%PZ3oqOLB zuW)G+6?^Zv0<03V;wc=wFb*3QUL+*uL4p^jP9N{|OV5gX@yW^P7?>7i1{>wx7sq{2_dS*@8~SPvivQt*QGRm%+zEfWV?G@Q}&Rix*&J!*cL21#E*Q z?a>IpXELT<$E$(Y!kc%A8ae923iYrt&LDeMT>o^8Q#q~WWhMyP|9lM)3Ua8Pw=j$lh@B$hc%`X}ZG*r#x&WF3AGJ85g_~NjF;Xte zp$v%s(qX11WQn1|G*70YYLv==dw>}3XU4o6r|`W?K`50Rc=8Li(dHoNv%rP+ut`;* zL%#`tFH@jj?$@}vV-?8wT-69_eawkYJ3JT!QIq2r@}*x2(Jo*C5p0a@SyvGI%r4d& zq~imCkS_{4tbnNz#L5`baqn91dZ8B_c%lJB{2yJ$7hx=^ENQVi7Xoa5NrlI96Zb;f z*Uhrz=@XVG+7}BH394fYJ&L#wI2{0{t~ty3d8hCV97xm&Jn4cd0>cvA2!&x}m!9o( z%%njZmD@nk=f`EPsa5F6KQTLn8;-kSw7aeAH_XC)~Pzc;_^<}PjSOf zah7G;n85?OJc^S$#6x}j2hJF4pmcLG$}t5^BT30$-cOS^)3_eNau?y~nBe^ZU_{?~ zs&h%|H?}>({83kc)oVsMvJ;O3CF*s%)0|rCH~N9ooaHcCRClL{8MG)rd*6K~L1(a5^4B!gv1Z&Y=^+?#1DAb{*&oG=ujtz~@0o zcvqV5rsaY#%u6A%EyI^Wva~dQuY)qU-b&`8Z_(??Gn}(p!kSPI$ct&_pW!@G?o)PVq`e%T|r6`}i03=pqU?CYGF`#@PIXOj}02vM22Oyy?0&M|+PbOpo z={E!#R{)7iMy4S@Inz0|BE*w#-3fTY2uSh19-fYlv8+vJI=B7AZ%p{;gs(~oTLmCZ z^Dx#DHFB}dO57x0VXKixMuKQo+yFX>oKz7hlaW5(!7*TFSP(cq(lf{BoS)wL1vRjE zoy+?|TzIt$>Ll-lFV`A_mo=7Ur@KV_M~Lka)ThS4X`;tsP}!rez=$V-riAj~EaCAO zvAAtP2a2YG^Lsl!UmNi-UqO`w_1JS@KHg^328)_$B(f9h&=;t}AEBthn76eMR2j+J zXj#}cXWLRyepCe(8&UKRCNrG&ui!yJuxLI;D6eVr`Kpu^#YjMna;U`cJig+Mq{9Bl z6&Rm3PiEn%8QJn6yetiGEl@F!E&|jDKyoTbgmwCUHm)b?!4^EUF0N=@074AejC=#b zlw1rbb1;QyBTcd5yh}oyrmf1z_m0#Mr#=F4FcnW$3rq1fqhrB6^1iaIT(EHc_1Vs0 ztwPe2_pbDaiO$H(xbufKI5Nl{Z%)Xt)^!t|j#Xhkv^B%o+0DQUhp|xgUnV-&CJmP{ z96V;|m(w?cpC*av!prRvePef3(vF0fijvb2|AuT|*4|93X9g&rg(89Q8cbXqKPR7@ z(_u)XY2qkMR2e2%V%||SuObC@fN&*&Z`MV;r~jkR`Jq#u-b)OT{jwp%6%?ouZ|T=f zgRcmC@q6vWv_CY$UL^Ga78wiq041>&1Bi4a{o0U$i?B-AqMCI<6Bw2OG@7Bd7>6+S zC^AD>gvewh-DC_$8;#*;^DzuSV`c~w(5L|vd?V`f4P%!WZ;wY4x5hJ_QE57Z@2h$- zuTn?>JY{`afTxIpec&WMXi7OgQBjU_?Tk&AD0q&qEVsF39L3o7{V@R`Y3EJPfPi*O zmI}KO2-OAz^NycaZ9o`rLFqyKfdF`T2D=axw9L+Lxv&(#5LV9_1OBjj3rG4vF2Tky zs%6JP7CQM{r_bS}ZLq*U+9Jl0d4juC@Q1D#Bgkina#YE^6f3b&uR7P+VL#yLd(U(3 z?Dw(UmnC&tiH|WJu~>k)=LZ}-=Zbr;$>_icPIo3_10$D%gkk6;@p1kC{ExHOPJM-{ zQ(o=O>mrHG9EdATKur)Zzy78RoOQACKR~>|*p#Oq04B8gk;F|g^m07$2Yt>Yr`r01 zzIBq*Q{)41L-Mr@Qv?m@S0-WAQulAEZ!>C<`jYk|crz@TvMHDQk=q+b!dyGTbWNAYgXWfTckIwB*-Mc78DWW9dgw9lm`aabmGD6rVWGZ}V|4x)N~p#J7ku z)%raEnp?X)@!o}*skR^peNcU|)8qK{pRL1G<1O8_jwcAvPc4cudSIW zA9S#3V@)Z5F%NvNz>2ToU;6HgovQXeuQKuqMkDmJ@x<$T%f;AkcwNUYaXRBub%}F& z`IcKqlE)#9nWx9X1wD6Slbs*e=U(cxFR$BoikL|;{g?YJBWhCYn!3*vwxlS1VP9qF ziI+O1rR(=qfS!4&b73U~x_g@kUG`4;elM{0R#Hl9q(iLwVR9 z9Qg^d;@MI8WqbQgan2)4m@~zhTDc>}aq5rf4XD5jILQG%VuK0n(8I29&armXFS^3H z*2*_Se~l#7$*Y{seb6d0Z?tMH29dv~P3GmThaa6mh8Sfl6q2pptuMRE8Dur+Wmh?= z?mp1qR?-{IfhIC&b54JDl{1rY-+Z;xt)hW!Fo1j0O&PeiKy+eJ4SK`X(9k#N?$IP`;TK#e6I?|p5k^KccOyTQ>SuyNPhJqIPZs1CYEo_}(^o97}Vme`{Q zYUgl!+FX69cFsIvFCLa*=hfbY*m7^T)Ggv&Dmzo00-TH1;q`AEL7R+Xta;91Du7Ji z@zb0`RLv{{r%sK{Dbi!-IdS{1w*GXs)4rrAm?8x~Aj8%;TM>(Rdh$GHY`YCQ#MBDk znb=dmX`Zvm!V6VP7C8TlPt8JSkF~S@#zjtv-5^CPOV+Dr2drqohz*iH=tkuj6&DLbvRtDy%&5}8*i=eYU{1>T}9q%-__1r<-6K@ zD}7h7x59Uoc*}fOskd~Y?(v}W3qtYOgHAuY$3H<^z;rC}i8K_121k@(5+eH!{6Tnq z{&J_I&8$6EpdqDqi`GHz`wCSTAQu#diM#86_b3!Xt>%-F+DY76Otw$V*PlJ+oZ48v#GKU`bOA14w6BKT!E9D20jk|TuBB8)OSV=nsKC?2YpW=h5M;BQ$@NNM4320 zN@xkdw*-E(#QSS&v&29{x(Pz^4hZUR2HHKqa&SUFyJddYw$xTbZrO=5z1ULAnl#MN zO0(?gM%C}9#C_yH(Cp4W@FDFF!2ga-452>=SkeB2NZnGu929wmAO?;!_OZz~nsrR0 z5W|=DpC%~rfQCuf=JY{jYo7Q(>AZ0ZTZe7_cKjyT1Gx7 zi0u#9Uvoz`r8ME^%@c9EN;ju15Ul`y;DN2Y&NQVJ`cRDElrp>zw)g{;6deTL~)HJkrw#R z_ciw%5Qxp?pKr(W52&($(`R*=tbbeTnEi41Z(CUlg6=-~PZo?VWcvoHre5yAavA<} zAOkN1sJY{yMv#ak+;Ea|N}+MW)(ggKBL@V2{kPvk!3YJ=%0D<=Y^Yw|_=D4fiXi(% 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 delta 203740 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 OCg2kAA@JlW^Zx_S7`Si% diff --git a/test/e2e/bytecode/btc_staking.wasm b/test/e2e/bytecode/btc_staking.wasm new file mode 100644 index 0000000000000000000000000000000000000000..5f966ffec402ddcbe6485b65485535bc5da2400d GIT binary patch literal 323715 zcmeFaf4p7gUFW-g?H}jtz0cW6PJSn3t(^epKn?_&CLvJBI^_`3VoR0Ry!7h5A%$2t zhe9|6F1@do97@`zBi>0Js#K{>6-`hGJwLzC_xJOCzAM;u&-=q52*PiM=iMCb+ZXQBzroG% zKD*Z?xH+`Hyh`}VeMJ|pRl9Oib2r=t!OeC5qbx{8tMLG@xi1QHYrQ<6W*?xmE|iHM zcwk>>5B(7Ij;1Z(Cedm3ZUGKeX zYHyI}zIN+-cTVlzb!$-3uR6c}_o>_W?hZoz?6a5ezw5r;-NN_Wvg^(uDyrVO`~JPI zYHQc6w@&T6Z`U2S-@1$X*4zSnMuofXy!{s5{2#l6Ks8<2+wOh;t~<+T?R$3Lvgh)* zZkoJo=Y6}UZvW8_xK5UJA5ZPRg^^6{+;i`HCwG4!Xse}x-M3!;*0)}E#f&;b#l!dR z+I!1wGhS70-TmHs-{)r2xclDSQy8EJO)GO{k{bEw?M?d3ASo^i9>lAYMfQ_g@sn(dwiY?g_udp9;fTP+cDH3-jse<3VFzke~X!r@PnMbiAfU?yb}{h24Lh&cdHK#;?z(d?c)#-&2!~?79RckF)Ot~+)@DR;bg*DaGffAr4aH^NI^v(E0Rsk^3T)cDP? zPW`)X(a27R{kQHefBmV2x#`w(6LSnitQ z;iB7__SBE=x@EUW>Ym&0x^w3i9{2Cu3B~W)x%UH9ycqrTsc z!XOVDzaH**CA$9e(f;V2@Ay{uzZ3pH;djI7=)vg2(L>SHFU5O58h#|a>u|h3d@y_{eBb^5S2*!l_%q?k zPlrDnPJKT7cj1?!y-$QwzZ@P3KNo%>{H5?{_-o;gsV~I88U9B2chP?eZ<}~7d?DO% zGWK7X`xoK!;og^{KM6k`{ZaVG;S=FE!v7flS$HD+eE2)z ze+j3)9{%U>+3+jj?}k$cqTdU5{Ojmb@qdqY9FBHOeJ(l@{bKYR5$*g+^sCV?M^pbn z!}-1Nmw0?UdOCU{`mN}DDBd?5Z@{14HQxc}P+7XEzv$5E6Z9M%STI@zhO3({~n3bJanEe%J5B-xf$ zhogE{YlaQG>-6c8T&EXlU%TyI_wh3A%fpFIZBta&vmou8$k%TTf<_wV!PX$LYH7_? ztQ8e&)@qQ}Ch`u2X{A=S68kEX@3hWpY204my6e_TBcA?pyn>1`jg;LdX>BqOzt2_7 zqq!CHpF15~={t-jG-!sMCTXSpQ&AeEb!L$4OY8Zv3I1tL@Us(cVpfzJiIPtL=D3{( zyh!b7koIqml02;BLBmSr>BPFA@hnVhpMz|)E{L`XsG43l-U{-18UV-+wf1)6G~`db zV`YbHUjM$8ojBijPrl~9EToQBAxe`?(W*4c>2Ddos2gmGhO{hE&fPLy>kJ1tMETG} z`(t4m4M)w)F7$(-sYXQIC~s@3?LUL7wZFkXJh7Sl z=P-=?OyXiDD$iWr*_{ic+uKQa9;QjpT#}x-L=1!xYA&&xOWZq`*v}<)b4e)V<`TQP zaPe~i9Iri>c+Om6HkbzKbOD`_3XwbylCf*CAk zRmj6LaAOw6t6EwW##hp6QL$>Rg6SUPc~!O&TTf}#FrF8N@z!0pR*CTy;8^W;Pfs4> z)uJ$dR>cD2?X@tzL`)WW*@OTe7y^t1n`7>DsgHpm?!SF$(&-z!=3}gH-$&BqLup^n zyZ5Zjl6;YnHQE+~thRa+kW(_&Ki%mc>wn-whw}|nqHr(`{K&&eFq5}8WpUb{vCbf1 zgC*!23w{WIiA=K4VYje)A|Dkm$%oQ#vQu?n()>EHhZV3WrW|_+#}nm1s>UN~ZjKIc zTD8a!f?o3Jhn^1dEI;{?r-Sx4h4-)|mJ}9H6AP&IvVdAz6AMUYvw&m<3#d6{`+TKf zuiGa6WwY0O!vt&enMgRoLc?J4t$;oJsUtp?L&UmST{KE^;#BY zI~?60$ZOuu2U^6fLDN?e|IW{R{CJR8q)@aW=w&8Z2D=T2%ObuVK5c?UCI3mlHtYsb$!X`O`F&|%+KN@`PTyKHEk`fJ^JleI@O*o1T8;_WYtwiv z+#Fry77LCZgM;}KpFJM5KQ2`yY5%9N#nKE%+Wnar;j;@uC6f%dT{cD2z zaJ1g(7f~Lxe=>4w0rJL>Hf!XN*Op>~mLi>@IB6+Z2O-iEG0^MOGI~?tisLf9swQ7V8PAsDC zP(HbMIEBS@1w@m_J#a!E3r+&C6g2)h1J!xLLGLR2ki-|K2=3h!EO0zy&!(v9SB5da z3D_nDY%6o20c^k0g=Hx6`7iu7-W1q^RK6G3f??4}9NY-#j3)r)Pe+=J6lY$*?Rj6% zV2XL~B6OEPcR=8JK?Czh=N#2le(6tA@Jd8gp;|UT-mz{99XBu_u+K z)zRPvksu@$=O^{lR;DDv{3V`=)YSh-w5L)VV?n=V!GY1iAfNt$DwyS!O6+{KEUgcVyHRx}aGXff!_5`>8{cy(Df4W`Sb z(GzBIX=+G6dfkqOeMdqEW+i^o9hi``so^Y3d#!EI6|pLwiUwfVoF5Ejaeple6K|*f z3%2ai8Wv~LeoUT>e;zaDm0mAVrI5HWNbDu9Py+o;0zr}l)7487DadVmD2dCjQXQhi zT#2h{PN|BSfv+fTrox3%#jD;{x=NK^NU5SUqbX}46?&8^lL|dbl~wXemFwOc(t06@ zJFB%q;@WGIxM-`G>O(?ChKbQwkt$m0H5w~vMMfi-JkxLFFuCv>RiFT{_|+2H8zwvd zqVYIiCr##5h?xibsR*0b!40{r7kA@2jNAx~zZtIA&18p<)Oz`dne5F@-)uh8XMCi9 zehr2N^nccS?J(H!+Ib&>&<`yW3DsN>2H?FkZ5(;@9++Ffv;aA&!vPGx=ZHr0pNniHL-xVgOokeYcW$6UfBt^GWe z!ieo|f>~m5xd;tVJ3$@i3-lXhtoYrh-}UZqj8w0;rt%;n=)Ln}dr}0dshwy;`f;>?Ex?<=?b_dn-hV z5zI5Nec7zsBy>y z?S8fug@wl*5-=Wc^r|$HUAd88=onGHu~%a;%*QnX$An=!b%S9Jqg!xUk6{w!F9WP_ z%&S~mCW^Za<=t?3mzH?2v@;pVL6DFD-tjojuybcIRP;=x8 zLbObF5-bLzWcauZtL>UtC5#@9mI;r+ox!{F>EAov{G#&+^BG@4o90 zT@tT(tZos8@00>3pJtp#+cCLeZF2fV@>fdpI`!P~AYYYFe+JXn{E`x&_Umuq2*4i! z5x}H^9GALQ2^YV9t)Iw$-&{(8UDxr3pToLf6K#r8u61CYKl-aUK4X5R6ZHD`jKDSj z*J3zssA;$Z1dB5$G_7oxTZ=hi}e1+De2yr7~A z=ErHa|C{0L<8nI)dGatn$eeR~dPG3{LMRT<{#G>J!Vq%KfhhlNEYX?Hf&8}~qu!-m zkmXOXgF6F;G&&L;2{*@2g!xGZnJ=RKCur$a{do9iy_*4G8E-a#!eo27Hh3>l@y8*& z*sW~uzo~X-0B&_Y{tnpt|i<4S~o2nde?Y9r&_SPR&N(Q1JWNSgX zE=@qrD&u~Px6q%oY68QrMT6y!@fHhDT^`Er^F;vDj9=z(EZ>PwbV~+B{f1g~O*Ot4 zg>_MQ+gvP+&sckeP=Qd)=;c8h>J34A@J8|w8n&IEXi`fZ>Y;>!HrN6`OE!R9Tg^^2 z58fqQVNR(CPP*aVPQCpLX1?I`%|AT-Ou+UO6Um?Wh2!$jAL8ODA}jnSoGO${qC-(!qj@})Q9Or>XF~g9Tw7cjqGa(9x8LB=0M{2VuouIuvL*aD%8$Xk zHjyojZNwUN+DU6iJL|ZtyJ@8cUxTahxF#oO`fipsOgm%g2Rr9W$P74az!wKE7zqX? z&K9T1r9q;7*a2I+d}$$T2gG5Ld`%%(m++%n{9v|nHnFL$iH`)e&B52hRAYZWoM=DI zQ|TCNRkvtW0#*B2vJes8EgA-xTCpe{w3m;nnWg5w`iyQ{_H-IvoSvVq!a-3zemcw+Sc6b9KR*{{?Dk$toIti*zrPS>D^k{PB%Tfhz^1?iTHAb@f?=Q6 z83g)u9~9st`BXdoT(S8}y#{|JdYGZ8M{0p}wuU@}j3KrP)Bu^scOv|IxvWFlxJ zAMA7-JeEy#7N-5Bik1pGjS>m~_cobni5n@pr$$?u!qyk^ zyJLFnUZo52WqZ?h{@w4!cjxuJQ&Zw403^vU6rqm5^bMJ#^et-PVybz_s`^Kc_xqixc1%NTR<>ISr+&zjL>n3kJVIVcHnOy;b!jr{0liCr zLdO}2w{1qTw%w*R0;fG*E$u2!S8a;caapl7Sj%Pkl|ja3+14QCLe1gL(RylboJiB6 zCZ=Gz&@V%rp0_EwmZB>+0VcoKg@3D=t{n?M)Pbqnst2M-?KXpawtR+zkwXvf0W>n%YSi6=zmE`+!A&gspiRM5sAJFZR71DdJ!{ikpXM z0`dL`ZZFiB=g&SSlE~r!bH~CDb}FJlLsYYxoayqLc8QD6eAO zh}E?k{P<2dIY1a;1Zm?9m)R5!Yz_l{45;Fg3FBn?T`~UH62E8i1R^!jU%5Lv_TBIy zhLQ(*AQ|7C%#N0xM3Z@a2OLY|t{W%yqeeV*Dr4gF?VFGZ5VLEie{MVdt{sydYA5M! z2VRPjI6ci;K})Y#D`W5*KQmJ$0jyTL z-Xoich%^os3m)>Kx)3elkqI?pV$_gT!S<{QSWytGEIO+_XwMf48xSIqc}6crYG{?< zKo=iBDIbC%7|NyjSiE|Kv_?B>d2|C+#TJcYx*b=cI}|G;GZ3n!t-~F8d`!b>8CGS+ z1z|}?vw=L!YB9yEsC298Y4%mn4!NRZ;cn1YEX@FKsVh*N+6T2K5$WJof(@u&Ai74u zos1ji0zKJgtL^x}D>FxO69@-_Z{E$2Pz$()Q}?xx5}$^cA|kF6PgK%Aq>@uV;50mP zT&A+4RZ}NwF&01SPh03r{1ts6>S{cRC)28wUc}x6!Zl7C3S^+0>%dcEQib8@jhNp})fri1Xd&$e#W}~B z3wOfH19miRHGxzc6QB;g*F(xOSChyhGBN>(ZH%nL4wrHh|NZn$nnK zxRiJtMvc@BCUdmYN*ifQYXIbh4TM?MQ8&6Ul#)>~>6;gOTaxI_um zGD8adz*&Vn=4$eo5Rp5;mwNuS&wurz9eKPr>j(M!=n5rA;+WVjiii<|VO?p=%9=Em z8%|hAaTk>*cPI^VF=8k_Hw;mdOmJ~9#lI@1A3 zTjGBt2HDpTwbbOc3ZTP+fSPGj0+Ka6Hvx$~iPy`CM1Va5Ljm=WLsF;9Y0gb>Rr~-} zKl@dKS6Ut^b#mc~F3zskEt3MrsL`c*6gUXTG`z?_(fE@UQQgPks37hg=`b_Ga2!vY z{jW?`QH2)XW+C-OV$?`mu{p997-0TS@`>~d+3&zX!QL*5-L}}AHteNa?xBY$XO`Rj zl$&-wnDeb4I8L|RCseK}stMf2bXzW?vb#^~HQhl}#cM5aF`C1A-KW>>;Oxv9n$x79#XUj^;G7r&&I$I(>^06JewABeJi~YFLN)O9IvKBOZi5ZM zR#b%GtZ=cx#;e{|B>3_+qLSv5d;y}*y6e`0zaH3M?v~?6p2#2Nx05LJ%pxA_zPCnj z0+_6|;rIC@<^-4Ow#20sxF1L0X zwxN*1lw2&G-n%L;I45E$cu;`A>J10CD*~g0cV07SLDQK%nmE3g@4^!Tn)-%u&6M4_|aD=iA5hst%J3DNRs@FPSN>BsdgtR*Ij zcA*WvnkfrXc@-m_RZ*U7hOf<<${BjbRD!mcAYGl?1TErMfxE@HQPSs5unGwXpw$^9 z+mc&s{y9p6$3et-mSV4C7^dP@(MRwCi(zY_%Ra>4@gcCM1S?o?Qer+P;sp=oHc-yO zBa6{9>n=Mw1M(uED0da*o^kT|LdTWxB{ zySTTwh0E8k(d0Co-`Z4*+a~#ketWnsopibG4dS|6T!rp` zM2LLsYrj@i(Ic{S_{W_(>h_bUS{r++Xbh+2jQ9m}aZ7)Y_R*{DeM;D5+Q)5$_JNJ9 za_Bnji3o|b^TU&1c~3O-ssfoPIfUYBHeabvqP3dY*Th>AD_A|wslZa1-i-P;!fqf# zPN~O`oi^=66PqUr4nA9r4RdSYqjACLXX#|y+$xYoEQWZtUT&OQ1=mXvHaYK9Zk}5O z7mI~Uo~@TXbE`l^u{J2qRt4;v12KpwmO^{BIw-tz>Oe%XIp)s-vqSUL0Uu*+3Z1Q= zC+4Xm-$(xJ+3Osir;ZtiFP^;)TRU^+gO0)KoW0J8xphG5Ze+PRH-Gnk9?0?M9TlGW z1`g!-7#wHro8PO@Yb1j^?2CH6hG-J(3O&qNF@AZyh9@wLLa(vYGsH0yIQLU_CT7E| zLpqq{%{yc+D=sLD(Jo{c(FPg_{0QU7`gns!gOH}0wgh_FuPjx3fpHp|#7D>Z|IneG z|9O6wtx74C9N}P9tL-0y3rKO2Bz>c2qKZgBS#vlfe^&=h>}>Qjrg;_7ihU1uM7Rl^ zRWAM7Ht9{%X2+QaW|gBHLj?93p(0foyAJOd&MTUjb2wVn(z?ufP_L+nXtBZ=Gj`B~ zS7j@vxl_d)(n41qj<)W)wa_r!;b@2~#idYmuWIgav|5zGJ*#42aNBDGZdH58X{|iI z=d2tN;2!f->XZRSHOzrWdksRi{T3HILOl?c&c%Z#DrSi!kip?>AKs&^7CfTp^$^>} z^rYS66nDt|Ix)c=J?SKcD^-;`pMUaW$8|bFfrI9iM7g$_&Sj~^!`&;Vr5zZ&J_}h& zTD$?kv$VMJ<>k{IOUcE?8ro9YYnGBG|tOl~tO2vK+&HLA_ zPKC+5A;VWMnk>bvTDWq5hB+xBA)qgLQhuJ_UdgvgvsyF5Rxh-$vsx<_)?W84EY=WA z`(fkZds+z`P`e5!XrT-E2ZmelRpa`%^OM}*n}q?hMGl9CHNT1F_3Ku{T~n;lIj*h& zR5L49mrXHe-60x?x-uc*7dYxJFxs_WVBN96Tx@{}%4E6hH4DtIa)Ei)v%o6vo$$86 zRzsc{l`0mv>y);w)tK=8hb?+%xFSNk3S}PXVUe8!y{1fE@!zNvb zvX1Ks_*+_d2U&BuB9Y`S%8w_!l*34_Q{oxC^-KAB%Qie@Q&WOCULYWAiv=8s_HO2Y z7kXq>cB_9~_-U}E906O|;ot+Cg1jWB!OH-w0o=$POAQUVHFEg;n zbB;Xu(^B_jgR54E6I@1xIFbLv?L3+%#e6}AqW{0kJix|pC;*6|*>0%9eq$aW#gn}M zPWJfw@0hfl0eyLYv@d51Jn!GpA_`7k+5SEDib!l8|7Gxf?s<~G9NbyFtK|f1-u5sQ`*GH#7eMC5<;I&WJ@YH=)#}v*tSB;6!_dJvRH`gsDq^cYAchzM4WG z55|+7MYOy~+#_s10v9g+q>Dxa)R?;wdEE8o{}d>$19ggHUW#NT>Q38ZHJv4|71~3f z4ag%QLttyp0usXZj}xUv+fRn{!ahozE@H-Pr_d^%)VoPYfu_b-P5~~rnXESCW#js! zu7?0mKZDD|Y;!q0JZ6V@qSOOKlqtB+g&vFspN(uY_o;Xy%cy;t>k6*V5h1CqgkxOs z0_FROmpY&8%Up?+%U|GnG1q^h{P%JFI=`<_cQJoo=Z}jm-lyOj`=e`d&l7?fVauIn zzFzS)&HOtA%L=`CNQ7daAN@LZQ}rloYBDLO?elil*W_`(fEeYEdN{~i_$iy@Xz-|D zpa3u2yRB?-bFGh3KHGr(P!e~zAhDr{V&Y3xx}Mk~FXi7oU}ih_1(PQ}_$W-3wcX7Lj? z3r3qTT3X9g>aZ-SBdL0DciiH79$Jth0pNg{! znin_H<>e6Fp6)pgk;%;&Vm)8tA`y`0q93=Q+sgIK^FLA4HtShWmyM~gTXkF)5e{i1!=<|?<+TMWNtNuwz&^H~KqmqpV8$5LcZco&F+s@K3k(Ji;cpyhDqQuA!6lS#FAW%t;yZhhzZUXIbV3O zt1IwGoe@|x#!N&r8l;R`VLrxpGx#tg9ckn>F2hhAOD4_Omv zB3|L;4ypf5WFtA8otM7rup22D?$PJGY<;>WyRs>l`EUgNT8tHdAokn?;ymy}Q#s5E zFV8C28A^x&74Tg0%}7#Np=ojdY|O;+M7Qx8xj$c+s1K;)=5jk<$Ri>)+ysc(otmh~zr2j&RP# zL(;{toZ~RX5dC8RZ`>V^q4#tJ63EFOtm74Sgg}hdaIjejgC`L0^1C=r12G+oH^)aJ zjfb-KQ`Az@ke&3Dcz51MxF_dLM)oA@b1wOiVj*{%GBc??xS_0dH8&lre7ARZqhD8;nP1*#F zY?L+_RXVCu0@+6R?lozWZSzZcI__-K83e?;6BOD8DLB!)9Hkq7kJD}4W?)Ut3ma+P z8hTA&Y6rUj=FJ|ML3Rl;ur>#nyWS))wFlP=%pdFm^N0TVfq97s<|PKqw*t%@V2+`| z3XuTjn1Ff7>jQJlfN9MLm`;{F*`+H*JP{0aZmOPYmpJV)x+MvZmYN^vQNRyGd*j6<8i9&m{CaVswnhVtDbWhvUMccI7Txjh*h+z_- za6$}v1htuFrchyoxhyf0=!H!&M5#rMCc??~5P=(O3WVQV~ptMPC>siB)? zR8RX@msLHMQQ56KVqIE6uDeX@aiXWm69p7di)}!uwWVJEJTyy6IiGC9-abp`X!6$iwZ8Ll-+8A=4a;9A;?5PLman99o5Vbw<3uM&%cB4b1Uz395@`6N z!5@V^mQxelA}FINoXyaCL4*O(=K@(yplYf^blR4Z#%<@#yyfI7&b6F84n1$ZJJaa} z4oGMw&x6|_pfqVb`dSe z!dvzFpIkPR7twC1D1 z(+sKMn(i^VY)KT^V6zFbg(`ZiXu(n7kYUXzX}3$RD8kfZAm1m*i!;g>IhQlKlB*ld z?=J^SyfEE4SU(xUVj_#j0OC(@7{T$wHXYcok2t8d;7LHUTg1byL z#3dWXu&e>$Vd5Zkh)&hE=J(mqt=J*8O~oX$(lj8ZT34+GysXbX2Ep{kVN<6e_GQbU zBMA6%+Q3wdP2F2dH}o7ZMGEHVb!{n0F6WMUw+j7}$1#3v_HhpYn9_u`KhmI>%ZqU-X~tec!^wt6(NE1mo2Qay}gkxR0>-iFQtI%lhy%^(akmq3_|k7C&5j3wztsOpFNKl!+T>;a(_?syJXd4hB#f(izaFZCHupkk9+a z%xf4(>BR6bkh1ensM5ngtIPNkSaH!K?NtjMMAPiHXOB&s&>kA3wPy~t7ZO9AB{-rr zY@Mn$Y!gCg;0N9E+x;iNKA1s|$I^q#*p-*gLOw7~zRNIO!tTfN5>XEHVDiU3CLgf& zK|)ZOqL5|LSg*`gL&Dgm*-z}gloT=T#>dXtXz*YUdZJ#$Qy$s@}?I(am`e5 zD*9P1G$aT@&~8bIRiTa-F6rXLcuRYXwtP#{g(X&z=s~UUM2N%(5ZG`k@uuRo)4G@} z1el4*lo#xv$U(r_WR!#Bt%asEif)X4sL`b#6)ljvXBdX^MbkzFG%PK_j#CQ}z&24P zPOUDQ!iW&zeta9#f!2`3MRT#bm=A$Pfin@#@VY>_5`i7^!fh-S^q}?P!kdw?QebDd zUf}Jl*6pz^-2CX=(CR9Np+u7pIKFwm*d_)W%u8}t?k{(=o71S~$aoeq(Gny7J!=!rwQG13J6`wmD8{h`sWD9V{(=n)o zkI@+J6+LeBugbA0{pQl(t4VrAq1HjDBVraf@x*n&p{k)0ntI!1HDCdKOnLhXjUAS4 z908gzkU|r-dk!}-H?+hPA}oVBZJnFV<@=r>K z7m#YZer53OIQ_n~p11FF=QiK9*;Qq=ttw5NCRq4Yv5ta?DTT zjq+z`zt-l?h`?HW4(~xDU4>exBYcS%&=3X)9v`wQq=P!imuRUJvc)p6pPDN3l!1&G zA%O&khSX3CJCedC>_jQjWsjptz&d0x>}ui_Ek2lWQdi=fPUwnz_GR`+1(rbxg11Yl zO4rIutd`N&y`^F}37kzA?t!!MqprtVXJI*ynbxvY@>C5s$x$$_q~%@&bUJqa&b97M zk#lHWTc8!Nq?TPv4-jAz61$G&YhiOXdFdMT=0(wk3J=I=d*{o~wxou>C_U}t1zEpY>zy={W7KlKys)c!!ZGOQ<8TL)jp%KYT8JgJBScZFL6OUgn-6gD$qnKPB{O z5Q85>pwG4)R*z>S*wA*366^`K4C5)!;f^N_mLYYxh#}n^XJuhxfv2{$<1Bv%RPy)= zBSFAePA6H>xX)#HI5hCn-zem>Cz#4OYmHTa_qNetb-)SZ&|MTZA~`PNfI~i|E5vgw zQ3$`$HoCv|QW$DO7$ZA&Y1wb#?`|&b_WKhN>r9ufi`Ta7p&7@HW?A-7qe+!_=n6O5 zp(`R`sd<8Qi^oAk?918uifh3FmNH04dv!U;V&9-CyfKfPoDctegS_4ka=RboYUy`2 z-m?#KHG@Q}rPO?6BndVMAFpO;Gz(?>rbFhtH1_|Dq%50&Xkf~e2*MQz+E*ZGUx}c7 zJqXH4Zg(~d1g#l@(*Lu1ZCFg0w+kpa+x4(9L+c)rt+3&NZ60Kt zOD_HW8zejl{*~}V3vwHf2)bZaghsl&%X$5VKb%+lIsEHF2|7q%3Bm*H@sMbs*tbEI z*&I(Z1zYX`hYL8Z5cAq|Es9ZObNswBEYtPgvba)~Ig?*5E88|$3(@5ch-=Qahw*OT zyv>m^w&6R_Gf(ZXiiI)`a$OMz(YtkIV~w?SHEyj-(vacUY(z73{`AK59 z1L$S<75_cCQUtv+lJCTQuU1sh5qs=k*%VF02#<0u&g{g`I)2CBOe#$U@r+ z1p|zE+ejSn9R~D3^bDTsH0bU(xjC8YE4du0Yd^XAZiHSeLt| zea@rBUBoJ2tC?J#wXDODj??P}+F5elHYDlLb^_?o2oSz8XD)AX9YQz4WW0ruvr>piOueZkZlGwW4Jn{_2hime8L<;^J1K}*Nbs->_oYm ziE?&6dkBN!ZjMhRARwc^rd$`7AixnlVA(ix9UN7>t7obG#@Q+O8EW~vCW*GH&N#M_80^jdw{RFo}`o#*F1-7sq58GJT7aYvX zCw5L!Na)5)3t-jb)D}BFq$_wuiibD_y~)96IlUgy6$IzVT%1BtguPn~#{peoE&Fxd zuqoQh1wOln3w-ttE==b(E&%dYE-cN>T%dBYfu%l#1HKg~q@_URMn-&(Y_Rq&Q~D|{ z%B*2RaAX`Zu`}X}?e~S_(C4r;LwWzw0f{}R&PLTs9Z*Qg>V$^4Qrhn&3T+$?vV0sy zhQ6@Y#JqMr-&xWQJ9Ry(P`RNF6pJljOas3ycPZY2xm&=?-{cl>d*%*sTipn8MuP?a z{5!yxqHsuyy419&O+f3NsI)g|lM1wD2lxhQlb3o?^scjSr{B%T)!h0#gBfU@a;O(zV-;YliCPOgR*MD)aKnmrN&K2B-Vh7s=^}4$>mgTdY!OEY9QwJICc`& zO3`UYPk~C3zI{AhJ5IjE;>}tsU&&G|$tv1vJFT-Z#Q6HX-^KRU(xya0f7+Dlo7##G z8saQX6Nqpr_E0-piapc<=uJg6Nw+&FH3z@O!@A;9I-o1u;z?a$B2VawH2Z?C?;!A4 zSG-h@>xzH%kgnImoOC5?;G?=;v?+Q-*K55u3$`<@-|$a!RW0?dDwrBBFtg=OaWxlD zf7ivMAOJDi5^YM$$V8cc?RBVh~=|`Jkw4q^C+Jk;2Crw6}WgN-BM9X)5wXQgL~M*I;s!4b5t?IZs{s;v?0rYs?w*Be+o6Obf+Z_W-jwn za4@ezoErzTI1<(JI?TD%lIhhA4<(vTBOd7)Fw~&|<4l!oV~T+pVsq*Yzjhsb<#YSF z@U`n`^TIf}SLx4fMv6=6wIVM; z8i!Y~IIR{gR;7@fYmrBy3~3Xz0_)<0hb#eiM*)B( zrvpaWvsFwAJ$TiVF3?NaZ~~LA40>aAy&}C>-yk;q54s=`Ghi}zz8s=6Y)5`8aikRZ zbhGCIPZ}4{D!3aR_7F?p$q{C{J*`*-M}CCI=y_L?ib6utW!?ayN9~B+ao<34WCb`c(qR7Uj=a<})#sMd>0)lnk7w^;Y2_I)6i4 zgPk#2B%yaoZ>Hh@p@b5xO~+&?HPcIHf~Z4^3CmQ88pD$jzD_MJU>P44l_AN*Fx*PUsJlhIHhYeeS!I}F0y+|Sv`KsF4oI%f7{AyhkW zvS+9klS2y_+X4puM5Sc7Yfsri%0Bk{&)wvY^gKLRJS6&~EcsaR@CabrrSa(tFagsA zc^faSCktzTk*VIL8MKcww95o)x_=u;Vtviw? zaj|0x3ODoLOJqBPU)t2+FeF<(46n>x6v@_Uw!|uSSbqa8N;u+ViOXUkf znDYq%D9Tp9X(UaKOVP6%7W&IX@ukM7cNmnM%=>ltn!CKg;W(*kg_oeCMfj@j* z6>|M0zy08>Qg>3;n*UNGagK9aE6(PsUZnGPP&ucVhdcVF0zd_~arnFM3C8w$jP5ra z&6zNJHE_DgR4tZcYw(iLNJ~iG8))ngKXx2~Kz#@~0t3`tf=9lwF|*hot5}^vma&Md zeVnK)tfR!;Hvhu48Il!A>li9hy0>W!r(61ORhpCV`Eyo^8<$6^Y#f%{Q~cXS<3tR* z)(KDUX}t?4K%u#hGUfJ9+8%I`8Aiwh$=SJEzUL~Jf#Iyu5rM!1_+|t&vWh+zYJc06 zG3P>oboz<_&%4+r>^BtseN{E2WP8$#us78${Oe8C12f-LJ*e!>)Ke|U?Aap9Nk|CJ zGXH0dDTrFg=^)ZOJK_1yHAW@jeXj)DR}gIfToQv||E8Ba(Bz^f!OXu4=D zJg}edlnijiYcZtDP%~%{krOt$^|FQ0w)`5-@}~nIAP@8;W>0b*X`u7tf#!gxvBmLn zo?dhJ(ayq;b}QyQoYYf#X?Gu|3qP7IoY8};`%wxJILcmWx=>mKaTvJx$IzP825+^A zYAZcNA_NwEkwJ-pp9M{f0C(#bf0s|J~E5El?eY)RpAH zvUzcfV6f!$+`jtf$9cb(yFcK%hikZr#Fe%D)F0}_O&TcaF66@H)z$z%Fo%V3wQwEV zuvz}!+Sr3&HXk~}_ghoDAGAs&wvZsX)qap#aZ~goyhh^jFM_O7ZU4EYw7DLSEg4X5 zz|`S#BOW8`fWqPvHv#@?{^TE^M}8cLC{te4en{b{6#hZ;@f#rAuA|moqj$%k}tcrgDrPG zEj2*TXdiC5XwLg>`T|pbzUFSBURjRg`?K2d(=heMajq)G5pPsf4 zH{s+@`zC=$#8CV54TN}N4s&jT$uUpZDbwfJH9195bVc?xsk)ZmpIg>(S_|S9k~Ogv zW@)(t{^qLJ{V=yT35-&l+dm$okrIye91!OV;x#43%=d!}`3e59FNmiGGzZ`o08sBT z1fi%J%-d*!RY20c%tP3_>1O(Uf@o}APlie#)?FqZJsUEQ(C6o6&ggcxGVT8XrDQGt zR#!@jbn|cjb4tl7sNJK^qW}9u*l1(Y%~)292q|RGnL<`idsF?Pnb{W!oMI>ySnzgQ ztL~0a{k8SpUv{Z&Ar2A*SzQSMpQ3Q4;%ExsNmKXUkm3k>l^>{=sy+R4pjY{Udis*$ z`R0^LQ`YbsS{w6$Yi6<;0~dJPRn;_Qr=S(ObvN5Pye{;1W1)i^Z0HA!MW0rD2%G9M z>QEDO2flML4Nr%Le5!F4Rat}zqmB|?qs~UNZPL$w#)3Nye9PPgw>tPl&pPYjxpfRu zX8mb^&iaGZ6hov*8&+Zc@v3*cX0Jt3CiP;T)F~*FA9=7;9{H@tME)^;!|`N+S|zVc zy6z`kPBp!d^~XcAC5tiq+-Xxn?KS+$TYr1_j$4VGMIv*zZbc&V9u#)?-@(NK1%%!! zz)n$NtaKO8P5wNzs{0ZNy${F)y~tU2-EzMwGO`0;}GeL`?Qp#4eo zBB#b+YEI;%7J^NTY>pa^mF3V(SkmbxLaNP0905mx%7ivRE|_gn0ga6LM1uLHP*c~L zE!IPDJFAVA%SN&1?Ebe12D>bP%04Gb|{rf0J9H_%8plB2n=ySP%CfRsUJHY9R3J9pZ>>F`k{eV-1BWbZ&5d1by;pDB%aSj&`VDdjC$8cnRyzL|qsBrdoe{^XhwUs*$0UR0d!+6H60NbHbhk_FMT}5ILyT=PwbzV%_DAkrswASDWaafq zV$|LFR6wgfid{h+TO=!-yQ3_wAF z2g5~%q;+znTY{u@vOR~R^-7PVq<%_|#3#vodL-_Y9?2FD@M~fmS22K;LkyWP!vno% zrAE?0DWtP~`nA|fGw`Re2E}lP-EcJq)=0}^lL^}dQ)>u^X}bR~2yc_&?38pRM3O@| zfS`@KCla4|?XnAL=YMb=iCT$DPe*~|L7k@AcBYn~udPBt%;_461 z08>Lu^@&h5I450xav4(4hvT#tDhy(+&>&c{M1;ekCb=p&%_Ps6;aBMe7WKD(ECMrG zl97lnh=~*6f77?q071FBwmo61>+ZD3VmR7jXK(@+pAW~!6N3T#kh_P6Vp?c??89iP z?Qg()bB*rLbmMK)B)?|1Y5LVTOay{MxOm)_Ut1@%RMVKVY~iG>FpU$?f>_IGlbjl^ zne4Cd-E^rfa)F@V3Vz%lB)pB4iTWcXkC?i@S8~h3u;YpK&&xtK`i`#+{`tya5we^b@;}$LHv6!6E@)7&i zx)yK7q%|{bINQ+qw`VXkdD2gxHeaEa{NTSi9^{u(jP+?>!UKSJ#7SyxS2vEvMW%A4 z-kfh?Sxy%AGMd0&VPJS==EA*#lPi3o(N|x+ER=%BBBvER z8cAvizYZwarbya}MsShjpr!2;zod9mC)t(0Q>i5j zU{35Kiy|X9OMTop6D}P3YBa|cCdIq=%*=@8nsgblimA(&P-|{ckJ`N{z-?LG9JHI) z*j#p$d0!Hq(7s~kIx84cKM4+?EWYgB0 zfXii*u~W1qi>1ulIele0RgS!}9qyN_#|`w~8s%54(HP#aZ$yNyArnZ&JPfJo&1>hr z2iYvx{Fy`x`u4+0mucu#WMXtUwB02>^00SP{Xsg`VvhztROJ6nNDfPVctcO(f~S?Z zAW^DTkMzRc0_mqK4%uJz$bZIX5-7T@(pSSFy%0l6*-wNH>-8I*j^C+$oYtMmV6Mkp zqTrGEc+z>h>FFBOvx)8OUe6@63)nG#dvlWq2ZJMRp*w;~qqez{_k-eBsh-2f;@m}n zkpXXxAV~^T^vQo9vC-gj;kjURXqnT_BTV#i7Vj-K8aZ0ZCJ$lf_Arx%21)Cm?dCR0 zsHn#Uo=ejAi{QzC7Q;mjH zG2ku?S^zKxZ8g%^AQscN+H_pM6B|EXt7duP(;KM_^O^2xblRZVO4aa#VZnr0u>6kYwha(IFFK1u#sz4&?SlkvMmoS|k;M zF(YsY@YfAA63nzKKe26PON#6zDd=GvoOhVT*Y=+^zcD zZ3X6%O4mBCy5vIzp;=~KsFBwkJ@Fz4YLw7WVim&(mQnD#Ux?Z2==KBIf>^9?fr;sw zVSrXWtvNZV9F`uw@|hJ&e7Eq;rGjwcl1P?pwF(b7F*{(@FVM2;Y2-c-;SoeM?XKHxe-$fHp9H28cmHxe1yaMn1U z%N&2dsXepB4Rd z>PDG%^I%0a3oZMTw3h!=r99#g+p)#b;E_sam9*?AicP&9(or-v;K?dS1vf&cM>7%} zqfU>0)=#_80iU(0w`_^Og3QfFRZi0skd9mFPl7C?!SSAwPvZb1c*mCnWID=|>8N6* zNT^(YC!(3uHN_g{`|w7o`IVgxrCb8!J1mDg#OC|a>Zz||uCGA%zphbPe&yKbSGI%> znR0<>oOz3Vfyx(@WjU8_mga{$3-dMiDj!#e9(_*?IJiDt2*4NOnR~}Q*fkAH?#OBQ zq_bZ7Z6@BrGUiI;u$aj$%fI|#c!G=*9rK$F)Yu8`%hEwPi{MC?i6eTULYe{$=#|#7+cYGXaI1A5rgmbB{)Pu2&#U;V{p zGJv&y04C5Fz)CsTwFRPBk7c&8&Yt^5Y=ojFp4Qwd1A*fGnMWd|P6MF$2EIxvXPfn|QDgH<9(qI7klI!f32 zUf2V&URL^E01-KKkg;qjOW7h3O{7^W!=x%brz@3gh*Yx547mpiR>jc67Xv3Bscd#d zm<_WKI!L-WEIMm3O_uXd?lceI4B>cGhq@3;#(DI}PS5*1oq%yP_!ZAqpAhju9pe6$ zGFl@x#S|~QDW)i@D5fxH`|d^7kU56BRZkbNuY;brrKE^0vnWDJqvDu#?>F=DYd9Mr;)DF`FN3#6|(LGcQxZC@x|YS2GHBjIKT0ZN_c( zyJm{wVD*T2;utx@96;5f+xVZq>H2w?t_+xa9)w|5s1;7ZOO{9~2QHA1yw zRK$qXN!+j`Q_6r`C)o`9O2j*Z&(6?KUjJCk>y$kK|H>yP?a7NhPfpkqFt9B1qCIh* z1=r5=_5>U(%aC1!_Fv_RM@St$Gg+EV#n+>q@)4Bm*c&&VJH66B}z2A zVm!N`7`|!i?LFz5)>hdLYm5$MQTQdc+$v8gDein;EKTj0BgzXzke)CrGwlG!dd|%d zftH=J;J?RI5F~hEhKQjS{J^XfsCJG2<_(HScZj{z&5-5{&EvdG)Bd)ld~t&_Jx{Kx zY&%Y=clf3Yx7;i!$O1Cx<(_Uf>Kjy^@Lr?o>u7q1eYD7V0yVMOO z%p%&iU|7UqGpkLTJj)^mlo7lQREzWJ2P}5J=ch6P@^glZwNJh&@ZI>fiA%yzP%@%) zy*wnT33d~p5TIk7xuiL4Sjo@R_{!kvB-KuAk*pN{Z|$tw8kpWevWlnJz(=b{S8_TKKDi#I7)a)LM~Hjq2z^vP%mxhH{f4vinFvX^L7ynV7CTl z%Uh$IyZ2d#SJL5I)3`y_qLl{2#ikrx1qgQ}y4DcnG zgHTMzJLXLIGj;QSF?CZ}nL0~n9t9GqIhB?3^rly%1)E-ts)}B1Nka}+Y)dUYOA$GM zD1y#Dm@bnvD7+%eN*hEdU;y)-fFWn_o>&KTL~XMX*v08_uzy<)b|rb3XOBlX2G)-Y z#{m0k77ayl0s0GDJgOs%D{R&ttQ+6#X197Ps7a{>>Kv3pekeOG778l|lhyvpSuqM- z0}qo)BJ-w#jQ^B@(pP-&w=rw#-1oW`M1mx0qvFQKVfRtJBfT&3qR8chkG zI!#?pvu`06zLz(k#A=_ukqv<^vD2JsK+h)4A>VJI2`V`?@Nt_o78yfeaFI=a#tw|& zsV}_r;kz&+W!P=nKyWB;qrtFTm6+Dh6yqQ%fO&Sb5hOPfL&oOT3&|_KHRrsUJ%yxb z`t2a`_ZTlmZyS!T=l<)F)&i_djP=6K$wv5p&G;{ZAL8k2?AvpvCO!zpGC=3$woVqcW`-3(f!CHNCl3&AwQ`lq6mISeSPjN%& zSp)_bhwNKr`+uwU+qAD_Li4r{Hq8eg<2Jx&4l{t?ri;q!tymJ@Q*>ZgbdB}Y_0rz5o z;C&iLnMOy#$?Ur02zRsM-2@0b#(%=$lKbQ?eJw4)6xZ&2dw3M$c-A~Y&NtuGLT1)d zVyEw|iMmo$e{W4Ba#(+FO)NM4>@2t<9MKBn+=2+_DpL))FK1{|%CBgQ!G(k9u#BL^ zUyJnMDuEA0jGK|ZG#x)ozBI!((O6D?a8HUybQ$ zIzsM2o_4YoC?4=G=Q!zMB1I1cT@VgKRcOHzk8#n0rH1%5>wK{=%hu7H9dUER^&F#U z%;=wCj;b*Syv{mZdmC!;wZ8R;;C)ytCFy$BP&8zOPD7XYMr>3)jlj~qTTN5)bYE09 zf&^$b0va(lb6Gi!ajPv<9{LgE4+_9e8OJ4Nal~}FF}pNf*g(p+#%W_6??&z2B|zX( zl!&ET`uaGak|Wa&8>bs69%n1kQ8`tT@ob%uE#>qzG3ii-8R-h>ei6H?sELm4i2bZ( zE>fcH!z|8+vRt)#+KDbYp;)|@G75Ls%}p^vg}ft@lRbK@rC1L4o%mVPhI|~ z8Uki1gKV1Brf=^t_d;c_n=w__=ZN~#Iz}Kcb{e4sO_7ffFe;RLvEPm(=58JN6jEME>wPN(;80 z__ngQTHbDKs^hG8x(Ksa*GrYRn`=s{JzXy$m!qyEg#Ci9>j=Enb(Bz1UCFn1NY@ou zT)M)7AJvuc?MHOQiT*HGosK!6-!A9ma*YR*NJ=iCV((RUHw@l8@VFG4D3l3vjv$IW2eE8bdjk`RpQ(oR;?t zT-h{^2a){>pPcL}@P3mOw*+QywObOHT|5q}Dv;w!8&Rn3J(@h<#?CH~!KqML8JwnKx^I|Zv&eh?T2Zcp$4mt~IG6Fk7>lW7QvotvH~ z2kZ$R;Ihm?dx8hJ7$HIizwhSQ(3X4Uqqfh~T+1^SS*iRiE$P)hEh(Oe$MyUopO*9r zP+7m(jj^<(kcOot#fG=EqvTRn+EJyxe?`~r_?C6OZgXs;Ft#~15`Ywp1R#Zjdhbag zy}-v7i%nRDI93fdQD%sXl#-tPDxK97Dgt#E1fpXRoQLTN0_oC&%MfQ(+n2*Gtztne zqRJ-iFp{3*Ba8zQi}FJiLg-1V`MMe3el`q4Wqcb3sX!$Xlib?j=!~e1)Fi-P_eIV% zg5h`qQd8_gH(m zzKUgZBh!aFQbyDVhh%jkLI2cs$^$%P1HJ~==^9<4^D^cGULak7M}OWEd%`1Tz{As_ zv;0Mu7HfW5VdrpP7kMJ!n_+5QyVw)ObJTq7$xAL+P!Sm{{EJ~n-}jk0k}^UAfdlal zzys~@GM)dv9G4b4xSWZ+5KYL4&0prah%2PR*$(*~^Cx+v!1J$jT}=Zfy^3yP*|773 zix=f~?JmT(;iPAnyrDw+}SG&SyvyeW01mdXENMgat0>>#D4uF%cCG*=^~K z_`(U`;=tu;46=T{A*Lsn0m**Glr_eJEah*<$fiV(0!{4d)>8yykzJjBM=<@uXP{%k zRYarZtQyJiIav%PPJg?1;R>9>7N~{`w21v0aaxgiL0hbP(RPPZ9MrVd*(l5xHTYmw zm61a;F0!m25DpoE$dgsHmzI7aMSk^r0?G>du?l_^+N~{uzFy($FM`@hPe(7?AsJ3e zMfij57#jW47_;y1r5~oqhmylMfPgfxzZdmX3+kzhddMso+3=q)R4f11!E4Mx_F^OM0? zx*Ol^)?&wQ=7K|1c=nYs2b;#8IIp@J;`Ww#o?l|eM;$W*`L5 z4W?D;5|03@gaE<<^bb>?{n9b|^so;+i%e>J(%5J@z!fv}k`@~4>P4;&eD-YwEp&n8 z*zX3Fwd%jXo4|wU?0C}>op#)Jebm~QCB70xhIC;(Uu$dT#X@V1uM{{OES7@C_@F@qB?} zn(~P&>X9HrX_KfFk`!Wr=t^sc zbnRe4=!#LT9f-6a3qsd)b9_M8p{>DwT|tj&T^Fl+uIPCDjkd4sFd!ta!sZOSyxPL5 z*aYxJISb0>;RZ}QBft}XYUteABB4Hq+bo!=0+`!w+F;7dm{kRAOhG7794@8Nc&pH(MZ54m_@ zBw5kC*9R2(%{Hp(0}InZG)=gXmB~=haoNi;n?Ksq3}UHO8hR_Y&+OInPycJ^uZA9gtAc0+)K>pmYaGvd zjqsHuu~-L&SSREdivu-RO{cY~&Y-tYB6@X*LlN5#Q*f^^5yoCLx=~-2WOu+*2JC*7$IT!M=;7SDPs)X&zQF^F#BhN##ixkfmy;4j zlj4^4kv%VY5%HoI5ifWVfsz1Ua&Zfece$vG0$jFr226`_8-V~*wqd|?=j2up6kj+7 zY_Bh6W-`{HhD3|lJ&l#tm$yYr_Ud@K8(j})Es(e5s|Sn$IzDrt%M=nQPC+xE42=v29lruZ}TndrTYCvm3{y&f^DrJT2DeIWci72_q*? z)elK$?FxhMgW5E-Pbfo@_ZMv3e8K8+kC+5GOS!!pGQ}-=w{1QxhJzP897-|n(sbrr z)0=ZGJroBAJz*uWH|Q*dtG$Ec>4ZCmr01PD$hdXzz1@iscMLC-jUmgT?oI(O!da~Y z_;tFvuGMEp6!bn52e&V=qwM!IcC%x3q7!dO%8J+G;jLM(MR0H&+m~UK zEeA0(tDH%j7#e%-9eeK0S3yLGj(_|9HrhvVrPMI1l64cu@J3iS$ZQJU;zFx7B0G?D!@6r148T z@ZcJd{FzVg8023^?jXEOG=N9$L!GQ%fgmP#Kt4NpQZP<{;)dnN!`Ts&eq9;kWC_LW zl{3ba+Mpn@9gf7V2gZN~UBp~0y-jyq6wAaL1o}rH3(fjZcL&Fb%7DG+VfU)OG!T%>IWZ8*J+D9=XQFs3 zbfYbdb}Fnb>K{`(MD0GIYyVa{)zxG@yPvw1Q2(O*HQEDiBi1AQ(w^5evi@>8jMb#1 zC*!;2E+JXJrB2g+QP$BMo^d9eGkx50INQgT=-=rI4ASILfAlk8>+_(Lx^av>Q@Tv|F?+dx98*~zXEK)?w8QvMqasXn+0CUah9No@i54V12+NBNIKcW|@&W@9K5*e_FF{kduX+vW+yJS$_0mQ#M zW$oH0y%)nc!+~Tc(IUvx)1GVpJDM8pGgX^1Q=PwkPK?`583)j=489{KLrd%=6mjv{ zX4=s5Yz@qJ!1A35Qzc@{|M3%ucI_QuvRnElC_B(d+2!aq!4AWfL0=k(us3jF-Pd!$ zmodx*S4GMNI$p&Evt=0<{1`)A=(@>;p6gs-p-N^48o{X9qf_{v_Uqi}b+YK(b|>G< z<|LWjHu(HsN_nLZw-I=t50tF(S@ppR%T1ZT@{9U90%?B~ny{XNvE|WM_DakIQsQbB z93z-$9|*Z_P@1tBHx!OD60Q4x*?a$J%gVFPbN@K!{=T=)EiO<6Bsu3u^p>GQp(Rxz%<9^ekibfu zphNdyFJ>*A#UHVXKLX9l;2Ju)(IP2Yv?~co3dOb(Q7RosDvA?STvLg}L7Q~QNR)KY zAW{J#p9WBVw+i+@ONQQ$@W3i|H zr?`i#de#1gG9wA1n!qH)DG1Jnx^JM5^$aD_OPy*FWlma~zTh~E(WqSyvp-QyzX@AE z=Uy5Jq!5H>4Mb-7{sCnK60%s|cMIOI4H~Q6?rRK4E>R#|YZOy#n7TI~+Lx6}j z(kDS1A#qw5cXWhDjE?)L5#|UnGQH<##U7>fwP_x>__Q}@%vhr#g4?7Ty(D8p3dddT zMM?{LoK7XG&@C5ep*r?45yvuj5Xb9H5_|SvTg@9N|e`3wEm&E+TSRKxuXvqe__*Y#X`O3Ae#bd8A=YNnj6 z7rcQ|f0Vu9MlLLaZzP96a5OGaMxg{0$U;35oD582bvFVghG?;Kk6cBA{kfJ!;SbqO zg+InZZb2ZB_R2sYr((W}$QAG{&8@3r-6*W8CtQyAMam-Av3->Cyb8{0txrdlWtQ7W zVa$k>Ta6NA>1LSlBioy7fr@redNWm&`h_dc*$PXNo`MMUZi|dZBs8Y(L8mR1_*C&N zU^EH9n6xB)(sFaFjnsN>Ycss8m9rRf^_Cj)#be7+f?u$3vY{+htLh9ruaf-%PZkM= ziwavAjHRjy43lA~?9)~p&U|6^O5S`=v#zka^8)cblHf`S+n${dIl4TkQjf;e99U2Z^Pg?Z%5I9uxwFCHzJ z!pt|*;06hdYuu2mPZ+^WnY&%pNV&3l!U&>f6PdEA63=V!Vu$g9s);vHqyu5zHD1iA z3mf7E6(zh_uJJ;UGeTS-gun=3q-e5hC!}E7g+asVItHc2j^L#}X|;J3=_98CL1dEB zLTJL4udd7ioC?8O8Vs2L7kZcq@wTl+mPOFD#u>#%*0tic$SaOd1#O`6b15!km91Uc zlb3eurRi4=nVGH!-Xi2ng_;{$yc#El=_`vi{HWaO^mkSx8j3+oV#tn zRH*nP##7}t&NAgJjJ-V6bWJ9=l+ZIO5VR!hTFIv&45y_&KeUN9+B+eLbPOfqw%>b% zSr9I&fcvvRo*{WkQQS()GT5b~qtgn3mc-#|2$n zM^Bj+*vKxVoE9xijA%jGl-JV2{90OAXlQ{I(K@sMcAl6PuzIti5R-FcuSF*KzYzm> zu&)(dNFFWXs(~Bf(6Eq(vn^=|YHm~w7@CAC!Mm&Tc-N=gHaW9n7_V=Ube!cGBrSP; zvI4wr>znr;&w783!c(`^JUDS%VjdWO5$pf!sjYUN`=wJ~?L7S5#mnDWN)J2Kgj3$Z z!W`C!&})TL66$HQ#YlS)-rAiL#OecFc=X6oF7EDKofD|!-j3EP$i0y&n@P;KU z%NTZ6N2Wq_>PXttCf7xoV!UoQwK#Jj)-7slPI|UEX-_dL z5l1;yDM+w?wz+9fAwIJqdga&9SOnQ057W@i9)s5eKnsR7ggL{6Id@o$dVYy0%3kcv zRqnvL^xGO9+JogS_yas3QF;bCBmw#Tq$(CqW~F-ISZ z37F|Wk}FZUs;t=-3u=By!sb$reeM|oK` zJK%-Ls5KvJXaxS!L1~WM9usB6?Y-RMmsNjZT1N%^MQs~FZu6n~ny5EB)$e8hVb z8p82F!~1i!b6u#2*LsT>zV(WA>O;KQJGF~b+4(J3PCCN_y8s(uC}fw8@{r-Z0egwt zzF{x}1jyz!cv-QhTt&l)R-32|79uPmXDoM1ilMDpH7+$1=~NGScj{w3t~6mfs`Q6K z7(<^)DW)`JS$YSflQGwYE_We}{oAuT3$wlzJXt)Us@DLNHET5h_2m*@t`o&ycW}>s z?gECdH=eKv1hw`I=Ym6a7?^>jwVv3voQcvZSnr`2(dG?V}M427m@M;3;(p%8~uCCh2*=c zyG=RGf@5m?G1p84^V(;&gE^lT+u+39xrTW#)l zdcNmin=1NjuIW9ushKV-=ckd$Maa^Jt&TW#3PW%Qd=Fq9UH5`!9WgRf%QNoWCfx+e&(jbu%YQ+aZyKa>EK4`$EQt^T7bD zo)l7VE1%2wKCPWJtKcm|us-(gn@OuDdQR3QNU36bKQ1CDKEG)w0}meT zD>&+$FFHSXF0TFVP1qW6f3K|cuc*qK2;3m=6{A5Hh@;6i@kyLjMnxzOPIQY@=dDx| zP@XJJ+$`?%t#Wxp0;-8~DXa7R|y@d7+qdouP&ytA})exDpgX-;pJ=Rvi{& zJ-}zeN>E@13&Psf<>rCH_7{iK^7)u0Bo)xk)-pL>Wp{B;~Sh33HHF61IfUlG*C0rNv+aYR+bg&}1=V)XhN`O>;W` zY?1Y67+rx9Ap;@|KEGdAzCETZI`O@_(reBn!dMs5Z#FEG;IsJ^m>MHWY(_1rA6ER0 zFlyK;v?GzMhp!n9b}UVU)L-2wr2)QxzyOd(oQ?@>A5b<_R*?=3Fb=Io`Z}Tvw8z6` zAJDuoh6;}7D(sJH)|0mK+Swgjc|%**NPs=6Gxo~XOqx$K-JWKq+e-{jw>pM3Xslx| z+${nqa*H=9AFIzBW3dALLq2R3RA)|ZK0)?~`4lbIi`Mm{Aynxn7~v=`LAaRW5}3|$r#x~MWV2H(+?n8M(hu|(8@{`!IV!}wP(_YlZ)jwM zxty5q5xPT&PeT7=DFwv6X=aW}hD-~*5dUV@)-$m(PEa0Mji}>+V9=Uvn?@3ohN1}O z)8d71m~qcMGwvV>W_(gRBN8^r?Y>!a-^Du#HDz2n z40Rq14P5LJ;}D9_s7DdmQ1{3qU#Cai^?Ec(k0zTQP1Ze{RF5V%=#hDmWhfRy%TV}& zWhZ!nzK~V#dmomFe$Yto)#`4XPbb#GQBl}M;|@may&rb>ndRAYX>OE>@yYuWj%(~< ztD+YUDSBb{Jw;gS8V}s6-~^fgAia;2U<-}_pHhS*;M`XUhD^dqed0685`;B^LLIg{ zckzsq7m!G<&;8uK-cM_vF7tv+ z!$YTn=!UI=@wp1Vi>j9SGOx}DeoMZ)fV=a3CzxI^s#KANc{rWA5GMZNQ#u_Hq!hkM z-U?Y5*RVMfQQWAOAE$UO;=c(5C7@yw4*DKj2aI2mkSl-+M(>p#1}BG2x;@@Ut`pHe0Tj!Vj%MEzoC3ChojF4ort2 z`8*VUrgV-9xzs^4BgEC9p!Qnfcj^n3T&?h@VciU`bLZ)enhstW)FS~S+LcAL7~}{z z#*;*@yes}TkDAT5=JYZ>-J(DvSUEva7Q~Vayj4~DV)mK*q{PkFb3g?L=~eSmNzBEU zf{TxWRTSSt-LM-A9K{L+AG9bTG^jdukBFO^#8I!Y7{LacLWE!>mMugZF=rA95haAQ zYKatgV>f-EH#Hro1f;^6G5X|hf1>h#njlZNm&eNh=?SRMVn7z9pPpL0S(oRKS+>#C-Z}dly0m-Uh zv%mSc5NH_`BF7->9RxKCCv6Kv5B;x?-1+?uw5yh`r&S`eq$Gv7iLHZ;U`l;rIfzY} z=m4to-l%ScshRwo(M`Ho)CNE$;7M2|`mY~j@X3Ki^JY0tO-DCokc^-p+K^pe4m=4r zqO{N@&eo=bip7(0r309v3h_m#h(F5&62NWPAFr3g+Kt-j{UYWAKpio{#{KhJxPN}4 zKo$3FLSwR0I(J+eW-MdQ~$Lo7f)7Zx1&#DB+ve=02a)>*}T ziV2huLF01}C|Lh2v{+${S)9l=VyVq@ygcN7wGd#xQn8P8Y0pr`Gj(5YMlP=ukdLpcdHEWs+D`l2UiIAeb358Q za-iD(=a4R&h$y8s`(tznNbwmBdcxh*~+W{_5Aj67AncCC1i7b^={dR`2lX(G#_YfDeRP z^#|}qKG3?=`+qr_r~0O9Dtd23v1(b8qFG*#8qM2{%1@Dx8bPYobwWX-IyE2-{E%&X zZ$#Pyy*t#9J`afDuQF(KoI0+j`th#ur^^K}ozpX5N;QV5L(H2J?TYL@osguDkxt>^ zihjhY?S?ceH_z^pZ;|U^S$nwNkq<;56IC{=$wNU7GcP^w8=-_dWD5X|aI^Dt;7~Z3 zNaFlZVHmdx0FlY4Q)T^Pn9on0BdsMN3j(gjE5iL$i#!@3cPUIbJkGhU(acr7Vcz(u zrw*a53(MlH{Z3S%5L$*UCn^IwDWq&LEloG0H;PIb)tR+pSdbODweOY_R4Q5vEiRj9 zfC29|7BCB{h;ay+G7Jz(Y~NHPjf{$C+vr6tHOdA~3%%CR41sH4GtRbXQvj>6IdHtL z!)R{=&#-68yvs;yoW$Tb;CiNJPZ|5J|HNjbJ_)NCW#JUE#Uxs9>L)D1D# z{M5}PDA<8p*E3eV3`L6W8b@Hw_(qr;Sj(bHI3hIF_@)ENri8$_%?vYG&h^wTfpc;3 zR_;i4aub(3Zr6jiaYx!e2X%9MJGW_v0xatev8+;|D2aVhjqc5bo=_<%VTb{4mt{J` z+LiCydxV8sPij>uv$*$9_Twj2-@?;7?o!h?bH{_@qCP4jsHCiTj8CE5%lFul{r+gW z9^uLp@^r8dPR|ZBedPzhBS(uKBMrl;o>hv4vR4(qfCqFFM2`82+@a zxJCUe&`Ehn{qc>yIL737E@GHR^^+6SY^gGPzuQjCvicCcvTn*?II+TVi3%>{mTGvr zJ!4tHhB^X>w}~4OULnMU7nrQ*cuh2~QHx-g`4;@p*l2CZQj73HkdN&%a9DND+2jXjYvQ>vY zS7{DR!>md;79QT93e~<_GOG3`UrP!Z9(|0)F^@TqMcD^i-FNpnlB7(?x2rvrsxkr# zs4mA9(J#mp8$Mr~0nGK7!|UXFu+G#k#9A4av?xY{$H8-l$6-dl@i;L1%ZwR%&5`ZO z=sknH>jD5`^454B`1XFwL-QcxxI7O$HXg|Fz&)s9F+38TEQ07rWb$;3o;QCoa0LY+ zoWqNdgN(sRl>{eh$BRIXM{=Q=oUZ(!_pYAaTQbx84eB2u1IS@yfC|ANPc(F#nfX+l zW?0c;%O@afD{t`$cz$h(pNVG}x<@_%PkAQnk<~MN0;D%$t7EYJ>d9R8uHVeVK0{=F z7u_50VQf~Q+!XZUg0-Jhu;1^k*uJAoL$@isndUQlq()y<`ub(hciT_rqA?I9UgQ-AaxmzUu(q#;vle?XjEg+s^8sLT|o0%^AW3r7FAStIUo7Za<{Ena=(Idr{fwg4Xp^e{e@ybsREvLn zDCLGx0#8n?<0RFIYVsy2g_kLcpt_^n=h=ON?GiKm{t8zy`a5|pu-(gVHTOxb^GE^^ zQn8qXTup(?3gObsBd-CK9tx59Wwd3JlI9(h*1W4WA@Q_PZF_cDTW{U5f#NSmsH}*J zr-X&T=Si*!^%1$%-F8`FjM}8L`&cVL+r2opwI+inO*q@BfqoH(Lyv@Ux?=}77k8K_ zV>;~DXvK~sC#*w|R4oq!%Sf>a>nK+woLm1|Nfqgl!<{MH+xfS{#e4dT zd#C<2>5RzCO(xz+oI1vlqXpU--)`C0`yXYZQ@jdgNN}WQy4$=lfEvv6G}g>C;ZUb~ z7XxO~%7@Gx;B`0w0+G2SycmP`n(Bgo8Y4T^$M2%HUhl)yHipiQ$4Y!z^R06;q(~eT z!37`J!2ppdw!gXOv~u*OChNlI21Fj6{$l-_nI+vP1VlzD=`x9H_9t*}h*fe-0vU7? zTFwX&iB%QRA(2I0YJEF>>D}qkKVD#VI>pg{OQ<4q)m(peIgom;qDQ22-j{wOTQ13- zqy-K5iIi!oHKlKfnBCTsE43~~`g__Zdq3n&lj*0i;D;l6cT@x%Fjj!Nz5gjBgP_`} zen!(fwRS=p{sIi=o368IVQtrssp~MFd&7XN(Kt^OkCZ1WO&=hwKJXzmW~3C$5SnuB zInnSTyMwFajH#Y2=u~uH&lbs$rZiiA%n9V0Ep(f913#|@L^bE{>p3(VlycDgqZ?QI z@Y-rsDFXJW6HgUN!_xFAEMgcLX|1ZqhE0>@6O+`&;f_xe#u53)hiwuD*lgS=O$ zEgNPO|JNh@aRv6jApd2Rp@ccj5;^>O>Va$m-bfLH*JdviAH_I@F8{A$Xdctabmj;2eHli3ZvNf3x@+?gz#U9JW z){duQ_a~`(@FbgCX__+%A3n)qm>xZSmxesX$pkFlsyVnmO~G!AAv{|e@?~3<&k@vm zF1rU;V7(9HeMozP)TG8&EM=o!jkE?@3r-|kGZO#-dCf;H;Ecocego%isk0)ECtZfG zT4lyG>PrPqrcT&NrU^E*K>@Z=z?dAnCSwN+{bogGT;X@n>kjqFF6>(LQ0hEYx=cA1 zGoHFk)vKbINFXG;i2&jSR8bu-wQBnPCN~Um3>Z)7&xF?+!;UT%#wbF-lwT}2SoT@x zmWsv`6qdA5!oqF8qYZMJfS6p>^l7MS|eZv zJKshS6syht7|bStnV>9zw^51Sni7PEgbB6l=z-b4ov4H2R>B<&R2kB#0m92q6rVl& z0qnPKJ5J=57n{W%{nN^3&uN0!<%J1D#dW0?J}oKNk<3=jFeGeF%f;&*N9&%HN<0>r;=&n`tUi6Pkw z!QV&)i^ipj2izdDINSU2%k=~0ZK57ukXvtONk*Uk5`^z#ZS#K5{ zoi6G!jV1}XnNEnof2z?agWo3ydxwGr3YS8DA|t46uzK5_>7wL#@?3@m+BE& z;(Weo0UZw!ErIf)v9;X-wf0BYiV!@_d4MsUDo1q@twh@r(VThpL-dmkc<*T_1TPKq zMd^k4KHsgG@3WB_??p4;+a%2A%zT4`K<=j~U8GPZok>hrAWACF?|+cWmuf~L-|7h& zK^*R|9=oJoshX=0W<#-Gi(oB7Qg{AL-Pu}q=XCj+D?H&iPQdoH!fe!t4aZRHU^KZ7 zMyd}}=#i&5T_b!nWKKgNQeRjjowN=ieg71RwWW4o{08&CGFxN*OQm*vP=Z-2puk=0 z?3SS~jsmc_>@EK7aDsErh+pYX>@BXc>32*I`MZO({ZFfh{6w>sxEvmgSL!8U?QKP* zwOqN1CL)pGi+Q$Es9He+W*^BZk}5zCdTsqz8K|3Zuh*pQ#`(H)k%5^D17B< zsB$As$I_x+Vv?Mw?BLS#7G+v}R65mU;sHt$W3xo0Rvj~tz`bnqNd}T1X$&M+DF`Vc zgG9d&k!Kikcv_c|rAWiH;(oVAy57oEb zxoIx&(p4SFHl+3GAZVLj!;Z!2F>Uia~-)>HC_nv$9=Qz=n{vU#2EoH!UWQ0yBo z>0~<~^gA=z&6tc&e`kPUF2@6NmeB9TO!j!yYw;+|7N~pLq`Bp7n=UythQ^nsQ zx@*SdsrVC31tFJs7$A<;njAb9KR7+OSqBOfey`vr;s}{}+8oPz{)+)w2+dO)kEXxT zmBPlF*jy~DWCu2L8@I8-=DhD?%{t%VUT7s6$H;K*rPAt$T8(s`Gk@kS%?Zo7oB6KF|prTUI@RzC{f<_`_Mp0-{ zuOl3=)TXd4g_X2w;pcufpQ{(V=+;3l*kvfKQl!xnmMw>LA_?Zc>c8?k2`3jC^~trR zkQpL&*VZ-)nc=mfxWKE)FbfFbI=!E_V?4-~kR*0qe5mlAmwFLq;oOpLeh{y{-3aS&G%KMmlaRUra&GcYo24+A`C*W28!7sU0M1u)?bBsiA9)t+t7sUQug@ zr&rWye0oJ~dO5wK-vM(P%FMX0R`f1?vSnBZliH^yBb9>;YMr)w*8argo)w|V%%bv& zE0>cyxo07{a3pr@n9i$@2#4Bs1rgb`jkbC6)!I>8*ZMKlYVV zi%hKW2X~_*_u(g029G%;Q+I*uZak$O{DE)-T)$IsT!QY18sy>;a~c67_G{z>zr;=0 zmqHYf7)Bj62s(8vemd1NEq6RS%af0su5ByW4=dFYlQpWPtY;mu=~YFV569UwMeGW5 zl~E*kR0l1TI_h!bCTEPQ4)MJ8fJq~!QBMf=f9v}twSEbmc zUUXn^hD58>-~90xJ~pAiTz@bEjZ2y}>V;V2>XIqI)vtp!#*##$SG#NFvSQb2$#NoQ zl7s>h&t>mFIIgLF_*FeD^bo?VAO5)>PU;~fS3mqKJ)Gkqk3by>0o&YHO~5*Hc4a+h zt_|tO5e5pXqngGEdGhF7+Z`vOa~Kdcsi0FhA&n|?LX~mC6$U`K06&EQbQBJYMetii zlY?b~eHD-=K_`Hb!zko+S0`KY_5=~JBYB%}ThaH(TjLS}?+vQ4e@gOps+PCYYb7Kb zw11gMj%}Hvq!qzmeVpGdc{}|g<*oH~l#C>6xg*-+E^q)S0x5?_6M-?&j@g({fLupY z(CfGT(J=)~zD_=%h*RKvQfFP&XC7%&kSBn6?0N#wpAr9ZzO1xZ@#2zm@={ zLYNC0REnN&6rMBze8?VZ=Sk9Xo!Y-PLJzO*IajIE$@VAo&YFqqIrtn7e<`7IO@!c;l!{b z>49BuHHi5X6R|34jtO-Rkh@r7l(I?xv|R@vif>E43wqkM#o&dm^r$UxjOUFAZLqv< z^@#cEl_A+l0DnpLW@uKeDKSxeWno)=T+RdRFv5TSC@M((MB{CLm4a&dK)W0wG$?&Y zwMr^MAu8UUy;<>o{MgMAVj3aqDQ#z!{c_9o%2%jGr;h~o0KJnc4Nx)UdZ^71LfX)a zc#_qdAsVRGh%va-z8GT+YmLopsi~szYOt)q-6YDaW!!VV!5@yr+zUr=VCNuHh1e1B3L072k zFUVx{dcZ7HcwedY^4OBm%2s7i7|w=(p`4-d14Kg+8j6@Rz0na$%>$9iC+Ukq%IoPCGjy z-g{1aI%U(ywR1r>4V!7a6H<4>7Y?$IO@&&yXeHrIyGUA+kkj#E%%&l)RBOw|b%GBw z!8y0=*>xF#-$g=8CEW~rWcdo+p1E-jx(1eDMn(yebrx+x2l$EDzvIL2K0tTE^`MLfihvn>50f@TDzm zZ8sVpYPPnM-C^CW?HmfF0Z(bllmo)E#)G-EwVl~qZ)>~cq&9-7$m*@_EA^hk{Ev?BY@ZT)l4HZ1jmMyXKCtk9h?N56b+Bl{@#@YSK>w&haP!tZ3L0df(+VU%*ZCzb3OXFW>E!IwkHnpN%%ya#j z#FM<$duG*EZ|(2ZR`18sre5t$Rul>Lg0y3`;P45Tb_1(xXSY8q@@so?zp+LC!XRU^Sg!l{St~Cs?sT-LUfG z1S=~HAw|`|nvLVI5X@lcZyQ&8d~LOYCNpxxz7$lpR^h}T>OMWW&itX}$7H|=1%T~< zquvC51e|b!(Nn})`$|-Aj8*A0x-q9|OSiag$ocjsWBa*lSR7_J!NVGStk&awhct=7 z`;1@D(`db?Kfur~R&VcTy-}AkAP$~nYb&GHjGo>l%`SSX6XQ=b_3%mW0zVqNzyn@d zcc3J!+66uauk^{PUEq8o^l8q@Nq=GUy?@a;-o7$SmTc@>~qtwpe1BXto(7~pQo&ijSAl0>k|8)uc zI|L2j$TE`4NaIaAz&UmR9F?G3vjcn%!)n?Aet)YsEg&gTpfDT-oWFe3g3Q_Fa&~sMgHYh) z=@o2nGbAm(j6A=2_47ZOe&Qo&PO*UdcF4S(SNG`cv@#q|kKXF!biX~;l${#A?bdI9 zLvLqQc5?J~qJH~Xy**2BCq{24>$hLl+j+h1j^0kyZ+}v67kGOah4bp~_=%B%kIT`= zGxf($>*LL<-cHwV4<6v{qTUvxva|Ku_p0oi8?sy?_LuLYEtZt^`66@iebxt~t3$U^ zX1@1EojFi{P^1s)-#X8v{a!xd*+0k|*E1#$O)g`@iFs1Tf6T@4A0PYTfBYip!`DCm zW9~b1{>RrRi`iHPKiXJxSe_{bdK-hqB9wp}U4gsTaE`K1n(=YJlE1cAkS38cBvFu( zbBv8(A}~C@=|~#*O`eYT-Klj7M>Khv0$pC-FO*4=>P3qa%F9bC5dOy(wLOc(;$9(a zW1+wy>^BTJDsnJW>?t)Bac+5Yj<3!_F8g!Na4knlH944+iZu}@<6xz!8&KtaYQwhX z;~WUX7*R*Xn&OvXqmn655)%Z*Hx+l;|c1&*+{!#+C0I2)8N-Al}s>MToY zQn2*9BqVb!HJ4xxp8}dX@J6@@y!iEG@&y=s1~h(QR;kYI+3REx?8EV75}_Zt z4iQv*0V|f9Zmg!r6iiOtdjyeXvgwo8Tij+UWg+laj*e5Pfc)$9cZE$`OsFcnxB8|X9mF^(^&;X z1h9OO^27nlh1-wp#_EdMs*Y9kC48eHYMtHlBS?T@341eyB8|V3%oBvg5fPI*Mq)bV9FDIFRpg?e+2+IvwJ^i~6Z)LP8mnna z`qYV;KxrbBzXj}}WrV;)ed@%7&nT9Vs4HF;)WjuPr%w1Vq|^tg@6+j&bn-AWSZ9$o z0^V)zPM*6=TDT?2lT;&KFC@hply(`-%6>JdO44d>O-GD0mDJkis9rbczR94 z-FCw=PjyEPv78awsb0A?NA&^`a{UVe9EJ=W)Ak_WX@r5~+&m-gbeK zf_`kca#DohN^W*q@<|bJ{uoZo1F8FYPF;j@Lc)#lc zUuHFdatIkq?eDB7roJYW3Kc=9#sgs&;sfEfwL#b|BfQ!g2-}wN zTeYk(zoq*+OQKziQU4qP7l(!6KFw;~7O zdZTH^{(wN~jSztyRrS1MIBVt|l|_}+Rdw}W4!>@pCIZeLgHc_c{x~(FNZ3pf0TG>f z9+1uGNcYV;3}Qq|9BaD{DN!J1zm4R9D|G{=2F9XwmhheuBUI%_gQ`=^MNxf|0{{}; z?VRIug7p!2gmhyFTqE5E2&_|RqlHAcJ9Qw?nigvOHI=PGYjD*^Qf!FUXdgA=Ob7Ns zJwA>C^-JPbT2!MLovrHLrtg-E>l;-_qGfY`5tACGMo!D6&c!gdp*7Iq=!4IJ;6Bb_ zSjmIm-J%4Tr&Smxd5ctFY0C7Kba3|UH0L-dqzntX)4xLcFnTie%^1%)>XjT)VR)sBll4``LtMD{a z1s(Ef0&tJIiim|n546365ZD8P58A8Y#4tFB<1$j3>L@hl{FKgkyT0LDm*HEN*_6r{ zJX&1zdEzg4;xEwUnp$<}!i-dmBpLPn#A~y6<^8h|fN|hL(LZ}vlw`5xlGJbu3U?g0 z;81JnWJLM1F3`Rnj2iq_^ot2daW0`grDMAVDbBJ1PCB|xjZgOHFVkTS6LC_54?Ym5 z0G!f0goL4V+KJ7I&l)&sSkuHDNKjo#6Lbs6IVs5n@7~10&a=#0cjJSiZ)ahb2x~4K z5`83(L!yDP4^!~r(5?ArLBts2XgU$<>dh8$0IH|wSK8Pc4v=~C|ve49>8hcxR zL5l{vxH%$$I}zKNy4*D2tf4de9PG`hdK|Q^WabP|#~*Zr33FVS<|!`V2mVPb?tmLq zqZCl&SUEJ`Mt{^qKm=LPJQD#m&H}Hl)}!u0??)RpV1>UwtA#;ugn2J`x_z?AYd(Ca zcGf4Aek>Z?6M{e@IXwvKl{p-j&X#AdZ*vmPrNq5 zUkQSxN})I(2cwVtwmA-l?j*x9+Cc9|q3`;@j%I!3HRfa^%Bw%p+jI4{q<3jW znJh|qHL|j`3|Ni*?z0%MY_0;oI4O*p!g$sCHreZ%nj7ohZ>ZfcetGboF&Vce#*JGx zUOkYnd&+BMFQ9Qw#)u4-+-w=Bd8bJoI@9kUhmR;KGWZBa_WFp|`asv(FE8<|0}KXG zy6CGkePv-+6%CpHWa#cu6|J409_<`G+L0cSc;ZKAKa_JIsQQ<|GPn?+-q}Ncq%nx< z6c-@qHJwsW1|*Q8o3udUTo?)K#V@$qBZ*5F&5l~}H{w=*-Z2@kK$xmoRGE=j35d+Ap&+~ndNj_>TS&W;uYZGo? zWbwFKm|2G`4(2Ve^Wo(F1(J-GWtJlW^6Ilck=jP_UR`ru{kq`!(-j zN5$T+KKy}i{LaUJ_BZ}E`=Ll%omYR`)R>KikdPqr5LUDkp*uc=8rt=k&2v6FJ|qUD z1+vBics-iKzd%*;b+lP$!&pC}w{}ppy59`$eR`|4Gd51G81m{qJ@In8)%6_I}23Sr`(1)sz3%2N-knA4+)zxcP87I~PUx@wKA$<3KTcR=gRi zMso(f;Z&dxu}Djdtl+E~B3iTavwE2-Wg?SG_3huz_E)TQs(<+Qx3e3nm6eCGH?&eo z@diOgANU?EROEDiI!8$dKUH6l0OlcSXU^kt^xdE4!4~d*0--xcIoUTaF8aRfaL1;v zKA*6!l~)9A{IrS8wR-h{CK6RW(o}WOcl}lg$shG&yu>pbmzW)>IR%sU^VyYxbEX3R zYXK9a0B{f|3w6#F^)ybM@<_FD?dbn;oMAA+YBz^8Gbpipoj;`^pU>Tr?=Il(eD|C~ zY#1wOxK3q{onB?;8BbBRdPVQ{#H@buQ~aFQPvhtz{T%Rf3<5W<0|5GU!Dv30nn`B< zHOhw{(Rk(8)0CgD0k_8;6WsR%3)CcB`suO_^xw|cX%qYu9wysudp_0Vga5g1@>w@d z*lJy~23O-G09P%jm%`3b$6KRGV|co$upWcdj)aq*K20RU3taOU#^CnqIG`*Y@&%U= zY$VjHXFhUVboy)oNf&52AX+xNkI#!e#x#5FbZ6Zm=^M2+!{ek3HHr(5wxq8%(p|KC z;xj8RvxjG#)~IexS_tnrPKX=rMUqN267ssM#LuU&$19f{Cx}em)1TA{A`6q*gi;OR zCN?dg=tPF;HHuHtc%+7Cqx8l~PhUz;OFv6WPXw(EzDd7~xZ#wu?#7I}U7w(!(=dOUrk0-Q{#04J3SFpWCp3b9iT@TwJ= zvyxYdkwZ3@8yNP11b}#UReE-*U>4^!M8Y>J0Mtc*DawcLT;L1ywj#*jcNs5o#%x3PR!4^v*E zJ^;fS8!rf8=MgmDn0PPBi|stTQNh z}v}>@2$V?5k?oGo+Lznm^fMC%&R)eombO`={T6i9G|L40;B$tNmTDN#;AYxcZwHS z5B9zfNMd>zY`6kcJ?*J(Ehc;4OW_CB6mHh;%{=_$FWi}Hqoaw#q<(tn*b+V?V}Qpo z`x|+JP2W~qBqmV@b$XeCfm*vP&6qfB?w zyu^u4@Zp3%Ow!O48vxG}6~-laqN;Q^yhWP+5&PDruMs777CPuGI`FLNdY4;3n*|-F z@kl}RLxk-KI*RRw<|*%CnqJrK8`K=!b(6)N$#bD76@QbUW0-j)31+UW<^-u{mj4N~ zHFry|YL?(B1!QIfpD)Q&>?2En_kQDpk38|Ir}T(ai+##0>$3MNPkrDUfAGwg9(+b`NTR``zy7_? z{p26s`{hr4Lyxp?g98`s&d7$+;L!;@s^0(3t8cTSeoJ3F^*@huEZ4Jb<&;QcTe$`O zxbp*OeAGdnEv(O6`tpr#D|-ZJl@Uck(ECJxYVYoM9~e&EI-J9cJ-z@3-??U20mTru(q}y^FW;ni{5f z6BW?Jq$VM>D;28m zw1Q*lRt&y6YfTez1xgN`1Ui@nbObKekA5e{*kug(`B~-yf6vsQtUN09hsok+XODXqz~_&+HhqnSc%%E70DxVA!B9k4UJ;_{AGhfYTb&BhQoM zkh)*)p?)XbV@aVdY1876F8NMi;6Z?ao2FAhj;0GQVZlqSKv!4d?pBxxEJG+fRvFcA zE68t=StL=|a!?;zh^m;XbV{9{EdsI}jK0ojx*Lq9+l*$S9*y{{&s5VzW3ko`0P@So zop_^qEa{>yNW<1rZ-Y^eD$m!9Q);Dhit>jOMvIV08g9?h2xp84kTl=SimZpEx7=3j zlvpZK2TV}Ng$6v@Xtf45K6f41_~7*#(>0jw8J1dHsJgc*-TPJbvdY1J@~`~vul)t; zQXa@3(ZS5Quntf2K+iGyz8qo$y>7T9TjGw!d)2X{$FUysy0@=-Q1=gh^mx{LUK5q8 z1z{wk2|Er1WI5gzC~V)AL+-p2grI9T-guFc3o)-Rhi5w;rjxwLlN3 zg5Lc^P8iegB~XR=3apWFiqqb5adcXiF^iwQE3~%665P2$&$;~<*oE^OFUfF$^K0(y z)sy;#<%?evZ*N|+kxN#Lb_s$e#=mK*sO!Yz%@>>B4pXn5b+whxkEY|=I4Wi(XE<;r z;#Uu~1CL+$$!w0)_}FxY%3(5VHy%~f!Q)YHAzNPVDqYjC+;8Cl0_N;TZz@k!%6h^J zAA3)+QtfGmWZav*2*n!yGO`3x=!K1eZ`2yp+F~};s8)ADTjE!D0bES&Ls4plxkK)Op&~eLPP~1d9l;;PQF74d4%0DvLb;I@DF2Y$z<|1>y~O6uqC7W(w~2#YfMn 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/dev/null && shellcheck "$0" -CONTRACT="babylon_contract" +CONTRACTS="babylon_contract btc_staking" OUTPUT_FOLDER="$(dirname "$0")/../bytecode" echo "DEV-only: copy from local built instead of downloading" -cp -f ../../../babylon-contract/artifacts/${CONTRACT}.wasm "$OUTPUT_FOLDER/" +for CONTRACT in $CONTRACTS +do + cp -f ../../../babylon-contract/artifacts/"${CONTRACT}".wasm "$OUTPUT_FOLDER/" +done cd ../../../babylon-contract TAG=$(git rev-parse HEAD) diff --git a/test/e2e/scripts/download_release.sh b/test/e2e/scripts/download_release.sh index 77e35985d..58d4f617d 100755 --- a/test/e2e/scripts/download_release.sh +++ b/test/e2e/scripts/download_release.sh @@ -4,7 +4,7 @@ command -v shellcheck >/dev/null && shellcheck "$0" OWNER="babylonchain" REPO="babylon-contract" -CONTRACT="babylon_contract" +CONTRACTS="babylon_contract btc_staking" OUTPUT_FOLDER="$(dirname "$0")/../bytecode" [ -z "$GITHUB_API_TOKEN" ] && echo "Error: Please define GITHUB_API_TOKEN variable." >&2 && exit 1 @@ -24,14 +24,18 @@ curl -o /dev/null -sH "$AUTH" $GH_REPO || { echo "Error: Invalid repo, token or # Read asset tags RESPONSE=$(curl -sH "$AUTH" "$GH_TAGS") -# Get id of the contract -ID=$(echo "$RESPONSE" | grep -C3 "name.:.\+$CONTRACT.wasm" | grep -w id | cut -f1 -d, | awk '{print $2}') -[ -z "$ID" ] && echo "Error: Failed to get asset id, response: $RESPONSE" | awk 'length($0)<100' >&2 && exit 1 -GH_ASSET="$GH_REPO/releases/assets/$ID" +for CONTRACT in $CONTRACTS +do + # Get id of the contract + ID=$(echo "$RESPONSE" | grep -C3 "name.:.\+$CONTRACT.wasm" | grep -w id | cut -f1 -d, | awk '{print $2}') -# Download asset file -echo -n "Downloading asset..." >&2 -curl -s -L -H "Authorization: token $GITHUB_API_TOKEN" -H 'Accept: application/octet-stream' "$GH_ASSET" >"$OUTPUT_FOLDER/$CONTRACT.wasm" -echo "$TAG" >"$OUTPUT_FOLDER/version.txt" -echo "done." >&2 + [ -z "$ID" ] && echo "Error: Failed to get asset id, response: $RESPONSE" | awk 'length($0)<100' >&2 && exit 1 + GH_ASSET="$GH_REPO/releases/assets/$ID" + + # Download asset file + echo -n "Downloading $CONTRACT..." >&2 + curl -s -L -H "Authorization: token $GITHUB_API_TOKEN" -H 'Accept: application/octet-stream' "$GH_ASSET" >"$OUTPUT_FOLDER/$CONTRACT.wasm" + echo "$TAG" >"$OUTPUT_FOLDER/version.txt" + echo "done." >&2 +done diff --git a/x/btcstaking/keeper/btc_staking_consumer_events.go b/x/btcstaking/keeper/btc_staking_consumer_events.go index e37c16942..3bbcd2a5a 100644 --- a/x/btcstaking/keeper/btc_staking_consumer_events.go +++ b/x/btcstaking/keeper/btc_staking_consumer_events.go @@ -10,7 +10,7 @@ import ( ) func (k Keeper) AddBTCStakingConsumerEvent(ctx context.Context, consumerID string, event *types.BTCStakingConsumerEvent) error { - store := k.btcStakingConsumerEventStore(ctx, consumerID) + store := k.btcStakingConsumerEventStore(ctx) storeKey := []byte(consumerID) // If the consumer already has events, append the new event to the existing list @@ -42,7 +42,7 @@ func (k Keeper) AddBTCStakingConsumerEvent(ctx context.Context, consumerID strin // GetBTCStakingConsumerIBCPacket gets BTC staking consumer IBC packet for a given consumer ID. func (k Keeper) GetBTCStakingConsumerIBCPacket(ctx context.Context, consumerID string) *types.BTCStakingIBCPacket { - store := k.btcStakingConsumerEventStore(ctx, consumerID) + store := k.btcStakingConsumerEventStore(ctx) storeKey := []byte(consumerID) if !store.Has(storeKey) { return nil @@ -57,9 +57,8 @@ func (k Keeper) GetBTCStakingConsumerIBCPacket(ctx context.Context, consumerID s // GetAllBTCStakingConsumerIBCPackets retrieves all BTC staking consumer IBC packets from the store, // returning a map where the keys are consumer IDs and the values are the corresponding BTCStakingIBCPacket. func (k Keeper) GetAllBTCStakingConsumerIBCPackets(ctx context.Context) map[string]*types.BTCStakingIBCPacket { - storeAdaptor := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - evStore := prefix.NewStore(storeAdaptor, types.BTCStakingEventKey) - iter := evStore.Iterator(nil, nil) + store := k.btcStakingConsumerEventStore(ctx) + iter := store.Iterator(nil, nil) defer iter.Close() // Initialize the map to hold consumer ID keys and IBC packet values. @@ -75,7 +74,7 @@ func (k Keeper) GetAllBTCStakingConsumerIBCPackets(ctx context.Context) map[stri } func (k Keeper) DeleteBTCStakingConsumerIBCPacket(ctx context.Context, consumerID string) { - store := k.btcStakingConsumerEventStore(ctx, consumerID) + store := k.btcStakingConsumerEventStore(ctx) storeKey := []byte(consumerID) store.Delete(storeKey) } @@ -84,8 +83,7 @@ func (k Keeper) DeleteBTCStakingConsumerIBCPacket(ctx context.Context, consumerI // prefix: BTCStakingEventKey || consumer ID // key: BTCStakingConsumerEventType // value: BTCStakingConsumerEvents (a list of BTCStakingConsumerEvent) -func (k Keeper) btcStakingConsumerEventStore(ctx context.Context, consumerID string) prefix.Store { +func (k Keeper) btcStakingConsumerEventStore(ctx context.Context) prefix.Store { storeAdaptor := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - evStore := prefix.NewStore(storeAdaptor, types.BTCStakingEventKey) - return prefix.NewStore(evStore, []byte(consumerID)) + return prefix.NewStore(storeAdaptor, types.BTCStakingEventKey) } diff --git a/x/btcstaking/types/packet.pb.go b/x/btcstaking/types/packet.pb.go index f4207e3a4..dea5fce7f 100644 --- a/x/btcstaking/types/packet.pb.go +++ b/x/btcstaking/types/packet.pb.go @@ -214,20 +214,17 @@ type NewFinalityProvider struct { BtcPkHex string `protobuf:"bytes,4,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` // pop is the proof of possession of babylon_pk and btc_pk Pop *ProofOfPossessionBTC `protobuf:"bytes,5,opt,name=pop,proto3" json:"pop,omitempty"` - // master_pub_rand is the master public randomness of the finality provider - // encoded as a base58 string - MasterPubRand string `protobuf:"bytes,6,opt,name=master_pub_rand,json=masterPubRand,proto3" json:"master_pub_rand,omitempty"` // slashed_babylon_height indicates the Babylon height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - SlashedBabylonHeight uint64 `protobuf:"varint,7,opt,name=slashed_babylon_height,json=slashedBabylonHeight,proto3" json:"slashed_babylon_height,omitempty"` + SlashedBabylonHeight uint64 `protobuf:"varint,6,opt,name=slashed_babylon_height,json=slashedBabylonHeight,proto3" json:"slashed_babylon_height,omitempty"` // slashed_btc_height indicates the BTC height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - SlashedBtcHeight uint64 `protobuf:"varint,8,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` + SlashedBtcHeight uint64 `protobuf:"varint,7,opt,name=slashed_btc_height,json=slashedBtcHeight,proto3" json:"slashed_btc_height,omitempty"` // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in Babylon. - ConsumerId string `protobuf:"bytes,9,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` + ConsumerId string `protobuf:"bytes,8,opt,name=consumer_id,json=consumerId,proto3" json:"consumer_id,omitempty"` } func (m *NewFinalityProvider) Reset() { *m = NewFinalityProvider{} } @@ -298,13 +295,6 @@ func (m *NewFinalityProvider) GetPop() *ProofOfPossessionBTC { return nil } -func (m *NewFinalityProvider) GetMasterPubRand() string { - if m != nil { - return m.MasterPubRand - } - return "" -} - func (m *NewFinalityProvider) GetSlashedBabylonHeight() uint64 { if m != nil { return m.SlashedBabylonHeight @@ -842,76 +832,75 @@ func init() { } var fileDescriptor_3ed0d17ad14d6c0e = []byte{ - // 1102 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4d, 0x73, 0x1a, 0x47, - 0x13, 0x66, 0x05, 0xfa, 0xa0, 0x01, 0x59, 0x5e, 0x49, 0xd6, 0x96, 0xfd, 0xbe, 0x58, 0xc1, 0x8e, - 0x4b, 0x95, 0x38, 0x10, 0x29, 0x89, 0x6f, 0x39, 0x08, 0x64, 0x15, 0xaa, 0x28, 0x16, 0x59, 0x50, - 0x52, 0x95, 0xcb, 0xd6, 0xec, 0xee, 0x00, 0x53, 0xc0, 0xcc, 0xd6, 0xce, 0x80, 0xd0, 0xbf, 0xc8, - 0x21, 0xa7, 0xfc, 0x9c, 0x9c, 0x72, 0xf4, 0x2d, 0xc9, 0x2d, 0x25, 0xfd, 0x91, 0xd4, 0xce, 0xce, - 0x7e, 0x80, 0x41, 0x09, 0xb9, 0x41, 0xf7, 0xd3, 0xdf, 0x4f, 0x4f, 0x2f, 0x54, 0x6c, 0x64, 0xdf, - 0x0e, 0x19, 0xad, 0xd9, 0xc2, 0xe1, 0x02, 0x0d, 0x08, 0xed, 0xd5, 0x26, 0xc7, 0x35, 0x0f, 0x39, - 0x03, 0x2c, 0xaa, 0x9e, 0xcf, 0x04, 0xd3, 0xf7, 0x15, 0xa6, 0x9a, 0x60, 0xaa, 0x93, 0xe3, 0xa7, - 0x15, 0x87, 0xf1, 0x11, 0xe3, 0x35, 0xc7, 0xbf, 0xf5, 0x04, 0xab, 0x71, 0xec, 0x78, 0x27, 0x5f, - 0xbd, 0x19, 0x1c, 0xd7, 0x06, 0xf8, 0x96, 0x87, 0xa6, 0x4f, 0x5f, 0x2a, 0x4c, 0xe2, 0xda, 0xc6, - 0x02, 0x1d, 0x47, 0xff, 0x15, 0xea, 0xf9, 0x92, 0x24, 0x98, 0xa7, 0x00, 0xaf, 0x16, 0x03, 0x52, - 0xf9, 0x48, 0x5c, 0xc5, 0x86, 0xc7, 0x0d, 0x46, 0xf9, 0x78, 0x84, 0xfd, 0x8b, 0x7a, 0xa3, 0x25, - 0x8b, 0xd0, 0xbf, 0x05, 0xe0, 0x43, 0xc4, 0xfb, 0xd8, 0xb5, 0xba, 0x9e, 0xa1, 0x1d, 0x66, 0x8f, - 0x0a, 0x27, 0xd5, 0xea, 0xc2, 0x9a, 0xaa, 0xed, 0x10, 0x78, 0x4e, 0x28, 0x1a, 0x12, 0x71, 0xdb, - 0xf2, 0xd9, 0x84, 0xb8, 0xd8, 0x37, 0xf3, 0xca, 0xc3, 0xb9, 0x57, 0xe9, 0xc2, 0xc1, 0x12, 0x94, - 0xfe, 0x3f, 0x00, 0x5b, 0x38, 0x96, 0x37, 0xb0, 0xfa, 0x78, 0x6a, 0x68, 0x87, 0xda, 0x51, 0xde, - 0xdc, 0xb2, 0x85, 0xd3, 0x1a, 0x34, 0xf1, 0x54, 0xff, 0x0c, 0x76, 0x7d, 0xec, 0xb0, 0x09, 0xf6, - 0x65, 0x26, 0x56, 0x00, 0xe5, 0x03, 0x63, 0x4d, 0xc2, 0x76, 0x62, 0xd5, 0xb9, 0x57, 0x17, 0x4e, - 0x7b, 0x50, 0xf9, 0x75, 0x0d, 0x76, 0xeb, 0x9d, 0x46, 0x3b, 0x4c, 0x2e, 0x29, 0xe7, 0x14, 0x36, - 0x28, 0xbe, 0x49, 0x4a, 0xf9, 0x64, 0x49, 0x29, 0xef, 0xf0, 0xcd, 0x07, 0x65, 0xac, 0x53, 0x7c, - 0x73, 0xee, 0xe9, 0x17, 0x00, 0xc8, 0x11, 0x64, 0x82, 0x2d, 0x17, 0x0f, 0x8d, 0xb5, 0x07, 0xdd, - 0x9c, 0x4a, 0x60, 0xbd, 0xd3, 0x38, 0xc3, 0x43, 0xdc, 0x43, 0x82, 0x30, 0x6a, 0xe6, 0x43, 0xeb, - 0x33, 0x3c, 0xd4, 0x2f, 0xa1, 0x10, 0x35, 0x37, 0xf0, 0x95, 0x95, 0xbe, 0x3e, 0x7d, 0xb8, 0xbb, - 0xb3, 0xce, 0xa2, 0xe1, 0x04, 0xde, 0xae, 0xa0, 0x38, 0xa6, 0x36, 0xa3, 0xae, 0x72, 0x97, 0x93, - 0xee, 0x5e, 0x2f, 0x71, 0x77, 0xad, 0xa0, 0xb3, 0xfe, 0x0a, 0x91, 0x87, 0x33, 0x3c, 0xac, 0xfc, - 0x92, 0x85, 0xdd, 0x05, 0x8d, 0xd0, 0xdf, 0x42, 0xc1, 0xc5, 0xdc, 0xf1, 0x89, 0x17, 0xd8, 0xc8, - 0x51, 0x15, 0x4e, 0x5e, 0x54, 0x43, 0xb6, 0x56, 0x93, 0x18, 0x92, 0xad, 0xd5, 0xb3, 0x04, 0x6a, - 0xa6, 0xed, 0xf4, 0x32, 0x80, 0xc3, 0x46, 0x23, 0xc2, 0x79, 0xe0, 0x25, 0x9c, 0x64, 0x4a, 0xa2, - 0xeb, 0x90, 0x43, 0xae, 0xeb, 0x1b, 0x59, 0xa9, 0x91, 0xbf, 0xe7, 0x48, 0x92, 0x9b, 0x23, 0xc9, - 0xd7, 0x90, 0xf5, 0x98, 0x67, 0xac, 0xcb, 0x84, 0x96, 0xf5, 0xb1, 0xe5, 0x33, 0xd6, 0xbd, 0xea, - 0xb6, 0x18, 0xe7, 0x58, 0x06, 0xaa, 0x77, 0x1a, 0x66, 0x60, 0xa7, 0xbf, 0x82, 0x47, 0x23, 0xc4, - 0x05, 0xf6, 0x2d, 0x6f, 0x6c, 0x5b, 0x3e, 0xa2, 0xae, 0xb1, 0x21, 0x23, 0x94, 0x42, 0x71, 0x6b, - 0x6c, 0x9b, 0x88, 0xba, 0xfa, 0x97, 0xf0, 0x24, 0x1a, 0x9b, 0x0a, 0x61, 0xf5, 0x31, 0xe9, 0xf5, - 0x85, 0xb1, 0x79, 0xa8, 0x1d, 0xe5, 0xcc, 0x3d, 0xa5, 0xad, 0x87, 0xca, 0xa6, 0xd4, 0xe9, 0xaf, - 0x41, 0x8f, 0xad, 0x84, 0x13, 0x59, 0x6c, 0x49, 0x8b, 0x9d, 0xc8, 0x42, 0x38, 0x0a, 0xfd, 0x1c, - 0x0a, 0x8e, 0x5a, 0x46, 0x8b, 0xb8, 0x46, 0x3e, 0xea, 0x8e, 0xda, 0x4f, 0xb7, 0xf2, 0x67, 0x0e, - 0x76, 0x17, 0xd0, 0xeb, 0x1f, 0xd6, 0xe8, 0x05, 0x6c, 0xab, 0xe5, 0xf1, 0x06, 0xd6, 0x90, 0x70, - 0x21, 0x09, 0x9c, 0x37, 0x0b, 0xdd, 0x60, 0x71, 0x5a, 0x83, 0x4b, 0xc2, 0x85, 0xfe, 0x11, 0x14, - 0xb9, 0x40, 0xbe, 0x88, 0x72, 0xcc, 0xca, 0x1c, 0x0b, 0x52, 0xa6, 0xd2, 0xfb, 0x3f, 0x00, 0xa6, - 0x6e, 0x04, 0xc8, 0x49, 0x40, 0x1e, 0x53, 0x57, 0xa9, 0x9f, 0x41, 0x5e, 0x30, 0x81, 0x86, 0x16, - 0x47, 0x42, 0x8e, 0x23, 0x67, 0x6e, 0x49, 0x41, 0x1b, 0x49, 0x5b, 0x35, 0x0e, 0x4b, 0x4c, 0x65, - 0x87, 0x8b, 0x66, 0x5e, 0x49, 0x3a, 0xd3, 0xa0, 0x72, 0xd9, 0x0d, 0xa5, 0xdf, 0x94, 0x7a, 0x88, - 0x44, 0x9d, 0x69, 0xd0, 0x7e, 0x37, 0xac, 0x97, 0xf9, 0x56, 0x0c, 0xe5, 0xa4, 0x27, 0x9b, 0x59, - 0x34, 0xf7, 0x62, 0x6d, 0x5b, 0x29, 0xdb, 0xa4, 0xa7, 0x5f, 0x43, 0x29, 0x78, 0x23, 0x28, 0xa2, - 0x22, 0xc0, 0x72, 0x23, 0x2f, 0xd7, 0xe3, 0xf3, 0x25, 0x2c, 0x69, 0x28, 0xec, 0xa9, 0x8b, 0xbc, - 0xc0, 0x13, 0xe9, 0x51, 0x24, 0xc6, 0x3e, 0xe6, 0x66, 0x31, 0x72, 0xd3, 0x26, 0x3d, 0x2e, 0xa7, - 0xaa, 0x8a, 0x61, 0x63, 0xe1, 0x8d, 0x85, 0x45, 0xdc, 0xa9, 0x01, 0x87, 0xda, 0x51, 0xc9, 0xdc, - 0x51, 0x9a, 0x2b, 0xa9, 0xb8, 0x70, 0xa7, 0xfa, 0xc7, 0xb0, 0x1d, 0x2e, 0x98, 0x2c, 0x8e, 0x8c, - 0xb0, 0x51, 0x92, 0xc8, 0x52, 0x2c, 0xed, 0x90, 0x11, 0xd6, 0x7f, 0x80, 0xc7, 0x63, 0xea, 0xc6, - 0x33, 0xb5, 0x08, 0xed, 0x32, 0x63, 0x5b, 0xb2, 0x7a, 0xd9, 0x4b, 0x53, 0xef, 0x34, 0xae, 0x53, - 0x26, 0x17, 0xb4, 0xcb, 0xcc, 0x9d, 0xf1, 0x9c, 0x24, 0x88, 0xef, 0x21, 0x1f, 0x8d, 0xb8, 0x35, - 0xc1, 0xbe, 0x5c, 0xbb, 0x47, 0x61, 0xfc, 0x50, 0xfa, 0x7d, 0x28, 0xac, 0xfc, 0x9c, 0x95, 0xaf, - 0xe7, 0xbc, 0xc3, 0x80, 0x18, 0xa9, 0xf4, 0x43, 0x76, 0x15, 0xa3, 0x37, 0x23, 0x1c, 0xce, 0x1b, - 0x38, 0x48, 0x86, 0x93, 0x80, 0x83, 0xe9, 0xac, 0x49, 0xf4, 0x7e, 0xac, 0xbe, 0x8e, 0xb4, 0xc1, - 0x78, 0x1c, 0x78, 0x16, 0x8f, 0x67, 0xc6, 0x2c, 0x64, 0x69, 0xf8, 0x34, 0xbe, 0x5c, 0xf6, 0x34, - 0x46, 0xd3, 0x91, 0x65, 0x1b, 0x91, 0xa3, 0x74, 0x00, 0x49, 0xec, 0x39, 0x6a, 0xe5, 0x56, 0xa0, - 0xd6, 0xfa, 0x03, 0xd4, 0xea, 0xc2, 0x93, 0x84, 0x5a, 0x29, 0x23, 0x6e, 0x6c, 0xfc, 0x47, 0x8e, - 0xed, 0xc5, 0x1c, 0x4b, 0xc2, 0xf0, 0xca, 0x08, 0xf6, 0x16, 0x1d, 0x81, 0xe0, 0xdd, 0x4a, 0x16, - 0xca, 0xea, 0x23, 0xde, 0x57, 0x7b, 0x5f, 0x8a, 0xb7, 0xaa, 0x89, 0x78, 0x7f, 0xd5, 0x1b, 0x4a, - 0x60, 0x7f, 0xe1, 0x91, 0xf8, 0xd7, 0xf1, 0x8e, 0x60, 0x27, 0x4d, 0x97, 0x14, 0x09, 0xb6, 0x53, - 0x94, 0x69, 0x93, 0x5e, 0xe5, 0xf7, 0x35, 0x38, 0x48, 0xce, 0x75, 0xf4, 0x15, 0xf2, 0x76, 0x82, - 0xa9, 0xd0, 0x1b, 0xa9, 0x93, 0xad, 0xad, 0x76, 0xb2, 0x9b, 0x99, 0xe8, 0x68, 0x7f, 0x33, 0x77, - 0xb4, 0xb5, 0xd5, 0x8e, 0x76, 0x33, 0x93, 0x3e, 0xdb, 0xef, 0xe6, 0xcf, 0xb6, 0xb6, 0xe2, 0xd9, - 0x6e, 0x66, 0x66, 0x0e, 0xf7, 0x77, 0x1f, 0x1c, 0x6e, 0x6d, 0xd5, 0xc3, 0xdd, 0xcc, 0xcc, 0x9c, - 0xee, 0xfa, 0x26, 0xac, 0xe3, 0xa0, 0x7b, 0xf5, 0xcb, 0xdf, 0xee, 0xca, 0xda, 0xfb, 0xbb, 0xb2, - 0xf6, 0xd7, 0x5d, 0x59, 0xfb, 0xe9, 0xbe, 0x9c, 0x79, 0x7f, 0x5f, 0xce, 0xfc, 0x71, 0x5f, 0xce, - 0xfc, 0x78, 0xd2, 0x23, 0xa2, 0x3f, 0xb6, 0xab, 0x0e, 0x1b, 0xd5, 0x54, 0x24, 0xa7, 0x8f, 0x08, - 0x8d, 0xfe, 0xd4, 0xa6, 0xe9, 0x0f, 0x46, 0x71, 0xeb, 0x61, 0x6e, 0x6f, 0xc8, 0x2f, 0xc5, 0x2f, - 0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x51, 0x29, 0xdc, 0xa2, 0xf9, 0x0a, 0x00, 0x00, + // 1080 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcb, 0x72, 0xe2, 0x46, + 0x17, 0x46, 0x80, 0x2f, 0x1c, 0xb0, 0xc7, 0x23, 0xdb, 0x63, 0xd5, 0xcc, 0xff, 0x33, 0x0e, 0x33, + 0x99, 0x72, 0x25, 0x13, 0x11, 0x3b, 0xc9, 0xec, 0xb2, 0x30, 0x78, 0x5c, 0xb8, 0xe2, 0x8c, 0x89, + 0xc0, 0x49, 0x55, 0x36, 0xaa, 0x96, 0xd4, 0x40, 0x97, 0x40, 0xad, 0x52, 0x37, 0x18, 0xbf, 0x45, + 0x16, 0x79, 0xa2, 0xac, 0xb2, 0x9c, 0x5d, 0x92, 0x5d, 0xca, 0x7e, 0x83, 0x3c, 0x41, 0x4a, 0xad, + 0xd6, 0x05, 0x06, 0x9c, 0x90, 0x1d, 0xf4, 0xf9, 0xce, 0xd7, 0xe7, 0xf2, 0x9d, 0x3e, 0x82, 0x9a, + 0x85, 0xac, 0xdb, 0x21, 0xf5, 0xea, 0x16, 0xb7, 0x19, 0x47, 0x2e, 0xf1, 0xfa, 0xf5, 0xc9, 0x71, + 0xdd, 0x47, 0xb6, 0x8b, 0xb9, 0xee, 0x07, 0x94, 0x53, 0x75, 0x5f, 0x62, 0xf4, 0x14, 0xa3, 0x4f, + 0x8e, 0x9f, 0xd6, 0x6c, 0xca, 0x46, 0x94, 0xd5, 0xed, 0xe0, 0xd6, 0xe7, 0xb4, 0xce, 0xb0, 0xed, + 0x9f, 0x7c, 0xf5, 0xc6, 0x3d, 0xae, 0xbb, 0xf8, 0x96, 0x45, 0xae, 0x4f, 0x5f, 0x4a, 0x4c, 0x4a, + 0x6d, 0x61, 0x8e, 0x8e, 0xe3, 0xff, 0x12, 0xf5, 0x7c, 0x49, 0x10, 0xd4, 0x97, 0x80, 0x57, 0x8b, + 0x01, 0x99, 0x78, 0x04, 0xae, 0x66, 0xc1, 0xe3, 0x26, 0xf5, 0xd8, 0x78, 0x84, 0x83, 0x8b, 0x46, + 0xb3, 0x2d, 0x92, 0x50, 0xbf, 0x05, 0x60, 0x43, 0xc4, 0x06, 0xd8, 0x31, 0x7b, 0xbe, 0xa6, 0x1c, + 0x16, 0x8e, 0xca, 0x27, 0xba, 0xbe, 0x30, 0x27, 0xbd, 0x13, 0x01, 0xcf, 0x89, 0x87, 0x86, 0x84, + 0xdf, 0xb6, 0x03, 0x3a, 0x21, 0x0e, 0x0e, 0x8c, 0x92, 0x64, 0x38, 0xf7, 0x6b, 0x3d, 0x38, 0x58, + 0x82, 0x52, 0xff, 0x07, 0x60, 0x71, 0xdb, 0xf4, 0x5d, 0x73, 0x80, 0xa7, 0x9a, 0x72, 0xa8, 0x1c, + 0x95, 0x8c, 0x4d, 0x8b, 0xdb, 0x6d, 0xb7, 0x85, 0xa7, 0xea, 0x67, 0xb0, 0x1b, 0x60, 0x9b, 0x4e, + 0x70, 0x20, 0x22, 0x31, 0x43, 0x28, 0x73, 0xb5, 0xbc, 0x80, 0xed, 0x24, 0xa6, 0x73, 0xbf, 0xc1, + 0xed, 0x8e, 0x5b, 0xfb, 0x25, 0x0f, 0xbb, 0x8d, 0x6e, 0xb3, 0x13, 0x05, 0x97, 0xa6, 0x73, 0x0a, + 0xeb, 0x1e, 0xbe, 0x49, 0x53, 0xf9, 0x64, 0x49, 0x2a, 0xef, 0xf0, 0xcd, 0x07, 0x69, 0xac, 0x79, + 0xf8, 0xe6, 0xdc, 0x57, 0x2f, 0x00, 0x90, 0xcd, 0xc9, 0x04, 0x9b, 0x0e, 0x1e, 0x6a, 0xf9, 0x07, + 0x69, 0x4e, 0x05, 0xb0, 0xd1, 0x6d, 0x9e, 0xe1, 0x21, 0xee, 0x23, 0x4e, 0xa8, 0x67, 0x94, 0x22, + 0xef, 0x33, 0x3c, 0x54, 0x2f, 0xa1, 0x1c, 0x17, 0x37, 0xe4, 0x2a, 0x08, 0xae, 0x4f, 0x1f, 0xae, + 0xee, 0x2c, 0x59, 0xdc, 0x9c, 0x90, 0xed, 0x0a, 0x2a, 0x63, 0xcf, 0xa2, 0x9e, 0x23, 0xe9, 0x8a, + 0x82, 0xee, 0xf5, 0x12, 0xba, 0x6b, 0x09, 0x9d, 0xe5, 0x2b, 0xc7, 0x0c, 0x67, 0x78, 0x58, 0xfb, + 0x2b, 0x0f, 0xbb, 0x0b, 0x0a, 0xa1, 0xbe, 0x85, 0xb2, 0x83, 0x99, 0x1d, 0x10, 0x3f, 0xf4, 0x11, + 0xad, 0x2a, 0x9f, 0xbc, 0xd0, 0x23, 0xb5, 0xea, 0xe9, 0x1d, 0x42, 0xad, 0xfa, 0x59, 0x0a, 0x35, + 0xb2, 0x7e, 0x6a, 0x15, 0xc0, 0xa6, 0xa3, 0x11, 0x61, 0x2c, 0x64, 0x89, 0x3a, 0x99, 0x39, 0x51, + 0x55, 0x28, 0x22, 0xc7, 0x09, 0xb4, 0x82, 0xb0, 0x88, 0xdf, 0x73, 0x22, 0x29, 0xce, 0x89, 0xe4, + 0x6b, 0x28, 0xf8, 0xd4, 0xd7, 0xd6, 0x44, 0x40, 0xcb, 0xea, 0xd8, 0x0e, 0x28, 0xed, 0x5d, 0xf5, + 0xda, 0x94, 0x31, 0x2c, 0x2e, 0x6a, 0x74, 0x9b, 0x46, 0xe8, 0xa7, 0x7e, 0x09, 0x4f, 0xe2, 0x76, + 0x48, 0x57, 0x73, 0x80, 0x49, 0x7f, 0xc0, 0xb5, 0xf5, 0x43, 0xe5, 0xa8, 0x68, 0xec, 0x49, 0x6b, + 0x23, 0x32, 0xb6, 0x84, 0x4d, 0x7d, 0x0d, 0x6a, 0xe2, 0xc5, 0xed, 0xd8, 0x63, 0x43, 0x78, 0xec, + 0xc4, 0x1e, 0xdc, 0x96, 0xe8, 0xe7, 0x50, 0xb6, 0xe5, 0x90, 0x99, 0xc4, 0xd1, 0x36, 0xe3, 0xac, + 0xe5, 0xdc, 0x39, 0xb5, 0x3f, 0x8a, 0xb0, 0xbb, 0x40, 0x36, 0xff, 0x30, 0x1e, 0x2f, 0x60, 0x5b, + 0x0e, 0x85, 0xef, 0x9a, 0x43, 0xc2, 0xb8, 0x10, 0x66, 0xc9, 0x28, 0xf7, 0xc2, 0x81, 0x68, 0xbb, + 0x97, 0x84, 0x71, 0xf5, 0x23, 0xa8, 0x30, 0x8e, 0x02, 0x1e, 0xc7, 0x58, 0x10, 0x31, 0x96, 0xc5, + 0x99, 0x0c, 0xef, 0xff, 0x00, 0xd8, 0x73, 0x62, 0x40, 0x51, 0x00, 0x4a, 0xd8, 0x73, 0xa4, 0xf9, + 0x19, 0x94, 0x38, 0xe5, 0x68, 0x68, 0x32, 0xc4, 0x45, 0x99, 0x8b, 0xc6, 0xa6, 0x38, 0xe8, 0x20, + 0xe1, 0x2b, 0xcb, 0x6c, 0xf2, 0xa9, 0x28, 0x59, 0xc5, 0x28, 0xc9, 0x93, 0xee, 0x34, 0xcc, 0x5c, + 0x54, 0x43, 0xda, 0x37, 0x84, 0x1d, 0xe2, 0xa3, 0xee, 0x34, 0x2c, 0xbf, 0x13, 0xe5, 0x4b, 0x03, + 0x33, 0x81, 0x32, 0xd2, 0x17, 0x55, 0xaa, 0x18, 0x7b, 0x89, 0xb5, 0x23, 0x8d, 0x1d, 0xd2, 0x57, + 0xaf, 0x61, 0x2b, 0x9c, 0x7d, 0x0f, 0x79, 0x3c, 0xc4, 0x32, 0xad, 0x24, 0x64, 0xff, 0xf9, 0x92, + 0xee, 0x37, 0x25, 0xf6, 0xd4, 0x41, 0x7e, 0xc8, 0x44, 0xfa, 0x1e, 0xe2, 0xe3, 0x00, 0x33, 0xa3, + 0x12, 0xd3, 0x74, 0x48, 0x9f, 0x89, 0xae, 0xca, 0x64, 0xe8, 0x98, 0xfb, 0x63, 0x6e, 0x12, 0x67, + 0xaa, 0xc1, 0xa1, 0x72, 0xb4, 0x65, 0xec, 0x48, 0xcb, 0x95, 0x30, 0x5c, 0x38, 0x53, 0xf5, 0x63, + 0xd8, 0x8e, 0x06, 0x47, 0x24, 0x47, 0x46, 0x58, 0xdb, 0x12, 0xc8, 0xad, 0xe4, 0xb4, 0x4b, 0x46, + 0x58, 0xfd, 0x01, 0x1e, 0x8f, 0x3d, 0x27, 0xe9, 0xa9, 0x49, 0xbc, 0x1e, 0xd5, 0xb6, 0x85, 0x5a, + 0x97, 0xbd, 0x20, 0x8d, 0x6e, 0xf3, 0x3a, 0xe3, 0x72, 0xe1, 0xf5, 0xa8, 0xb1, 0x33, 0x9e, 0x3b, + 0x09, 0xef, 0xf7, 0x51, 0x80, 0x46, 0xcc, 0x9c, 0xe0, 0x40, 0x8c, 0xd3, 0xa3, 0xe8, 0xfe, 0xe8, + 0xf4, 0xfb, 0xe8, 0xb0, 0xf6, 0x73, 0x41, 0xbc, 0x8a, 0xf3, 0x84, 0xa1, 0x30, 0x32, 0xe1, 0x47, + 0xea, 0xaa, 0xc4, 0x6f, 0x41, 0xd4, 0x9c, 0x37, 0x70, 0x90, 0x36, 0x27, 0x05, 0x87, 0xdd, 0xc9, + 0x0b, 0xf4, 0x7e, 0x62, 0xbe, 0x8e, 0xad, 0x61, 0x7b, 0x6c, 0x78, 0x96, 0xb4, 0x67, 0xc6, 0x2d, + 0x52, 0x69, 0xf4, 0xe4, 0xbd, 0x5c, 0xf6, 0xe4, 0xc5, 0xdd, 0x11, 0x69, 0x6b, 0x31, 0x51, 0xf6, + 0x02, 0x21, 0xec, 0x39, 0x69, 0x15, 0x57, 0x90, 0xd6, 0xda, 0x03, 0xd2, 0xea, 0xc1, 0x93, 0x54, + 0x5a, 0x19, 0x27, 0xa6, 0xad, 0xff, 0x47, 0x8d, 0xed, 0x25, 0x1a, 0x4b, 0xaf, 0x61, 0xb5, 0x11, + 0xec, 0x2d, 0x7a, 0xdc, 0xd5, 0x57, 0xf0, 0x28, 0x1d, 0x28, 0x73, 0x80, 0xd8, 0x40, 0xce, 0xfd, + 0x56, 0x32, 0x55, 0x2d, 0xc4, 0x06, 0xab, 0xee, 0x46, 0x02, 0xfb, 0x0b, 0x1f, 0xff, 0x7f, 0x7d, + 0xdf, 0x11, 0xec, 0x64, 0xe5, 0x92, 0x11, 0xc1, 0x76, 0x46, 0x32, 0x1d, 0xd2, 0xaf, 0xfd, 0x96, + 0x87, 0x83, 0x74, 0x0d, 0xc7, 0x5f, 0x17, 0x6f, 0x27, 0xd8, 0xe3, 0x6a, 0x33, 0xb3, 0x8a, 0x95, + 0xd5, 0x56, 0x71, 0x2b, 0x17, 0x2f, 0xe3, 0x6f, 0xe6, 0x96, 0xb1, 0xb2, 0xda, 0x32, 0x6e, 0xe5, + 0xb2, 0xeb, 0xf8, 0xdd, 0xfc, 0x3a, 0x56, 0x56, 0x5c, 0xc7, 0xad, 0xdc, 0xcc, 0x42, 0xfe, 0xee, + 0x83, 0x85, 0xac, 0xac, 0xba, 0x90, 0x5b, 0xb9, 0x99, 0x95, 0xdc, 0xd8, 0x80, 0x35, 0x1c, 0x56, + 0xaf, 0x71, 0xf9, 0xeb, 0x5d, 0x55, 0x79, 0x7f, 0x57, 0x55, 0xfe, 0xbc, 0xab, 0x2a, 0x3f, 0xdd, + 0x57, 0x73, 0xef, 0xef, 0xab, 0xb9, 0xdf, 0xef, 0xab, 0xb9, 0x1f, 0x4f, 0xfa, 0x84, 0x0f, 0xc6, + 0x96, 0x6e, 0xd3, 0x51, 0x5d, 0xde, 0x64, 0x0f, 0x10, 0xf1, 0xe2, 0x3f, 0xf5, 0x69, 0xf6, 0x43, + 0x90, 0xdf, 0xfa, 0x98, 0x59, 0xeb, 0xe2, 0x0b, 0xf0, 0x8b, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, + 0x0f, 0x4b, 0xca, 0x81, 0xd1, 0x0a, 0x00, 0x00, } func (m *ConsumerIBCPacket) Marshal() (dAtA []byte, err error) { @@ -1092,24 +1081,17 @@ func (m *NewFinalityProvider) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.ConsumerId) i = encodeVarintPacket(dAtA, i, uint64(len(m.ConsumerId))) i-- - dAtA[i] = 0x4a + dAtA[i] = 0x42 } if m.SlashedBtcHeight != 0 { i = encodeVarintPacket(dAtA, i, uint64(m.SlashedBtcHeight)) i-- - dAtA[i] = 0x40 + dAtA[i] = 0x38 } if m.SlashedBabylonHeight != 0 { i = encodeVarintPacket(dAtA, i, uint64(m.SlashedBabylonHeight)) i-- - dAtA[i] = 0x38 - } - if len(m.MasterPubRand) > 0 { - i -= len(m.MasterPubRand) - copy(dAtA[i:], m.MasterPubRand) - i = encodeVarintPacket(dAtA, i, uint64(len(m.MasterPubRand))) - i-- - dAtA[i] = 0x32 + dAtA[i] = 0x30 } if m.Pop != nil { { @@ -1646,10 +1628,6 @@ func (m *NewFinalityProvider) Size() (n int) { l = m.Pop.Size() n += 1 + l + sovPacket(uint64(l)) } - l = len(m.MasterPubRand) - if l > 0 { - n += 1 + l + sovPacket(uint64(l)) - } if m.SlashedBabylonHeight != 0 { n += 1 + sovPacket(uint64(m.SlashedBabylonHeight)) } @@ -2442,38 +2420,6 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MasterPubRand", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPacket - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPacket - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPacket - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.MasterPubRand = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SlashedBabylonHeight", wireType) } @@ -2492,7 +2438,7 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { break } } - case 8: + case 7: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SlashedBtcHeight", wireType) } @@ -2511,7 +2457,7 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { break } } - case 9: + case 8: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) } From 61ef003d856cd4a00c24145eb5fc88b1373e6c11 Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Fri, 17 May 2024 18:54:08 +1000 Subject: [PATCH 23/85] release v0.2.0 rc0 (#245) --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c844b979..bb4283659 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,12 @@ ## [Unreleased](https://github.com/babylonchain/babylon-private/tree/HEAD) -[Full Changelog](https://github.com/babylonchain/babylon-private/compare/euphrates-0.1.0-rc.1...HEAD) +[Full Changelog](https://github.com/babylonchain/babylon-private/compare/euphrates-0.2.0-rc.0...HEAD) + + +## [euphrates-v0.2.0-rc.0](https://github.com/babylonchain/babylon-private/tree/euphrates-v0.2.0-rc.0) (2024-05-17) + +[Full Changelog](https://github.com/babylonchain/babylon-private/compare/euphrates-0.1.0-rc.1...euphrates-v0.2.0-rc.0) ## [euphrates-0.1.0-rc.1](https://github.com/babylonchain/babylon-private/tree/euphrates-0.1.0-rc.1) (2024-03-25) From 49663ec118cd72239debd6f2429f999bc192b22f Mon Sep 17 00:00:00 2001 From: hiepmai-babylonchain <167088365+hiepmai-babylonchain@users.noreply.github.com> Date: Mon, 20 May 2024 17:40:43 +0700 Subject: [PATCH 24/85] cd: Allows base/consumer-chain-support branch to run push_docker job (#248) --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 085fe6388..285bdd18f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -155,3 +155,4 @@ workflows: only: - main - dev + - base/consumer-chain-support From 5f8413be222f273779a8750b278b9c944af4f7de Mon Sep 17 00:00:00 2001 From: Runchao Han Date: Tue, 21 May 2024 09:11:20 +1000 Subject: [PATCH 25/85] btcstkconsumer: RPC functions for BTC staking consumer module (#247) --- client/query/btcstkconsumer.go | 99 ++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 client/query/btcstkconsumer.go diff --git a/client/query/btcstkconsumer.go b/client/query/btcstkconsumer.go new file mode 100644 index 000000000..8601e9791 --- /dev/null +++ b/client/query/btcstkconsumer.go @@ -0,0 +1,99 @@ +package query + +import ( + "context" + + bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" + "github.com/cosmos/cosmos-sdk/client" + sdkquerytypes "github.com/cosmos/cosmos-sdk/types/query" +) + +// QueryBTCStaking queries the BTC staking consumer module of the Babylon node according to the given function +func (c *QueryClient) QueryBTCStkConsumer(f func(ctx context.Context, queryClient bsctypes.QueryClient) error) error { + ctx, cancel := c.getQueryContext() + defer cancel() + + clientCtx := client.Context{Client: c.RPCClient} + queryClient := bsctypes.NewQueryClient(clientCtx) + + return f(ctx, queryClient) +} + +// QueryConsumerRegistryList returns a list of the consumer systems +func (c *QueryClient) QueryConsumerRegistryList(pagination *sdkquerytypes.PageRequest) (*bsctypes.QueryConsumerRegistryListResponse, error) { + var resp *bsctypes.QueryConsumerRegistryListResponse + err := c.QueryBTCStkConsumer(func(ctx context.Context, queryClient bsctypes.QueryClient) error { + var err error + req := &bsctypes.QueryConsumerRegistryListRequest{ + Pagination: pagination, + } + resp, err = queryClient.ConsumerRegistryList(ctx, req) + return err + }) + + return resp, err +} + +// QueryConsumersRegistry returns the consumer systems with the given consumer IDs +func (c *QueryClient) QueryConsumersRegistry(consumerIDs []string) ([]*bsctypes.ConsumerRegister, error) { + var resp *bsctypes.QueryConsumersRegistryResponse + err := c.QueryBTCStkConsumer(func(ctx context.Context, queryClient bsctypes.QueryClient) error { + var err error + req := &bsctypes.QueryConsumersRegistryRequest{ + ConsumerIds: consumerIDs, + } + resp, err = queryClient.ConsumersRegistry(ctx, req) + return err + }) + + return resp.ConsumersRegister, err +} + +// QueryConsumerFinalityProviders returns a list of finality providers under the given consumer system +func (c *QueryClient) QueryConsumerFinalityProviders(consumerID string, pagination *sdkquerytypes.PageRequest) (*bsctypes.QueryFinalityProvidersResponse, error) { + var resp *bsctypes.QueryFinalityProvidersResponse + err := c.QueryBTCStkConsumer(func(ctx context.Context, queryClient bsctypes.QueryClient) error { + var err error + req := &bsctypes.QueryFinalityProvidersRequest{ + ConsumerId: consumerID, + Pagination: pagination, + } + resp, err = queryClient.FinalityProviders(ctx, req) + return err + }) + + return resp, err +} + +// QueryConsumerFinalityProvider returns the finality provider with the given BTC PK under +// the given consumer ID +func (c *QueryClient) QueryConsumerFinalityProvider(consumerID string, fpBTCPkHex string) (*bsctypes.FinalityProviderResponse, error) { + var resp *bsctypes.QueryFinalityProviderResponse + err := c.QueryBTCStkConsumer(func(ctx context.Context, queryClient bsctypes.QueryClient) error { + var err error + req := &bsctypes.QueryFinalityProviderRequest{ + ConsumerId: consumerID, + FpBtcPkHex: fpBTCPkHex, + } + resp, err = queryClient.FinalityProvider(ctx, req) + return err + }) + + return resp.FinalityProvider, err +} + +// QueryFinalityProviderConsumer returns the consumer that a given finality provider +// belongs to +func (c *QueryClient) QueryFinalityProviderConsumer(fpBTCPkHex string) (string, error) { + var resp *bsctypes.QueryFinalityProviderConsumerResponse + err := c.QueryBTCStkConsumer(func(ctx context.Context, queryClient bsctypes.QueryClient) error { + var err error + req := &bsctypes.QueryFinalityProviderConsumerRequest{ + FpBtcPkHex: fpBTCPkHex, + } + resp, err = queryClient.FinalityProviderConsumer(ctx, req) + return err + }) + + return resp.ConsumerId, err +} From 5701ec967e2eb694b0591a7b573da7818a64bb30 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Tue, 28 May 2024 13:06:25 +0200 Subject: [PATCH 26/85] Fix/babylon update (#253) * Add needed (for babylon as Consumer) staking capability * Upgrade contracts from latest babylon-contract * Support Mac arm64 arch in passing for copy local wasm * Fix: FP fields protobuf sequence numbers * Update contracts to latest * Fix: make proto-gen * Trim unused fields from new finality provider IBC msg * Update protobuf gens * Update code refs --- proto/babylon/btcstaking/v1/btcstaking.proto | 4 +- proto/babylon/btcstaking/v1/packet.proto | 8 - test/e2e/bytecode/babylon_contract.wasm | Bin 722126 -> 676910 bytes test/e2e/bytecode/btc_staking.wasm | Bin 323715 -> 383547 bytes test/e2e/bytecode/version.txt | 2 +- test/e2e/scripts/copy_local_wasm.sh | 8 +- .../btc_staking_consumer_events_test.go | 2 - .../types/btc_staking_consumer_events.go | 14 +- x/btcstaking/types/btcstaking.pb.go | 42 ++-- x/btcstaking/types/packet.pb.go | 212 ++++++------------ 10 files changed, 104 insertions(+), 188 deletions(-) diff --git a/proto/babylon/btcstaking/v1/btcstaking.proto b/proto/babylon/btcstaking/v1/btcstaking.proto index e031ef165..d6449e3a6 100644 --- a/proto/babylon/btcstaking/v1/btcstaking.proto +++ b/proto/babylon/btcstaking/v1/btcstaking.proto @@ -32,10 +32,10 @@ message FinalityProvider { // slashed_btc_height indicates the BTC height when // the finality provider is slashed. // if it's 0 then the finality provider is not slashed - uint64 slashed_btc_height = 9; + uint64 slashed_btc_height = 7; // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in the Babylon chain. - string consumer_id = 10; + string consumer_id = 8; } // FinalityProviderWithMeta wraps the FinalityProvider with metadata. diff --git a/proto/babylon/btcstaking/v1/packet.proto b/proto/babylon/btcstaking/v1/packet.proto index 227d2d444..a9732cfd5 100644 --- a/proto/babylon/btcstaking/v1/packet.proto +++ b/proto/babylon/btcstaking/v1/packet.proto @@ -50,14 +50,6 @@ message NewFinalityProvider { string btc_pk_hex = 4; // pop is the proof of possession of babylon_pk and btc_pk ProofOfPossessionBTC pop = 5; - // slashed_babylon_height indicates the Babylon height when - // the finality provider is slashed. - // if it's 0 then the finality provider is not slashed - uint64 slashed_babylon_height = 6; - // slashed_btc_height indicates the BTC height when - // the finality provider is slashed. - // if it's 0 then the finality provider is not slashed - uint64 slashed_btc_height = 7; // consumer_id is the ID of the consumer the finality provider is operating on. // If it's missing / empty, it's assumed the finality provider is operating in Babylon. string consumer_id = 8; diff --git a/test/e2e/bytecode/babylon_contract.wasm b/test/e2e/bytecode/babylon_contract.wasm index 87029557d1153295228aed8ff65e721da98aaa64..62cf1b5b9215f5a680fca9fce58950af0a20c66e 100644 GIT binary patch delta 202404 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%0DKUvg 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 YOj#~6Ac4%}EKvNNGvBLR$|g2X(mli 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

NE@TX_WmMzG*%7H)Yt`+}#-;ZDoYHi*<9NE7N{5 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
    a0dXbx&}Fo)^$ST?vFniZb-+K~n; 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 yh^wtWL`O(;>cu;`9=vCQ1q>dE{C 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 Fjh6^$R}n^-Wfl+`pClQ z2}w8B66=g5qHdxpF{ftx>|+wU6VceBn(AmWnuta~{B<#Y;JV74b$onlVqxNfM5Jn7 z-S*hJ=t|JjoT}M%y|EKd8Sutpm!C5EjrcY9L>E+D^M~j~iMiGDs|9eESJhN4sJbYz zJif7JMGV-8w$-kPEvTxEPJV(oZGQFSmzs)olYh6MEuQ$dfzZ6{gIa)Raa&BqfeVR@0;Y^Y|X9fWx3v- zD+K;yThn_>k7#q{)n3Uuev7iE%91>0ow_E*2Z}i(z74=|RhIcSWt=D%fyO-NZSg(M zWyjv?95c^5xz5{j@-J81y8N_OZ$<8-Pp*i3Y|qM*ez&LDdCu#)<@r5be{g@?<<>NI zFRuS__nos+t6S#Zwz_puYSX`;blaA-ovH25UVhto+j5ON-hcmXJDf*TJJWx2+fL_+ z#$C>nKi>VxpQJ8$=BdVu9(($>i#!w>&$_R_*crzUY$ZHZg#X-4wXMfDxM|=u5^-a% za!*=#No{X+wL3rNRzq6j%cEx`Pn++0-4uu=fy+cqevOC?0NRxXY8jDoBRndQ766kG0HAa$EH4(S< zA1VJx{hC;BSW-@j}(mdCL@t|N8Nfip$4Oohu1ppSNV0i8{IvgQ$A)>H7(hxcjcif@A94Q`v;<<(dz^ zrlTxsoL@|f{F;>qBHWv4FXnnRORLOERYjuBOt_O^Lfjp5=?b;Hwu%OrbD&L4xelw_ z8ISA9t(xtCvK;rU*m=Bnnj`bz_c>6POhytX#oiHhx?}B0ca}Rh?#`yxIi|+=uzM?I z&WtewiLr#UXYyHRONv7;!9EvnER&|j=Un3gUxr2FKh- Nc!=;Q;hp;%{y)l5YK;H@ literal 323715 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%0DvLb;I@DF2Y$z<|1>y~O6uqC7W(w~2#YfMn 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 0 { n += 1 + l + sovPacket(uint64(l)) @@ -2419,44 +2379,6 @@ func (m *NewFinalityProvider) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SlashedBabylonHeight", wireType) - } - m.SlashedBabylonHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPacket - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SlashedBabylonHeight |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SlashedBtcHeight", wireType) - } - m.SlashedBtcHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPacket - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SlashedBtcHeight |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } case 8: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConsumerId", wireType) From a0ec5043431c6f7c1e46de3755c192e299d016e9 Mon Sep 17 00:00:00 2001 From: Gurjot Singh <111540954+gusin13@users.noreply.github.com> Date: Wed, 29 May 2024 13:27:16 -0400 Subject: [PATCH 27/85] tests: Add undelegation and fp voting power test cases (#254) --- test/e2e/btc_staking_integration_e2e_test.go | 182 ++++++++++++++---- test/e2e/bytecode/btc_staking.wasm | Bin 383547 -> 394620 bytes test/e2e/bytecode/version.txt | 2 +- .../chain/queries_btcstaking_contract.go | 131 ++++++++++--- 4 files changed, 256 insertions(+), 59 deletions(-) diff --git a/test/e2e/btc_staking_integration_e2e_test.go b/test/e2e/btc_staking_integration_e2e_test.go index 069601a16..03e12411e 100644 --- a/test/e2e/btc_staking_integration_e2e_test.go +++ b/test/e2e/btc_staking_integration_e2e_test.go @@ -102,7 +102,7 @@ func (s *BTCStakingIntegrationTestSuite) Test2CreateConsumerFinalityProvider() { stakingContractAddr := stakingContracts[0] // query the staking contract for finality providers - var dataFromContract *chain.ConsumerFpResponse + var dataFromContract *chain.ConsumerFpsResponse s.Eventually(func() bool { // try to retrieve expected number of finality providers from the contract dataFromContract, err = czNode.QueryConsumerFps(stakingContractAddr) @@ -123,7 +123,6 @@ func (s *BTCStakingIntegrationTestSuite) Test2CreateConsumerFinalityProvider() { fpFromMap, ok := fpMap[czFp.BtcPkHex] s.True(ok) s.Equal(fpFromMap.BtcPk.MarshalHex(), czFp.BtcPkHex) - //s.Equal(fpFromMap.RegisteredEpoch, czFp.RegisteredEpoch) // TODO: registered epoch doesn't match, investigate s.Equal(fpFromMap.SlashedBabylonHeight, czFp.SlashedBabylonHeight) s.Equal(fpFromMap.SlashedBtcHeight, czFp.SlashedBtcHeight) s.Equal(fpFromMap.ConsumerId, czFp.ChainID) @@ -206,34 +205,133 @@ func (s *BTCStakingIntegrationTestSuite) Test4ActivateDelegation() { stakingContractAddr := stakingContracts[0] // query the staking contract for delegations - var dataFromContract *chain.ConsumerDelegationResponse + var data1FromContract *chain.ConsumerDelegationsResponse s.Eventually(func() bool { // try to retrieve expected number of delegations from the contract - dataFromContract, err = czNode.QueryConsumerDelegations(stakingContractAddr) + data1FromContract, err = czNode.QueryConsumerDelegations(stakingContractAddr) if err != nil { return false } - return len(dataFromContract.ConsumerDelegations) == 1 + return len(data1FromContract.ConsumerDelegations) == 1 }, time.Second*20, time.Second) - s.Equal(activeDel.BtcPk.MarshalHex(), dataFromContract.ConsumerDelegations[0].BtcPkHex) - s.Len(dataFromContract.ConsumerDelegations[0].FpBtcPkList, 2) - s.Equal(activeDel.FpBtcPkList[0].MarshalHex(), dataFromContract.ConsumerDelegations[0].FpBtcPkList[0]) - s.Equal(activeDel.FpBtcPkList[1].MarshalHex(), dataFromContract.ConsumerDelegations[0].FpBtcPkList[1]) - s.Equal(activeDel.StartHeight, dataFromContract.ConsumerDelegations[0].StartHeight) - s.Equal(activeDel.EndHeight, dataFromContract.ConsumerDelegations[0].EndHeight) - s.Equal(activeDel.TotalSat, dataFromContract.ConsumerDelegations[0].TotalSat) - s.Equal(hex.EncodeToString(activeDel.StakingTx), hex.EncodeToString(dataFromContract.ConsumerDelegations[0].StakingTx)) - s.Equal(activeDel.SlashingTx.ToHexStr(), hex.EncodeToString(dataFromContract.ConsumerDelegations[0].SlashingTx)) + s.Empty(data1FromContract.ConsumerDelegations[0].UndelegationInfo.DelegatorUnbondingSig) // assert there is no delegator unbonding sig + s.Equal(activeDel.BtcPk.MarshalHex(), data1FromContract.ConsumerDelegations[0].BtcPkHex) + s.Len(data1FromContract.ConsumerDelegations[0].FpBtcPkList, 2) + s.Equal(activeDel.FpBtcPkList[0].MarshalHex(), data1FromContract.ConsumerDelegations[0].FpBtcPkList[0]) + s.Equal(activeDel.FpBtcPkList[1].MarshalHex(), data1FromContract.ConsumerDelegations[0].FpBtcPkList[1]) + s.Equal(activeDel.StartHeight, data1FromContract.ConsumerDelegations[0].StartHeight) + s.Equal(activeDel.EndHeight, data1FromContract.ConsumerDelegations[0].EndHeight) + s.Equal(activeDel.TotalSat, data1FromContract.ConsumerDelegations[0].TotalSat) + s.Equal(hex.EncodeToString(activeDel.StakingTx), hex.EncodeToString(data1FromContract.ConsumerDelegations[0].StakingTx)) + s.Equal(activeDel.SlashingTx.ToHexStr(), hex.EncodeToString(data1FromContract.ConsumerDelegations[0].SlashingTx)) + + // assert the fp voting power is updated in the staking contract + var data2FromContract *chain.ConsumerFpsByPowerResponse + s.Eventually(func() bool { + data2FromContract, err = czNode.QueryConsumerFpsByPower(stakingContractAddr) + if err != nil { + return false + } + return len(data2FromContract.Fps) == 1 + }, time.Second*20, time.Second) + + czPowerFromNode := s.getFpTotalPowerFromBabylonNode(consumerFp) + s.Equal(czPowerFromNode, data2FromContract.Fps[0].Power) } -// Test5ContractQueries - +// Test5UnbondDelegation - +// 1. Unbond the delegation created in Test3RestakeDelegationToMultipleFPs +// 2. Verify that the unbonded delegation is stored in the smart contract +func (s *BTCStakingIntegrationTestSuite) Test5UnbondDelegation() { + chainA := s.configurer.GetChainConfig(0) + chainA.WaitUntilHeight(1) + nonValidatorNode, err := chainA.GetNodeAtIndex(2) + s.NoError(err) + // wait for a block so that above txs take effect + nonValidatorNode.WaitForNextBlock() + + consumerRegistryList := nonValidatorNode.QueryConsumerRegistryList(&query.PageRequest{Limit: 1}) + consumerId := consumerRegistryList.ConsumerIds[0] + // get the consumer created in Test2 + consumerFp := nonValidatorNode.QueryConsumerFinalityProviders(consumerId)[0] + + activeDelsSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) + s.Len(activeDelsSet, 1) + activeDels := activeDelsSet[0] + s.Len(activeDels.Dels, 1) + activeDelResp := activeDels.Dels[0] + activeDel, err := ParseRespBTCDelToBTCDel(activeDelResp) + s.NoError(err) + s.NotNil(activeDel.CovenantSigs) + + // staking tx hash + stakingMsgTx, err := bbn.NewBTCTxFromBytes(activeDel.StakingTx) + s.NoError(err) + stakingTxHash := stakingMsgTx.TxHash() + + // delegator signs unbonding tx + params := nonValidatorNode.QueryBTCStakingParams() + delUnbondingSig, err := activeDel.SignUnbondingTx(params, net, czDelBtcSk) + s.NoError(err) + + // submit the message for creating BTC undelegation + nonValidatorNode.BTCUndelegate(&stakingTxHash, delUnbondingSig) + // wait for a block so that above txs take effect + nonValidatorNode.WaitForNextBlock() + + // Wait for unbonded delegations to be created + var unbondedDelsResp []*bstypes.BTCDelegationResponse + s.Eventually(func() bool { + unbondedDelsResp = nonValidatorNode.QueryUnbondedDelegations() + return len(unbondedDelsResp) > 0 + }, time.Minute, time.Second*2) + + unbondDel, err := ParseRespBTCDelToBTCDel(unbondedDelsResp[0]) + s.NoError(err) + s.Equal(stakingTxHash, unbondDel.MustGetStakingTxHash()) + stakingTxHashHex := unbondDel.MustGetStakingTxHash().String() + + czNode, err := s.configurer.GetChainConfig(1).GetNodeAtIndex(2) + s.NoError(err) + + stakingContracts, err := czNode.QueryContractsFromId(2) + s.NoError(err) + stakingContractAddr := stakingContracts[0] + + contractDel, err := czNode.QuerySingleConsumerDelegation(stakingContractAddr, stakingTxHashHex) + s.NoError(err) + s.NotNil(contractDel.UndelegationInfo.DelegatorUnbondingSig) // assert delegator unbonding sig exists + s.Equal(unbondDel.BtcPk.MarshalHex(), contractDel.BtcPkHex) + s.Len(contractDel.FpBtcPkList, 2) + s.Equal(unbondDel.FpBtcPkList[0].MarshalHex(), contractDel.FpBtcPkList[0]) + s.Equal(unbondDel.FpBtcPkList[1].MarshalHex(), contractDel.FpBtcPkList[1]) + s.Equal(unbondDel.StartHeight, contractDel.StartHeight) + s.Equal(unbondDel.EndHeight, contractDel.EndHeight) + s.Equal(unbondDel.TotalSat, contractDel.TotalSat) + s.Equal(hex.EncodeToString(unbondDel.StakingTx), hex.EncodeToString(contractDel.StakingTx)) + s.Equal(unbondDel.SlashingTx.ToHexStr(), hex.EncodeToString(contractDel.SlashingTx)) + + // assert the fp voting power is updated in the staking contract + var dataFromContract *chain.ConsumerFpsByPowerResponse + s.Eventually(func() bool { + dataFromContract, err = czNode.QueryConsumerFpsByPower(stakingContractAddr) + if err != nil { + return false + } + return len(dataFromContract.Fps) == 1 + }, time.Second*20, time.Second) + + s.Equal(uint64(0), dataFromContract.Fps[0].Power) // expect the power to be 0 after unbonding +} + +// Test6ContractQueries - // 1. Query all finality providers stored in the staking contract // 2. Query all BTC delegations stored in the staking contract // 3. Query a single finality provider from the staking contract // 4. Query a single BTC delegation from the staking contract // 5. Query BTC delegations of a specific finality provider from the staking contract -func (s *BTCStakingIntegrationTestSuite) Test5ContractQueries() { +func (s *BTCStakingIntegrationTestSuite) Test6ContractQueries() { // 1. Already covered in Test2CreateConsumerFinalityProvider // 2. Already covered in Test4ActivateDelegation @@ -259,38 +357,37 @@ func (s *BTCStakingIntegrationTestSuite) Test5ContractQueries() { s.Equal(consumerFp.SlashedBabylonHeight, contractFP.SlashedBabylonHeight) s.Equal(consumerFp.SlashedBtcHeight, contractFP.SlashedBtcHeight) s.Equal(consumerFp.ConsumerId, contractFP.ChainID) - // TODO: check how to assert registered epoch, it is not present in the response // 4. Query a single BTC delegation from the staking contract - activeDelsSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) - s.Len(activeDelsSet, 1) - activeDels, err := ParseRespsBTCDelToBTCDel(activeDelsSet[0]) - s.NoError(err) - s.NotNil(activeDels) - s.Len(activeDels.Dels, 1) - activeDel := activeDels.Dels[0] - stakingTxHashHex := activeDel.MustGetStakingTxHash().String() + nodeFpDelsSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) + s.Len(nodeFpDelsSet, 1) + nodeFpDels, err := ParseRespsBTCDelToBTCDel(nodeFpDelsSet[0]) + s.NoError(err) + s.NotNil(nodeFpDels) + s.Len(nodeFpDels.Dels, 1) + nodefpDel := nodeFpDels.Dels[0] + stakingTxHashHex := nodefpDel.MustGetStakingTxHash().String() contractDel, err := czNode.QuerySingleConsumerDelegation(stakingContractAddr, stakingTxHashHex) s.NoError(err) - s.Equal(activeDel.BtcPk.MarshalHex(), contractDel.BtcPkHex) + s.Equal(nodefpDel.BtcPk.MarshalHex(), contractDel.BtcPkHex) s.Len(contractDel.FpBtcPkList, 2) - s.Equal(activeDel.FpBtcPkList[0].MarshalHex(), contractDel.FpBtcPkList[0]) - s.Equal(activeDel.FpBtcPkList[1].MarshalHex(), contractDel.FpBtcPkList[1]) - s.Equal(activeDel.StartHeight, contractDel.StartHeight) - s.Equal(activeDel.EndHeight, contractDel.EndHeight) - s.Equal(activeDel.TotalSat, contractDel.TotalSat) - s.Equal(hex.EncodeToString(activeDel.StakingTx), hex.EncodeToString(contractDel.StakingTx)) - s.Equal(activeDel.SlashingTx.ToHexStr(), hex.EncodeToString(contractDel.SlashingTx)) + s.Equal(nodefpDel.FpBtcPkList[0].MarshalHex(), contractDel.FpBtcPkList[0]) + s.Equal(nodefpDel.FpBtcPkList[1].MarshalHex(), contractDel.FpBtcPkList[1]) + s.Equal(nodefpDel.StartHeight, contractDel.StartHeight) + s.Equal(nodefpDel.EndHeight, contractDel.EndHeight) + s.Equal(nodefpDel.TotalSat, contractDel.TotalSat) + s.Equal(hex.EncodeToString(nodefpDel.StakingTx), hex.EncodeToString(contractDel.StakingTx)) + s.Equal(nodefpDel.SlashingTx.ToHexStr(), hex.EncodeToString(contractDel.SlashingTx)) // 5. Query BTC delegations of a specific finality provider from the staking contract contractDelsByFp, err := czNode.QueryConsumerDelegationsByFp(stakingContractAddr, consumerFp.BtcPk.MarshalHex()) s.NoError(err) s.NotNil(contractDelsByFp) s.Len(contractDelsByFp.StakingTxHashes, 1) - s.Equal(activeDel.MustGetStakingTxHash().String(), contractDelsByFp.StakingTxHashes[0]) + s.Equal(nodefpDel.MustGetStakingTxHash().String(), contractDelsByFp.StakingTxHashes[0]) } -// TODO: add test for unbonding/slashing when they are supported in smart contract +// TODO: add test for slashing when its supported in smart contract // helper function: register a random consumer on Babylon and verify it func (s *BTCStakingIntegrationTestSuite) registerVerifyConsumer(babylonNode *chain.NodeConfig, consumerID string) *bsctypes.ConsumerRegister { @@ -656,5 +753,18 @@ func (s *BTCStakingIntegrationTestSuite) submitCovenantSigs(nonValidatorNode *ch activeFps := nonValidatorNode.QueryActiveFinalityProvidersAtHeight(activatedHeight) s.Len(activeFps, 1) s.Equal(activeFps[0].VotingPower, activeDels.VotingPower(currentBtcTip.Height, initialization.BabylonBtcFinalizationPeriod, params.CovenantQuorum)) - s.Equal(activeFps[0].VotingPower, activeDel.VotingPower(currentBtcTip.Height, initialization.BabylonBtcFinalizationPeriod, params.CovenantQuorum)) +} + +// helper function: calculate the total voting power of a given consumer finality provider +func (s *BTCStakingIntegrationTestSuite) getFpTotalPowerFromBabylonNode(consumerFp *bsctypes.FinalityProviderResponse) uint64 { + chainA := s.configurer.GetChainConfig(0) + chainA.WaitUntilHeight(1) + nonValidatorNode, err := chainA.GetNodeAtIndex(2) + s.NoError(err) + + // get all delegations of the consumer finality provider + czDelsSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) + s.Len(czDelsSet, 1) + + return czDelsSet[0].Dels[0].TotalSat } diff --git a/test/e2e/bytecode/btc_staking.wasm b/test/e2e/bytecode/btc_staking.wasm index 22582f191c09e36fd7d0b4f19b7acb6044c44675..ec6310c6557867923a4aff273204c6ed24fa194b 100644 GIT binary patch delta 159265 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
  1. &a1RyYO6FNBX`D!$HqF+Y5TGUl|!Auj7Dx%E-pRF!FAFCv+f2 zjt@`MdXdC&dNEW(swTS`3X*UqIEid}n}e*oKvv6BSS>l2)~<%)WoYTR+T5(G0I8^^ z)eQ(dYnZXR7F7i}prTxKFaeYhkr|Qf&Y$+ulF!T6JLei85sQt&^>Hv9zPj$jpFu*d z3^?htt3KPhCv=0SAXIb@4*W>>ypM_Lbb+)uGcXR-U0E7Y zrzWW$@`nWW+A9&ELEEK6Ibu7O7)J9>Pd-Pz{j_5PRS=05kX(G-yb z+DJsvB9eP6$*FuWjr2=>?v?WW zes?54{Aa&A`N$WLJiUf${Uz;NsE(DYYG(ph0C3HK+tR+hO9cZ}cPbFit7eqn3*{?N z{$_sAeM=&FpBTB2d{9>(F%PZ(thz&&_}@H-Uq~iXopKM$kHYgQxs>;dSC#51ZV=nxA> zKj`D*Pb?$UGt(0=dSnHbU?zN?K-p5+M zobFx)ps^vh3IyIUI{!d+ z+JROLp8=q*sbFP~)|2q!3uFw=Q z6Y;N%25BKDpi)-%wOZqI-4R`F>i?f@o^0)$3)?*0I&H5TKJdiSXlut_mv5ao&&@8~ z@G&svICJYQ^W4hLw=d0euU&bQehaH#u^1FP{lY3xv|b|-`DM*Zejp@bmt@sj8)A1m zEAodw@2to}YsQ)<*4!at$p_q29{Y|CIZf*~q~W{}w)=9;Epa;#SUrRizJ0@TbG}c6O8wrlRLDvt?m|%JO-N~u>h3gQZoJ=xv}c6sc(Nr z;A=LuwR9!l8PP_ThAuVNpyKR*%;EK!*Jr#qcC) zX3V94BcB(DTZ(oyToLqjgpbnGGWG-FS?D~9&LnP%uTxs7*A9rS&g227oJQ-jyN1*rP105)Um20s+`! zJ-lDBdZy$DQ>YuvSseESEc2P+`h*KD>_DAO?1OiSCrGM--%1-{$ac-7>g%0p+3b0F zI(kKtYh^BGw#M7>v!!8-F0^8^2{PU-<)rlIxJLbuTN z`to9Vf+8N|K_K-);uo|>>h-bdMi2;iBjK6e3Z1Qydt=ToE%>P?c`~q65nF3Uo5#|E z)`u3ksZu5|F-VY5kckXFR9ol2BR9RFL!up$WTYD>K%Yw{(yq=dbf`zaGEwmTQeqe> zVDm$4{K!~dR>?64I*tpl3LydC!s*mx+9+2?VnePHw^qNhs~zs=XmBPG1i}^vYjw~@ z%n6NzdDdis?+DqAee}m|_*{S|>&9v|V2c;8rb;Zu9@%m!yZ101(fKPQlI^j=5%4_D zs)4ZXLeFW7^8aeW8lIc88ADu(*^&O5Fo5-tipF~DN&XHD0`t~-SbGSKp5!08iq>Iy zQzYI9f)#-lP0vX1N-bki#g-w653daJNM!g(*Bnw$ZpBo{q|wm|?SsI|zUTn7)~_&v zh1=XiN1A)i(Jp{|!*V59Uy^V}htq^GR57i_Z<8Wh6HJXWF(Sd$lbBd0sB$0(TAt*| zdTdPt=RE@TT=g*xm~F=F1uW^(r}D4_IHSc1;UqCFsJL9``Z-^$_B86zdqmSKjWH~z zsPeE{CEFX=O+5&H(5&0a?~xbdg@8yHF0CW8wh1f(^agwNRgYe{A{gpzlwPXb4Zzne zxMT`?0Z=duY&sdX|G~TaDYH+2=QB0 zmIF^EoO$B`P98FaqT9W-MAOBIs_`B->P;TEDGblQ)(eoJXO_j*Ljr5-j3sU+R?nN3 zxW&se9RlMLK*e z`wEr1?-W4D3`Nr8S*1o7d(8qr$l%gU@HP)iwOEBG$4+EHf}@z+ziAg$(ns|{CJqu~ zD)1P>=P2mZ{nh@VhFCC?*3!QPJ7`tJ!s8r8Ml3W41ZBnYD5*Ufk>O_9EgVYikx5XQ z6l5de%`y+V7hAwJ#&K^K z`jCwiU)5I#UX|^Clo}x^D)>-y|5&N9Wo*-?P5TGl6Zek|>GN~N_iX0#FrWV`Qt7HK zn^mytI{v6=Z1_5Tx0+)^R%!soO4n`Pytzj7*C-ZD%E8YJgWh<# zn5SGR_-dZ8`dN$xV)$WJAGV3zB=->9uZDpO@xaRPe12w53bM9hn7W$}LLtKC zlLw;zG$VO$5VZ6A zqA~wQ9(~({0R})>3s=_xety?P^xsi)#FOC%-g08BJrc$B{;}tuf4;$+QlNzBX>V?+ z3cxTIg#mI zM)skGeey23T*&=`Sqo{25XM?Cer-MXC>Fn;BM4ENR0_t-II1!d-m??TjQj6^y$a}O ztp(%cA;fC|`HY0qC`3iXzvx((yb+H` zRaRp@p`j>Icu%PWv9k`8z~Kc#F{Y0ri-Iz%W3 z!>w2T$W3YBxdFBdOXjMLqEO@IZ^pkuQS;qKNy1JDZROP}LHR3s<&_CbISWOcg><|K z66gIyat~%#Il~s_FpBKR96viZ2QjC!aG?S)k-}w){*Qd}V({~26GM`bTHbUFl(H0LC?d3JO&ZVs1Gf0*<(gBq`@zY zT3Z#8P_3JEK%^*(YcvRix~T=N7=40wc{J>T9U`*Ts{frS<(n?xVc)5wGF0luWGVT0 z%H${}_&EH%6{E;oROT(VyHVO6e&{gohhGs~U?0H)!Dx*w0@EI_W~5PoRYh^nv~Y(Q z8QzuAkctC>_JRD5Acl*@+6WERN?E(to5rAv&`63fL3&LQf`r{VUdL#@fPeFmA3Ro@ zCIL;_$i~eK+gN)xCUp&h-@1uFi%XL5WZ#Hmq?0_gI;}8L^ggd;0hcq2_rs0JZ}|@8 zGibcNG$W}&bAr}TKRBxgf=fR6i~+Krah6Nr`glNxGW@bArQs1j^Cf#1qNY5Zdq4ZU zfL<#t+vyys7YaAdi zJhX^Rd}j5c^}O|*_6VK!>!!TqI#jJ=*ny~lgG*uV<;JhFkh`NbBgmHmUZ3jYFje>j z)#T-AI5H!7lb)J9I1$5>R)!1on|XWY6ey$tkOdkLO|)cFpCFbx@@9gU+cdUBjINrTmE1JGH&y#J#|oY*i8 zKX@r~6&&9eQqu=>tx{*qsrNx_i)?qI<-iNQ8O#-U2v{f()j~#}la@wW5)sperDay< z5a3xc^Dlp;{Yztbqoxn#NYtWaGNbNDnI?$6M3p}0aSX-V-)Y; zCxY3?GE5~Kduby-M+`xXEM_S(2{@9l6Ud64Bz}9E=N~<<6)kmB8|}{0r9ilWpp5Pa z6!UXo{iS2lVoso|G9MS~Zr%a$uvtrnTER&2qBGxzPa9f*@!vsd7)VVWS+|dYA z_RxA4dt{*D0jR}6KDGeU}O6!SHcXUUR`I<`)^^z>_*H!DO zL*2Y%p$}B;NHR8y4!)kCkY7p@7uJ6d)zR?DmyYAn|4%r!PC3jia(i0O&&|&$JhmOV z{H@m9dHEUc-qx26bF!9`%yBbr$+Rv&A<`Ea+6 zy`e81?%v_HwU!*=PM#(|AX9_VY~m|6u0C*tt5b8w5$+Iwe;-m!x7z*k2zTfdQY9kq zp||f5Yb`#~&1Dn)xFg*PHgey2r0sKm;YfEC_(;D*a@NH{&$bSGnY)fUJ730r?x$MQ zR=DHB-Ct>)yTZNF-@%6&Vtsvcg*$D{3$hCA&7}2E2?~)m#zNgP7V%0=6o%dxDyCb{ zE3h7Jov_kv&|aY!4)}OC*XA(`@x00-LE0;G_f~`Gk^kpXB8 zuXYQ`I5=gsn+CBiTI~)~rpIbGhi`we+Hy{QyV||NV~y|=*2k}LYr*=xYYu|-A6eFe zGHG4X#)j8girzA6Cv<-3QEtu@!%c=%x!s_3?on>-!VE`0S!|AC%9#u$H%#L;>!|h3 zquhcyX-~SrL5I7F%Dj)vMlMw!ym_sSZTecbfw7(EzrAfOoAwX4KD*W}&|Lp$t-Br$ zIOk~hdN|;oqun>jjd<5FZgocgvDW3QnUY73fh5nirmu7V&ZB=lke_WWT<>1hm1V$m z-%SEtihywkSq7h2PyUE_o9hbjd6=<>*Rxo6w|>9gjZXYw1(#bDRTZ9Y?Jl{s;oYBW z_4km1P-y)h_TB~Fs;b=kUt_Md_FDVO+OWBAV67!8D0nSE#blD#ykUCMI#y~{23BfT z)|;(uT47OQS_6v;PjsZh!o&mK3X2j?nviIC)Pk}OmK7G28Rh%^J!8(b*4`TsyPW^~ zdEdW&*mJHq#~hbuJkK+p+jzzSt!^YAov_6n=-=7uhE;A6L}$%|lm5cFmV|+aQ{Pza z9p2dgb8NLYM=ni!9=HwbhIDXQX|p=0NtDmRE7xP`4P_4glE_cgXTPV?H}p^z63bcU zU^~abSZTX^UX&Bp4_57h{&iz$_V`cxDC(lxc=} zRmmA%fC64O+ z-Y<8jxnumhUk>Ac#((PNZeOd<;(SoxiO+k+Kk#z5PousiaFk@ozHqd=+&s`mppvG< z!w4URwEmn8q_sY*nTq!75UgeEX|1DjCd^FGV#I|^i$QB?LK}1j;URho)k_j>5gry) z6|;w;soBmjwUYm0v-{-bVJNAxyeY(O@C77LnGgYrj%wy^7B5*;#0pC1t4BhYS@=F2 zMAb%Jf;o?lwsDy%Cn-!q>9!%@gM@UVU#GbU$i$v0U|ukS#*2XmrlsM5 z;a0vHd0=!a7mj&g_*Ja?bXuBxIxTgd4prgP!A$_k1gD$$u*5pETG1bjF`6aZyW%ZX zx`0))F$y$dhQ*A&%s4eOigIi`YI1fKZ}@%+!%v5$8*G)Db*qUvFcxp-+L+CHNLg5* zjNgF+38{kw1!(=ptx>^${%AMicyLfu3Cq<=Ls$*7Qjyv}1H=?FZUaAqyWkZm69`xH z7Nm^1;7>c2wD7EJ=26UoT_XMbyt!4PW#s&1!u18IM|H7%X|kZJu27SmNR(T|##TfhDkh40>LGdfVkYU3 z1D+9+haS*5osc}Bt&lwQRH3qll!ip9BJz+^e10*jy!QhK3Yc_={>t1QKjc105x|5@sxPQREzHJk(v}^e^HH4uVX&x0rnZ@m* zKGIe75vtpN6o|^f#rV7EGSzCtsUsA+CIAzuN&cRAiof=Fw|C_M2_NN1+*dg^7umO(TdNm`p=Wyubg|UUwx`O(>>}-bKJ4TzcMEF zvp(rxH^;pydf-$3Kj!fAG2eBXd*4gm77o zr@7wYmxLYa>PRkLpfkvdwDFtM+#92tKjT00Z*Gjg=#}o6=(f-JRj+jS)8JL7yM^u@ ze)t)#;x6^m&u|Mc2dq7V;PU_Szdpn5<=*Ls{)?;jzAKC$Oo^1#pTC4`u@p?4TY9&j z^Dk&OoBWTz=;nC;D)$>yoDZMrUR_E;Sq*&Rg+4ydO@{~ClASF*y6WJwh~@?+@vGfy zN{@bq{^m+gf{aKaoz8D~v)jvm|J8(+Kjz21#vNCDA}Qg&_D1)zRbPG$8X2#i_*eHM z>bUD{_lDxv7bjz;#5{lX8{7o{`g7bgf6<#yI4`sJs2)>9vL6o!4zdG74u^LjNp zbn|8Y4R3HCc8{(4 zVvFXB>>GEVO}F1XkC5c8>UJRo*M@m+3#Y9wew!QZ@4paa{*7L@r?1a>D+Yq+{DEkRXUnBw{-8IxS-y6WyD%A& zKjdPDPK^Dle zsg|SzvUw+j7aG@t@2f=GupT_D2l>*LRiAq=VnO%T0j+KGcl|FcO+WG7?{n{jmp$F* zCi@ldbNh&OYx?s-CXCobdKd{>Trw{oQ}9ddmke`S??6?pqU< zQg@y4<8)re@5G_1(2MI1?tYnnYo9CjZ;h!RafLf%^gE?p%ps3@PEr*2Bnq9HIjI!d zZ^b!o?<0TB`&@;OeshI;DNO78mt*#5?#-Fe!2xu6i$^Wp!m@0rAjwQVHZD`3OkF2Q z0l~lKpSjAN-;OIjl9?_GyFcfH?x1Mvo&FOabf;7O&p+sH0xv)QAy;*e`&&NbZfvCn zR*H){Tm0r%xas~AAI7o+OS5Or&$~EvXB)m3PtbsQ*ig$(y`Rpg$@6-EP*QNJI`FCFLK0cbk+BvlH^lIU(uT86ZKj~&ibmR5j^@>lKWW+=R zuM4#I^g>wbwcaf}karMLy7lTTy*s8(a@PqSa&lyc^t!>HS}BaLbtNfB!US|EO>Kj5`_ZKkGB@10cd3Ud}yf&1YceXy1&amu$0Kocl)hNwfL`M z@juD|o(VU(i5*5V;)Br4s#9-*g$$L&HQ@pzv_}QF(?7Dz1fm1Jdg4@ zXR_t%&M(1Yp7THdk~{eT*?T(?HGcI0SXP_Pl6U3$-WPWB=49H7|ERaEn7z;aGPda7 z`5KoTWedK0jT=_{qoiNR5K!f{GYtU3Qy^5qhCgdhThq6j z^tM}Xu_vTEa@y0kThyx#-Xde0`WZh}Z!1%2e872UY7DN!6mPzYk2*`|4QcmBo|UWk z_4gpReCI2;vL5k2{)#)LzT1!kcKnRxEVqyN*DZIi3eU@^jo943xtu+ikND@7yA#86 znes|M^mA@@lX`I-NV06Zu*ysvG_R7&BHxM|s>Jm-Q{#jFj++r99`xI9W;J@m&-^O; z{Wkbde$`zXJs0@{PtHy1N(J;}vt9f(ddObDuen!F43DtSUO6Tj-q>vt%*^sxxY94X;k`ZcWD^o!x!>)-n6E8IRB*$VfC#+FTOWbC}f9l?teZgFQ1-m=*d z_I<*yJL-qG$Q>W3e^yodYahME9a{&Y9_;sZch=NLXgtZS1y*o7Iacx^l4%trkS9la zF2U5;s&I&}yLW?T``+s0WI6s;Hg%ncMM^5Cyifn@RyT2|P*p^kkAL{V#8ICyovqHkTwjTh&+jJz7ie_ouEjpTh@MrgJ_@&mZxRt#n5Nfbwm@ zpAyAsr%t-fof!Nn_>)WVFV$+mKKv`8-V!|ESv|)a!%#p9k-7mjkbp??kctfb;LV)4d&B z{`sBm?1>+6+IX>|4}kQ>b*vqL*>AkdUCku_<}Twbop;-1e=b9Qr^s^`uY+R6K>V3^ zyQwFM+5uD`=5-&W>J|}mxy~LGKi+=3+~;M?w>hei71vbM#^yU75s>fK-;F%gZ-d^E z+FwF>J_})GmD3LCN%(oQ0DNJjrM9mHn$i9 zO%h)I&TspsL9S~}vlq`%hupcJkMXWhTVX_^P5+4Qo%RYxPoD5!akRXp~}07 z)pJa7nSNzKry_nwWNvT zEA-Vm{9CXV$TOaTiPe325lIu`iax7>*RH&{v? zawXW6f~7mMVG$^8NpGIawj*yjA3vTQ<{$bNmXZ~B$#>pCL*MZ`zJ<$Tz1fpoyqXvB zu+oG6&~Llb+qc$>eb-<6ZMR>JVmW{Dx83me>+eo$2(J#{6u0Bag3Wkm^|M0#)7QFq%#J5jiR`m0eyY0?OP2zWO6&b6*1Ab!f-#KQ34LAmv$XgF ze&brVFD}U)Yu%LM%6q7EFDgCgJMP#qkMqk+@v|es;i&I^e$Ld@FZ>P?!Fqq^cW}!; z=zsAYR~<@pLI(hc6ad|KqxL8B{;0>ZWBp;@b#sQT{l2QgoF9LmYYu9R{N?w$-mwgp zgjkuloS5G-GQVN{kJoRYWQSFN#Oq<$Z z&kv>s^Jg#R1*$y&Wc^@*^mDX+;@x)f2L0SyKU@6rbvSFo*Zc7`lAeo~ujhS9?@@4F ze3yQ9>nC#sx^W)7KZ1M+?N9R}jPwWof_3iTL#e>#Z->69>I-qBrtu^LUb!LtFtj{| ztTPqOVz4(h0rzXZ^FG%*F`d(%xtbs0dNRB74F!rkc)*{0pF!rGT#9Q6DPeBD?w8)@ z4piO@N?5k*z?ih*NRLu>##D|<9$6UVPB@xaI>lgVzVe^$67zZ!Oy@uQfbp?!K7h~t zq5p*5pYz<0@Z-Mc+PI(eJ-1(v8cV|0shPE)L@jUno|!8aaCv$n4C?FnNJ zb71Mgry4mqGh=_q(x^>4YJb4Jh}m$|rKea*6@>Pe14;O<{oAl^O=fB5A+m zoFU`{zLP#zh}d&})_OO5xV?%RufP#r&0X)R2h*^+oWN-BL0#aZ{siRjUXKazIRA_F ztaZ=%;s%S4I(|blWInRNAhUdfn@Evlum68 zG}Xs{VAzo42}q%)JOMxcfn~gSK74iXLv9$wkHJ@EBnn*p#p~Tz`QO9%gj?4=9UxUEHLwrzcb-(sz zydrlh0>+houx4LvAT zi@xGtvBk}DxA>240l_!=o40_2kN5|+xZa_rN}>xB9C8cb%9bATe-5w5{saN|L4U$e z+?AuG2q!s6D%n&Cb|}G5{)8GI^esPi@55-bNDfo$qh)cCn$U{>hF`e7P(>3>h&iplYD!*$IX+!e zR{X-fWv6YNb7t<4k#{<+S43fe3wK%!PFRWf>NNkvFWt-$>j^0}sT?A7@zz_zFMr_E zZl7Y`YJOp(@vnW_jYB87RSbwbw$;=bF?FcLsY5FD6uF(WKj85wcZ98r~S$;cc1k?{T0&h&wSUf z-GR}PKlr15jfC?Bf8RFvW9k!+hc$cohe0wce+_zV_nUqVf86f>_-i*Sf1_o&nfV*{ zl4%ME5b#}`pBvxu`zCM0^2QIjc*9O(MPn(7s&Bj7*FW$ZSDdhnVs*Pd4&ECZpSk#k z-~0WZapQdVHkR7Y`gj|*oS*p%wz>TW^#8DW|3@YL51oR~-Pc?p4cycG`*v%_YyJx;Lef( zsPtL?&FyaQdSH7@I#!tQZ@0UBPFMt3kXH`RfL&Ta7B)i?$j)#6-BaiM6%z(Cl zX*4)>?(bb~2ys%7qT(FR=7P`V_ijd&TtGSHE`UNwVU^Q~?Pr;9hT-9&Vat_2;SZJ> z4L?Z_=Zd%b|M-K8E5@jScY0d*(JX-tbDd0?qyFelt()ug;F3RLd3wZu<&SP$unfwt zpy2Y2e{?T><5n!q@wh;5l9M;{vZ$$$ejH9(l{CzgaSDSh#7!TVV66{`MQ{FqYG489 zuzf}15mAZ$ZO@W;Z=?V4v+mGhQo(Hht!Lf8boPt)_7ndE5fTFZCwID5n_{}!1d}TU zJxs3GxpPPO`~HLp=0X4DpWGBon5?)42eaB@>U++;GJwF0w2%19pL5gp3l>WTrCmkX zDX|@rehaH5JgX(xK~u;)@tm7;-p&R}tk+HlYMX2nLn4-y51?Y_bpy7NlMJ@R&eUu0 z*ZkQHmxJuz|Lh(lBiy@oxD(TaZ};wS(+_-J3+^WNp~B5e>+~a7gYA}_9I#Ql)wwe5 zrK9}06QYVg!4Z@4{ z{^z{l67qvu3k6%EXL|{pe!)`aR zxGe<8NAt^H)5@>}M8Fx2{;WSQQTUrSXd%Qu;xB8BUO5$i7Amr(PR&gh*Ti@gRvU+s4I zn>(ZZS@s_7jP`S%_qndyYTIrb!F^H+V22)H}hk%g{j3!#3B6O!Ndt;xQlnmnp%ukH@?cSR~Ii6E>Ok(%3(u{ z0vhNXDWbYL!*>sl#z)`zls{P4hrZ}f8y>x?7Y`^eiCI*_cvjo?R45_b&3}7%bUU!P zd_*)Zy60NIctrFHe*X7}=!6zFOCh28X(OXkUYia@j3rJY#}V8bLyXk(>pxcyz=-07 z{0LH99VQy0!Qu}{u8D+~kALI0jEuf#`|;|%V+vL?1)uTvjEct6p(jQ~N&xz`anbNY zQKIG92pKOr>NdU(s3b9`lsP&iF$#4Mbip8AH9C6ZP@zYs86xt!qGhjoU^FBm+XxMk ziIa!a45_U(1zzFm#j4r8+QJ455s$R07i$;-!_1m+Qx3SfH5$(!lRr z{2;#FO*ipw3RI-akv zE}@WG@I!*{Y(w%#@yw_^~->!N!y$g*ZXq zCOSni>leT*X;<3P*AKizh}swWqUHQKVR& zSnc7Nr?cFWVx5R{as(mj$fXjRvBfir*BKrCmPV&$?vGeLBdHo{dRw{qkdZq{b!awY*0KwLT2DBj465nPvWJwWfdas-4j ziF2Y?6#tnk2T;a8^zq)&uv$Ug<=Bxa0$eKx8R@z=xvj{BAa72Wj_4z4f+4})0HMTl zM5QF&U^RVLuhqfZ)j_VSt?wZ*g(@$^Rgy=br;~<8Cnb#y`3$Y)TBQrHhOofmM9HQuy2xHu=$7&AEp-^Je;kx8aT7+4ZJc-q8zSkvTW)Yq0x0) zZNQl`G-|9E`k$dk^SbgGHk&!{xj>*^{M0(~7dRSkm9wJ|-}zZk*OG@b-FCEI9C5+b zU^`g`RnpyDiKwKze-(Tgv%87z;$a{U3|#R?`$SV}t(R20G%H;>7iIDiinP0m0fvYP z22xNeV4>+!C1=n%04xngb4t~)Hak69YzGM)ev=MhM?I=nU}LRALwaB&?Osr4pf-KA zavj|Td7aKeiXyvZh|EEy+HI+mqfADscz6Ar&{IJVv@s3UCZ-#u@8;RhyDKX*vT6u9 zv4ca^XFEbe35{p1;ZV?|L^9i`f-`1kX14`v1hKQF zIik*Fp7>p?9?pE$&jp=PK3oS^S^<%gaDqK2K$rpN1AYr`>#~)@cwLL11`iJlTNJi( zOO8U0rpQ3%Yyo_d=!7sl4P$nOzQdc13&b#^ICn`p$;qKj>C_2!hJ{%sj}eBDwiMl$ zrRYwIbaI|?@Pru0)XbMWuAh;ULM10RY9L)4pjIjB?clrzV?-T()}&}mEz!i6VgR-c z1YtH(B%l^f#>|Ff1pRxI_O;QDvcAx5h^kXpK*aCxx!|b-e!e5S#l2a@AI7CiFX?FK zK$iiZ?5Ze`vw1j%JsxTI;(;IQcj#_22+1A6CulN;yXw;tflz?u_zNseI+87lWleBA zG;vG>r=6np2lUG_U9e?|+)A2Ap_qu9H?k1$P!U84#&B3l%fQ~*`~En0y0IOe?-WB*K z4zE+<5)QM_Dh`YE^%0m5$#^2*E#!Ow@yf`~ry8$T!~be(euIcJR60CaxUbeSpVh*> z4^Qbx{eRy!h4bgSb*A5N<3m~2S-9suw$66ze6=CLp4CV5YFN!&VPeD7OrJHU{jts# zaTk`x66>AQLf$zl9>%$2Y~us8m?YBgpOp|Hj+wJToIc!&OwIf$sh}%-l(a0KFr=}z z0*jOlq}XF9)fU#)97o)?Rl5DSsnLX@BH*=P`lF{tM>c+4Jry?5-qQB;VXz#b`Y5%x4Eo#Z&Wyu+m#8WOtSXH;}G{dQx`<&AM+svyTrc(zj>MW;tP1+6ZaixYeX$|_iyPZ9G zNRv)v!B@b=KXzcW_v=(~$D#Eupy1MlKm&K#(3M+Dv%lI^OMwPBwQy=?MOr&cm*668 zfycMdzj9Vszb{Wa{g&43URb|d@(4?1=eM-Ep2PN)oGIaIf?J-+L8aQnS z)`g|baGI$#oJJXvyvWhhd`qv}AeunCGKI{W(p8YW7$ioA!64rL+k3v!5@bd@TLy=m zNI(I1I$LI}f8yY1uT$#JFkZ_k7$XCcFiSF^?NX%s`v!<$cfX`M!HB!fq(Px(SSU-W zH0Vz`B-*FaNk7NLPpY*X$3@y9ykV3n0e$iijv8B!yjUv58sB=NF?6Ji3CEA;DrG&~ zl&ehCbz_c`TC}6ps!ck)vuaHi4d>D7GO*iA^WYBkwQ$XxIz z9vbak)6>B;m`s+Uf=dY^k^~Z>Qf5F1%&=QDcvnJ$D@B9Y#$}=@o`LjdqqEHz zp$l+(6}_y^Z?)D8O)7X#odE4=iN}DhC|OPdO3{D*fM~?I_5nwoolx(aTpPs%9;B3F z$l8(!P%f&D3S>EqkBr}3kTjgB^zg{C)6<=|z!fm-U0jiF(<8zhX++uLXT22ZahRA$ z5R2Kdpyi0}p!N-u;5#Z1rCdd7OrtwDFqw1ImKGzMUCwg1AaXwAffl17@TXxW=UWcL z^y{nGB4DH5gh?3S{em%_M6Quqw(V zAzcPV7L|$lZe-ha#SKK zB1$thtxJNMQO$9-Gnp~Kmw@^@Tzr^>IF<|>Qy@}EvL$GCW6L8Fp=xZ5L5JPg1Y%UC zN5e`3%lmt#N9ETdxxyB#DkJVSR?~5vrU~Dlt5gJIcO@a;4i$dy3F`( zXu~ujmA3S>_hqf;m^3(LN~hXu9A(RAL&dq8;>dcAfgWw+gC%EXj>Pqppf(wR^kbrG zbz-4rBpXN@CA3GsS*Z;tPzqbhIT`I?vux-n_wc-hStR!GU9j0=d&kQe2FR1GOcETS zk6N+x0~TndVq=9Vd z6g>pyhv<42s!4nKkTOm(G8<;fwMik@3OLG)=#nq`kzV!v(*>iSFY&>0P?<{sH4*g z^-;N;9D~TRYR4d=r7fXx5!K=x?Q|j~(nd?Yg+w?=TQHu`Z-!_Hr4ZYj8mM&!qGC*T z+9D&jW*E9P13fGT2AuzFvXBWf(*Ep-Mhe?U6t<7(t9?XYv3Hrwqd6`Gy*gzT(AoiY zcIv-5Ga5dV(nMnhkPPauqSSk|Y{?%P5OS!Umula$9-g zG1`Tda3Z`@{_>;H#+T=+m?MmdgZpd5|AbT{8+=1brs(~^%)`0zw8ZQszC2kBWQORH z#YBP`6j(ad0BXd>qXRSdsYW5zfa%~u_#XO2$nE2T-333ZA`D96>A(gJh$_Tu zIQBs*t@aH{lU3&q3kWcy&TCpkA`IomWV+I!7zmaoAXt*DK8vMv%6M=5DAC>ratoN5 zK`2)~iW^7*)$7y0W zVi^to{pvMAF$(&znKX17XEZDQUmc)bQ;8r!0{0pQlWjqLFkn36;$KVKPAvpdvWChZ&uU|!_hp$`m#!+OqYU&N9Ey6`@C>p7xjX7pn zvSWG)04mKvGX=9l<{Q4mqG;m)Zj&Lk$`PuLdFW-P$D1wAjNSGaVMO|R{CNa07F-QI zQ#&H_S@J%^3!oIq)xDx~2^zNg_gfd3pT(-6xgj0#9hHxm9%c-#Z8OFUGA)__TZ(K6 z2k*_U44=!GP$bN+47KquKwM4i!_f3~FUN4Q(Dn?9fKwinN(>798WJQ1vjK6qnuU{? z<6}q(Ry%`J6sj|CqH8m53XL+|Ru<6(OLk{vFTp{fjS1c#9Ps|2MAn*K89&?*-?|TM zZ6P%hG&YT6{OD*R3mi;Y+a`9(l+}xRALybcvW4!5SVE6QriSs*uwguyZt#N>Zb!Jv z@R7{~@U?QxKm)#HQ)ad@;pxhplF( z!Xac947tW=oX9Czp~FCtyu)T{5iEPD{YQ?C_8nKRP!0*EkmHPmCT(WH_Y04WDz!!t z_=iXB6Qb!4qu;`NU!`zX5bDt|8Aw(+BoY+&l3AXvHuv2`VPs zYSl0;Mo#AE{jZLTx@w!?rjfh@NuoX0UVDOPp#B6$Hf8V%q)%WzxCN$XZLNk{mOz_I zF(w~GtiS6eVXE2S=jL|4$2NTRrnx|Ct@Xpl*oj_I?CfI|NQaMAvGoK zGTzN>b%l-LC{7kHBkQ0ZnsLwq(gT(Wh)-vmCesuUO&t*kbaGo%VGsff;zXAMn?x&# z-qe>+88H#!Vl@Rtbg97h;OY=?u%I*GpeiNHq7XXe+;TEkWJl|| z88t~LGgd%KU+s9OHzF>vKDx$Hfnni7iwjE;?yRJJ^6b&%=E#<_(Eihr7MIC@k&*pP zt&>tmt+Qy+I??Pke!*1iP?jjZi^0QzfnL0tTT~6*uH=@v)9ngwyTa{qZozOpwHREx zMd->dVQLio5qyVq)%Jd<4Or_8OU8H6m6gMF`&T zHRea-H{=k~ zrhbcB=(zAx(*=Zc+6utZ+b_Z$Q+&!k>mj{q5SpnB%|U3g+mp5%Lr#0?e*tWE@+oG4 zXZ}4WM@L3|pYW?sj$Sn?32?KbA;9f^3vl!MoD%I_w1BvFg5gd-C7MVwoy$&%UbFXV zg{J3~$uq;rHv|WkB!B3J;D0#2PQ1xoclL>g`-4x7F0DO;*gK}yqEM@C5g8*a)Cz41 zD|;GX)h3(@0ak71(jveru$}a8xecp~3&B=x5}EkKrSsON1+h)R?#V>9mD?s~*OSS$ zTyA4|-s(8ziwd50I4XIw%~g28qEEhdU3WP75GQB*qDn=-A)gV{he@6Z=Qr$Nq^?^n zR0};&tlZ+J+8RfGgWpK5Ip$D(F7u`pQSr~2gQdA;g8bdad$>Rtqcu>v!>MLAq$*U% zoQ65SaZa>vO(oO$Z^TuEURj0|tEHmFH^V=(B?IC$g*1Te*%pPw-r-UZ(kWQmvn|zj zL=|D{)Xa_+>0xmw87#ud`_3A?GKzoD5^(7oUZ*kLfTNr zefKM)VJ}}|qX{yP8eY=EQVv1`^G2Kv-nW*zk0Wf!*14u3RHap+D#QKyk4O0$E}CE!iXEKD0^u>-`8)ZU8+#>75r zOe_|sNT!3w?ZGKBpPs6Z>f6=o1lRfMBlZb&nX&`l#)6N?%hZhSArA?4DpCboQllAg zAV0TOuj^SkYXWd-+SDYR_4!nZ%xIZOx**(XPdp?{z99j~VDbv+Wyk?e$*~ES=;st+ zH%7skJ2S%qQjBYBZilg0HW1s{QH;N*2Vp~>>^kuZPAAjpYU}k}J3C}?pVv z{g<)8(t1_wWR}Y78g*H88heaZfTlWebY%h81g@e?O;Hh~c11M-x69)R{m>P`^GRLD zP0w!9wIxP2hZCXiY~we-^5xz+{MyW!vI7L(&hcerf73bQ`E(xE-jW{tMnt7Oc~Ue6 zWmIbfUWFwizMePQ&tBz7nGop`vup8LHFt%5^k|D6qMQL=S+p`6TBc|Iq|Rlm`~nS4 zz-mndsucxMePTnpO>b8f>h>U9Hj|^(g-VUoxKjZ~$`eYTb{*pd_O;A$qa*k8tI^Y2 z`4z=iT5Sn`h}XA}8T^u}BO39D%$FM7x=Xh(@xV*IqF*qRD+)(sZqa>>Zd_HE9<8(& zxIwWZt>9imUuMr>)v%A{de%p~WN0$f?=!NL$cd9wzCW=yqwj)34Y6Ybt&m4snimh& zG(CVPA-M3MmKK2{0lr2Ni3Q7)mAYfHqB6yw#Ms2GkYQTp3Q&`TItXlc0bH37SL=%S zv{DhY1a-;#6$1{jM2e++PW7Z_kXl;TJ}Isvwl;9x7;=iY;M7VK9NQ!pLi6ER%rbOF zfCt|nm>Dq5^7w~&wipVgIcKI3&A1|Gd*{@G45Qg2rZAzPnHKzEOGJAT0022BRt%J) ze1ijRYjBO?Y=tn$;ypFfQzB{fr%;pNt*+U3%x=BM&? zW?$q{gmfcj@0k5|`Lc(gG9?iqxWLK*=4KV9B?1(1#@uzciXJ?48=``LdEKgav>T|Lk*dvQ-Wm=7u zcj|HC|6fl(Qdi3cHA4^9s|Uu)WvF(?-X-Sx?tQjVdZxf0_%n?7)u9TU^Rwfoq?4rLQl+>F0s+JHm|G2c)3`4 zE>5#mX^$Re(Ohz5xos6SPQC=@Bv7uAEGbUj8aO#ssip$|Wx#I)s6GlPoQ0EWL`0cJ zRctPgv{`fsq-JMFFD;+~!O1)AkQoM$*ItznvM5?yE}De+mgx$oT^byBW?~b&OdFf6 zkpclzQGoz>f`6?6fyA?fQq2Z1)#awu;9Q~7zNC>ItP@PU`L4#@gl)q(a@u>EFrGU; z0cuiZ{+O_G(im1smY`5AOHiX)spj3L-WvU?6AL*9*0_xrzeZ-gVgc(b#Ewpw4O$>a zBxryp$A zC|IM^J$bbDsq?yWxlG2P{2?#h!MY+6+1O(1(`4$Y_Rj8m|CLN}ui46N5XiEKbvF_C zOL)1!{6fXVS=I1z8aDFdo28s_VT23wN%(=*=CV5isfQjRHZhat660xaLhX>EeI#={ zBjoHEX*h&79z*O0OTNW11jC5dyC$35ah;=C?1H?>P9zNh!~$TwVj7HVa&}>%VmxPo zaTue)_J)v{IvS1r0kg?sd%d-?g8f2^TA#uE6jHsMFme+_DoA18vb`7O4ld6>U(g{W z(7nQ0MNA-#oRA(RlWXKOJbd=0F~7=76+Gk)5`Zl&|lHA$Q> z(Rb06X2B96w^zrP$I(K0d@_BZGXWJ6%bMms>D{=bsgwaaoP0h)}%wGO@lp>N|9a3ha#OVgupKZ)RL3MCsp~v z1}kmWo3Cw%QiJs7vX40i!xZN?5}Xv{*ye4jQv@{ z4H~L(o@Ei3>{d0VKKu;1Ce?VW>Ol07ejTUs)Kj@so-$=Q?E*N{q#7Hqgce^|HO|K^ z>#i85u{LLBkz#H=lTotVIl z4ugfe78o`?F+JS$ay~F3q_pYf2zDDqlq|FSi(WZ)dUj_Td3T)*6a9NT8hNwc%{CKM zzf|oG>UOP3-yW>Ui%&ku+0!O{HEH89lxRBpi&n)4YT`9COcUayd`EF=GN|{PhNK~z zrY^fdz5D+l^_*koS=@H6o`*?I)beeRU8>52%#@i7rVpmOiL(cEHRS`w~2_YD5rL|XR43ut=nQk>~&U+ z2c1Aohn;u{kJ?K$+nAy7-u^=Lx}1b)>z2gv$yvgFC-7a95IsRcw3X1}ZgSj&)F0Mc z<`&5hiRh(BjEE2uh}4kFTm9vuaj~Tpk7|4Joe)TzY~0K0;$~+MhpyIaVFYBB3CW5dV^fG9ETFqK%jt_?6O>yd^x6&rmO%z zNZKqjggC7kkq@e@$CaFAP?c_cqr&rT$GzD{F~t+)q8;}V!S$U61?u4x==Ufe91Zw9 zk^h6W^#%oZQ{|$71B}yNrnA*4w)3$5ca#^XS# z%TGCRpQKSSzkI{BVAzQi0hco=!mt)8LXNW>G$XOWBok=Mtgi?NX4^Nei8I-*wU)R| zj5C`GDY7gXmluI>nq9nF&V`V@4A`5&6CisS_a{#qAZ92VIOJ&qhdd=K&kqygKmXQfR4o_H$}&3UTwb26&9ml~ zL7I6``#utw_BBo970E>Q*-V&7%f1o_+BT$^t0*7~8{|ML+dQJkm2?K5&1zNP+>dE* zBap^&H|&1qEbtDsy?N$3gJxpkh6!9do2SM!GEEJkSj|&oli4(vsf4^IlS#lF?rMt} zXqq3)S4H8`K;Eml?=p+CnIZB6tl;94^sfe3;$*sQQf=0DF?-vZpvW1sMg!XfO@!=L zSb=gMS)^ATr?CYz;k4Ge0fIJeZWgeCG-A5OKuJ3huO(?iDllTRjGzE>n^;C<%2V6M zh$&s7EsJII)!|6e~5?+^5=+3f37%Y(z2y7m+dk-5PB=+a~}mLci)Yu1<$xMjN)D zKX_@>8+3}GVTD9KFiouo%dbRdXP{?5 z8?Z$&h*ig<0wf@_(Mixszy}U^bK%Pauq0(oGJ$-_y&PS`@$U;f#(_`~KyVw%wn;cte+i&A<|3@0}v zYuX}_Y_s8{F1plM0~*pwKmXGUSV-7X$fl9J{DRQg-|Bt(*Il}w{sxhSNObclFANjy zJKqQ7B^?u&v(OA^yf3o4D zB_0;+9-Fmj4YP&kE~#TQPZI8T&#gMB~Kys@3|>NA?N9&ZaF-e)y-Djp4mb+CG&S=&E^k$ z{d>(H2HnnP==L*zq|k+qObTwAQkg#n&grhEbkEEm$rR80CzwChH$i>_bEbJ*Z{+kM z%^yi0XWJ&c{|C$;*vLFSKjpo+{N=X~IwWd6W#(OA~|MfBot?Z5o*#{412 zwBi@42(ACW`C~VsEPsP6(b66QG}lZBxKKBLtZDG-VE(9Gm6|`KIk);}d~SHH9pzQR zNFqzDwn~C5ahEZDO9IStwK~m)EZ%DT6}Ge@ZG%mKwsHp%=9Z{hL<_J;b9A$I1uGG% zb+I;ipbAXUN=qNGo4-1I1|Lr{JuagIX%5yeML}^}7MLHhL@3RgsuUBg^){*1>?cI= z%c75EvXb}Ld@vf>Lu3zYCw`!`qtxN=_+T`ymY2AdG%DRPO;?QOM>bArhYY%jY33Po zEgiX({3?Oe;Wy2<*cOY7ZP#%0uX#g-1Nqay^su3V0yQE{B~aLY4ypKQ33H;GC}@kn zqv~`&2P>%jEDC5(*0`OtoNwC7ksSJ5ZwO^L6=`Z@=4q-p$Rp{%>+biUwRe<)xd6~; zn}no^NwRjN4hxC(h?k+$0haweID){Urimpds6XSw(TG|o9IL*daa-oPW_!uNS=zY; zAd*X#veX#0$`>GFC9||`^0~SF+pj&+NG=1HGL`i z+B%4t*Bp7OR56=WvU~3Yp?3;5C7&5V5o8exQ4wMLPwJznyC_=ghN~A5ZfX->-|^OLn=77l{Nm{vq(#Sl^ z4TOjSF_9X`q?jNdy{P?i*;+=?J?5x_&+Tl#9N4-G=^8lom#!P->W;r;Yn^dwc6(d* zjWN^j&1}Q+3qBsT*Ud^>8u^8H9cfeCH+6$qeTf?kwgo1w=Mj{<$(c>*`H%0$rsR*h zhW)yKPehIKEvMFp`*4bAF4k#lneF$2i|)>(6f8=kvF{HsDXj^$`X{dWpD`)zE|f+l zrGIWL%|FPbq`cFbiqxdETGNo2lx_z#_S~ejqG?iZIXs!wdbVmTg|ZUvF1%)0GJjvY z_8(Tb{XGWYzX=#F>F(c^EwiuX00C5;gPcQ&o+YmMs0fMsF6n0bl96o&o z@X0Kc`mn6p#D`_+FO^?L^2U5uRW=z_PBn-DeQA>sTX$&=4WA9?iI&UzD;&nBT!`ki zeHBWqVbQ!6YVVYdCyAKXk*}&;)xIa#nv@#eWDMC(OqvRoC1nMX%2q_AkZmYd)_3bz z67zkLt%`Yq4V8HI95^p~k#eHM_euT4G5H6m#o68`<# zh?HR`c-?}NYkDd#1pZnXhS>W%48R1XOU8jD>^CvIqH-~QHe|1m0%u+*?Uj&vK3D-5 zh}A`zLk6ibr~+vc4{0MN>sCXi4QfqPm(|1tqz-l9T{|$dgv1td;Y;-+eS~@T<0w&A zqWIr17q?8!U;y~D^cY1HHTn6q8$%NM9`u=y(We#BXrN>F63S35jYMF3Q{B-|S3g^_lPshn%9pp%u=5^>x?1ZJ!3Gwz}gbR zLjUI(gYkvhKZY?7FZ7}rgVBAhLHH?24&oHp5O*e-{k@FA_yR72c#jxEGee+5;t@*J zobm-_Xbybgus!4pf#|iL??v#1otP2o#J&sZsY!TBied|dF9f#0el{gtN}_pleBbQ|LI64odx*K=&RnfqwuGP}l=9!;6*<{!zj~jacw>RRIU~ zSUMQ6`0tVjARO$L2h;{;d8!POXz12p>EJ~P2hBWy4jB(%4HveX>rwJ)U;;YLRjyA% z-^7-iae&pNtu6>2aOAg5-X3H0Lu*}sVg5E1|+ zWV{y(SW{5iPUO=UOxvmSkP8s=`!S)m_>o8{F?sh8yq46HI#;dAK??EHq_$+vu(r0v zSPrW?jbJ;+b0g&`c)3lh&;l|^mfH@@Y;Z?7ypzg-89hl3%+)-{1;F3Z_qNkz4^Ccfkg8BbLM z#}O#b8`jhoFGtJCYQojecxBLel3o+udxNU`3{TTMC>jI(KO%E2ZON<} z@^!i;%kdIjYlHwV)(ugni*&_Ba=os=V4rp`WcHWS7SoANTI82>@fQ_lPTNe z=Sm2JT&4(wZ80|c`V*ycrDWrYU{l+~1Ru|H06L#ml!UrZtPE3oE70!{u&njt3t`0@z&&`9m^GaXlG%mXM2=QM!LGytoJ5SxNJs8`q%rl9^r zK^q`bS(^0)To*ntqLU$ zYCKXTL7UDTuO?N>wV#kog^WTXZjLqG;mT*Wl{xq6SthDnCULl~WY&LL*CErQt-8`t zUI_(N#eDS_N5AM_#1WEcVS8xhUtu;$vB)92Fz<&PkRJ&l8y-de;P1NL>sFj!;55b7 zLwUM{u1SK`j+NFZ(^4q5l5Ym;$XY6LIq#GrGKYVR+tNAyu78jA>K^#`T)*w#qu!%? z#n!S~3bHzcl?ktsxr|4!4YE;J$-7BjVHEwWOb2mq;&O}Pp1Deph6Y|9=jYrMRckr= zzCel-Mz8k%E_7^ye zBepH~7)vH+M@>hY71SwNPKZtQ$I4*S43EwAA*$X8hbQMYX-Z&Q^%YQ3r_- zl*L)`Bw1ziLC$=Ab2Ti0ag=f+c5u{t{a6`P~O z{1?6)9n>DS^N<0z-0Oezh^$AHOv$MVzi1 zXEsN}{DXHytr5Mu{O0Jj!yt||GRA@H)FE8&^}o6~8d*C|hl^&F^IFyF$N`vDHK8R4 zo2So0rApGBkdp)lo^F$jp{LMQATo0HS0~VpI;c~S*k1kf(hbmjb~zZzXsOM5LuOnM!PaB`cfF3v3-r+hZXE-D1OiTt`if*v7l zC8Jc~#d*~{bZm%GV)DUBE*Wx-B}gM|fgtm-5&`L0^+&!gV%bzE*YX-APd2fM^nSA| zCYKURa(unxsHry}Yu8LZe!MWZ zbOu+RuH$=Zpsr1YuE;s$z&ujfW|F%=6-ZQe4jpCJkQ*y66O|S;0G}`CIT8n}*J=b? zYug%t(j3u3oYuiZr63H0aHUNyzIMw!%A`F;^>!ezaVb^`A!aWwvpwrxvWPPhvb6w* z-f~XTKo3-pNKy*K-vJIo4(wdi0TJQ|5CxQ@lNk82RXic?6mY~b%7IPBxdY%SG5@Ho@R$Vew^RX!qg@+qR7zd5Pq@QjshjN zt#F)FmbC0#=VwXB&J{*KT-UxVd9=B5YDAB&%+?59IW%IVuIViH<*K7>0-0{AUYM=T z#dvL$m%^RHtY}UnHn?BKVdty!w%vb-u|XXu5#ng_#_y=0vv#OdZp@QkzIlzSl zM;T|s2n`^$5)f&x&lj9DE^2b%OIaqD6}p!T3->54EaW|0po|h1JD#stCOWLhuaTM@ zut6O!DwVPIE*)I4JWA|{0{O|=InyQh7URVbIrvYH)4tBWigbA#=y^P22NRCQR}jSx z3p!SnA{`$D0d;UDh3Vi7E_CoET8D@hwTCRf48bG=%ugcV*xmO@J}9F?Lox4kYkj8 zw335dCA?Z zlkPG?gp9F?qEgle=`N!qP%_f!ss-jJ2zM~h$=P*I!d;n{8ySbmcA5BbZcVn!#7}Z- zF^uFN5ae>A<7KX#DI?fOcj3V?NQ}OH!VXC z^!fb`$uzSUbz7Fl91UiY>a0-GCMdxaffdN^KDxtX>8W=_`%IQBodD5f=@mPZrI~?) z{DhmM8H45N3w9|-`*ZJ%dL*w(EUgREf?&`=&46U0bRDYMh9IqH09OJrCN9KiH0?DG zQJAIL>WqZWR#PMe*F^3}NNQh2Qra^e!~FI;qa*i3Xr7=r?;tcA8kSf+Q=u8)>6o)( zg1R}_rBKRUe0XMr$#J#tH`ay=lr6FDs!kCf!?dh+@RAnseK4Cjhx4({#`j=tV&6Ig z%(2Gl$$d>vAZVU!XgtAMlery()O?6s*1FZM+8Rf=-p8YOsx~px0Z*}Nm639G6J+mn|DBRglP1;b$hpI(Y+-M0%TMN0Jw6OaI zbWXh3m4JzcAM_(7dcdSlNI@>{vE{mcV}gl@DLhVZG{4NW;RSTwMPkNMxjRfce=)Z* z;AUkGH0h{-H5|}YL^3XGg8gZ0*uceF*8vzf6WA;yp?mOXI45ZvwY-*WB{S=eH8`H7 zu{}}Lh7h=aG%YS&BCS{m%moAvotTC?pxY61r!i3p3WI;8@v3}t1W|yHlcE_x(4JXk zX_IIl7lQ8mmX2_dmbpZqvlI-w!GRj5BR5xD!SNShNCNux?gs)p}j zwN_5aPP4BHN(`LeC{YWhMX2Otp{BX8bOoj{YhE+Y;B>sRm{03L)9}EX7VQs#Rw1}b z3vvoQqy82=SQ-YYVJ>JM$N6C#vXD^lEd4n<83&c)=BS9Ck*QrGQ@4PMtjDcErY?Z7 zRW_1cT2)Gs)^Z0jHCL0VJLtuQpm9h1?d9w8C&bxHD_v1-R=Hi!h>?Is0TgxhLaC0( z$u?jUyImr7EB^@ChSZse-4K2URdO-0yC7Qzyv#%=iQTOYvD=Q`)R+Cl?pj8>{7mj< zsLRp7L>9*LSuU!DFgdIqVVIE5N(Z{~4qlIXCN`JC8+k7Xy_*|CZ!Z3pvH0uoKx8r) z6EjSbmXME{v~c*o$blv=S)+E|X5Rlxpk}J)SgqSSxwSx;h25C9STj@G%`^jvK#)zN?v^HUNJ_IS{ zV>6yvah+;nN}8^A^6yY4hgT-w2D4<&uUH!$r!$>W`IZEIlJqdui4|nX>kYncBVmy2 zY?8S#v1z$LlIOy@z{Dabbm);QbAdncMcu*05)G4Jj5jPv0PgDc-Fj9 z#k3(lJ|FIg?7;pH&bMSWs;@OXY>f}9FVVmU#U?sGRTrrSM_9F+Uf9H@Ol=PBG3h7q zUJMLPw$9SbTs2D^EbWM>s-hvBf4sUuth;*9VN5IszVc>H+0JmsT#2C38kkb5=!@w? zz3qW1wTdZ~{GaZPCfBrLmw*_PE{4-mE&&wr8w3pN@nAK7DCHQyw7<2S8xKq;^W z0x*hgZ}6LTaZ-KR%x_R-^eENyPm&~-DHBwQF*1Q+t7xJQy)Y2^dWNAOOlL5NAXNhh zj1ah3om@x3hld4~mJ0L1_4X1;qIpT_{dL^Q*-7?BO08+SWtpsmL9FWj0LXrxc#o)n zE+~mxHD??`QePlNXx;b$20k$eHInd$Vo-PMCW@lYD(Qfl0G(n0nTbDE{mcT#dvB7&pNW5sZ!MOo9fm+4 zLFtu}D}mRv=t3^|k}seT@*00pPfCv%Z)1_5kb<^hAf#NG7G28a(<|37$cwmxa``I- zM+>R%8mcu$R5$$+l7Y(t_0aLcF7nm<1WW3h`BSKT0V2WWp9>tw-5wV=q3gjgFiTVK`XVZ&Z) zda4%4((Ipa{>!KD{pzASekQ|1y`1`f5vu~1OK}cxxvVlQ{ZOkxYpqa|TYJE;c`zf@eSoewkU&7Z2VALO0X~KJS$Nl@ zl5m#E#$#|V{m@j16%HY(=R&O_Cf~Q{y381x?$%i$On3QtCtCLuFqB8!e2w1TPv{sO zofNIbuf>wqbD>yX&b)3C_5xjkr(lVsRI9L7>4~6vlcE_i;!;2H38cziN}qx!)0|~+ z@f_sNw#lp@1YMC4-q8}nB-())2Eiym2j)`Ns?G!fT@m=}Sp} zdStnflO`lyP`86UnpG9-NLLKHOyP?XlZ@^!Q{T8=3Z`ncwdsMuX^#qz`;uj|>A3-* z&m>lxV5@_94Rxr76*iwxO~Qu_ndeN;E;D>!4VNjQyF84d;@LKz9QD&|N}#rmFq=ih z!E%6Oo>Apz&qsakbG7LRcBXy|(n)03VjhJ>Oj@v>59iZvBSsk-@CySv8Pp9j@%ZwP z@{q*XFm$Y(o5EAD4AzMn)lnVFI;0UUGq12n4ftym$Z?@0GsOFg;I3WTpaYG~s}!@d z1aR5`-e5zCtdgs`==9@L}?+w~8mwCWjxzYHcj?Lx6m%ro50$MzX`Y z|D<h!eRz3Le{1y)_xx|>-UUvpY5yO8 z_Fn6m+cVQVQ&V%F+0Qdm%~Vq}-F4rQN=3OGa?SP76mnd0ok404V#+GQAWBLhatRY5 zQbPKi8gy2Ucpx$4f;z~ zd@SQpp*~ETz9SRy#_`5#FEAScLE3~F7%50^gi0w$mjcZ-wh87SN92RR1JWgE1n@5% z(k05DsIg6VvnOEy>F&mo#qV~~(xnV6G44pfG@kV!^+X-;(JS<0OqLRGR9R28lPJsxoD#HHS7%+;|b}_^2-FG(x!b>SX2Uq3E zXR)U0nSu?&9Az|s53q7!LSb~Ico-ci`7N*adcPcNP+~3QO#uKi!N&<601|yA1Q{Wc zvI%{-4#D6U1Ue4KQM?@uq$bNxOW8;eIl#1d408~|NB?{TxlE8?@YSXP7SU80NCX}^ zrZ!FFvA|=tVtP|8YQnLLEF@-%GlmVNh00VDeekk6lUA8>Q&SIY+K+-%eY?pnw4_RT z-_8%kTL)IYZ)d53#Wqd@KniUlmnyeR~)crkE2-W-Lq%NI8%y0{qZ< zz=cJP5(67KaKkH%0#&X(#*}eIIHP4LDD7$dr6U%THHFRXCcKviJe5emrGXr48)VwA zaxK3)NTOR-=iavqu7=<(fVDQnLNGtY6oIArOx^MUf_iClRICWhyXM99ssLl2WR$~N z_yWlfM#n_*NqED6SQC$?zPThBZ640S2d{=k6M55Y>=NMlad$4(5f-J9DP&J_v#TPB zKoM40{a-d?S^->Qtq2TER}GHJ7as^Z8=#{I@ijdBffgDz(3M!Yv{b~#72c#18>PDc zL;LJx>_9a^C_eMm?_b;HeBA-7QM?|u+3soWQPrF6@g0y_@0kW_9PB5xcBUHb4}09-k<3KlX{DDNyC6kc#m`2viJ- znv{B_5ap3NYVW`qbQ34Kjd(8&XibYQ9tf za7>~|F*8X%q_7wr6G;?lWon2b<;yLIB5qg-SL}x-TAnI~D$7auZ^&XYY;OPChA@2~ zzM!&xJEV%9_KFpIVpX$PVR^n^x|rb8MOFWyUG-OpVnn_Fh28fsAn>11Mk^8k!H-uz zH78j<0;{xd?Q-?)b_9C#E5%CVPH*%*`=f||R(Fb790#Bn2U;Akzaz=`e`a-PmVx+6 zmZ1eYV|B!_3^2fM#xm$a|BtVZ-uqo0IK4%{+2Ry83IG2uR)^OPSBI&bN5uc%R)_Vj zn)!|0XSk2bTIcJdGIu+z1=R%JTOY$?9c#Wmz;|M|Ncq;T_#YR?fhzVFo@QGAGBe97 zjE!QI+^qE3&)~l7C%D-?cQz4fTJrn{?{VBLcj@@r{t7c&5#wfUvaO)Tn*LegMy+`^ zFAikS3^5yi9~^vQqg|elc`#dj9~|6xbTIT#^MmU7ZFaw=Z9i4zerF#={$)KUDvm8v zHQ(8z`uiW6PpR8RYq#Vur*I)cnZ|;=nC|IaI6PG)d~eTS&0smTqlwQ=s`~Hkaj_3* zGWJ1kw~MWORl40SDARI%RF#UQfk!5Iox+9SfpAegcX2Yl9Dn!n>Hab8)4cs?=d8u9a8}Vdu<^qRZ zCRFCPc8;2~!%kEEzBN=`H-*vRv>r#*(XcPIcmDepwM}dqOm=lQ1ib!e>I7Y~bRBa- zPN7kRTiu4H+1fo7e<2U@j+oj#6)BMTc`0;b1c~t8=;sKjk)NB6h?E(vXI+@3T0CR! zsyMht_jOlYPx(%``USADHoX;eTll**cFfi7AqCn8za6dP(hjtK3R{LCb=LkGMicvK zSPPcIuh=liPjRa$_x^K7S(JgJYzAi6I8?x#-*#G)#l+P6-nQ`0z+7_@>6i)A6VKZg zN!r_XgFTTRcL4lmJBt3ot;nt>=cL_1LD0hH8*Op$5pLeFC;OGBTnPJEDa9r5S)!LG zp{I+vH{8`gmhOFB@p>NWOamyu2Ab+8@2NlWL~iPbVW!)UXYv$~*;w5Ut6qf>KiaG% zmT?GAVwGvG1f4gCj>Pr)_B8y!=>A&c2q;k9ymcIqX=sM_YxMwO$_$W_9->Cb_&pM! z;k$vBM4|?O#97Q9O&D>N`Llrv;%B4ApA8(l^lSiv;o?v=tEDflo*Aur)qU4)(!dQ= z5uU^$k3j957k4X6#8PNu&5r3aoavbP$%!`|YXtCg$3jN=spmP{AS4Fj^{rYDWi-V+ zXk?SkT%3BnY=P)pByq!_9lc&-KuCA*&6xQO1PsU0l?Ab)sU0;~34CNvV+QF4YA{Hj zt!cep;v9d|8pm4GWt!Hx>B0flx?3|BJ?LyY;4b0IDtJnVpQTLDFNt2n4S=h{jDUT9 z)vhLDlSU(t8T%?jPeGDw$`k|XA-8@ZYVL!4m??J?Usf#gn)wj7B308+z^;ngC4uno z@N08>GOj`(yq3Rd;A5Ge6ugS?;3mxveyOEDTOqagC;N~PJc4a%AqB#(jQZI=vZQ68 z2YlX2d8G-8R?2#RP^*8o+gcmddq3M}gmkbpt;O1?4*kU*f%IE`u{)>gbS+5_zpGyP z#V*CRy8Ra%$~UNt-FA<5gBZ%JXH+mcJp!EZfiPNG*SC+`?0Lw<^Wv9rd+r$goA)GH27-V9y>F{ zjfr&NvFNB32^61J8@+_H$uS6by#%=eWeP;ZIcWo3- zyo%~-33D7X=~C-5z}a)ECASPS>rzK2uuUrO=}YhtKyBQMIBw;%?^`P(BdOY1FCvwE zZV-_&rf(9F!%!JR=j$rNBh<9t?D8V$^WE7-z5>%*cb56tlSOCRkxpv;Z+3nv(8<`v zB9e~U{hNJB47jF7PE^f*?31mh)F=P32MzbIZNa025EqbicLUoph;7nk*E7OTS!C~^ zbQ4gdwj*hm<$)z4(v)L^I^%cyerw~LBr&$vJ_zhpMlp5w9=(r!&lQ{5oP z9?+b$R{*rx6bLjgfK<3M)}lU`Pz8V=d(C5aw|^SLE4rbrVJ zFenbZj&xMdB>}HCs!x){=_HmAq+-csgSsA`EV2_cGIdvzl0}a}l-45vdxZS^Ogwwx zSsR=f!8w-vyelt&K3TX6@Tm`;*Wy!OJYU6o#2!+&eteM{@|)F4t?MAt^=-DQC`EKJ zjjl(dIhe;|Q^b+z&EgbMX+H3vkOL(BDn<0oo8cXl8UYv3y6_Ck(RXeUv-*a_=S|?9q@o(X;|~8Yw@hoK(>j&5uYG#Yc3*++aV5 z6c{BcP&Q3p^^t4>geJQm;hGQWbYmh^!+}UQ!Z{JTCm6-0W`z(WMZ*)!5Poh{&!mch zWrv!+fKsDRwF%LDb6%wPZ94WIZ?_gsx^mJ)-!9G5w3fJm2P*=gH!OX$Rfuq(f;DHc znwBPtt#)crnmEHMP-(41j}%=02}J;vjq0#gqF06X`Ajw%Lv#Q{w}2f1u>~R{Ge85? zVX_nMAK*>Q?bNbXqP&Qq7LpwpOM%l*=0R#Xf^N>nZ|xLatbT1J96&8UU7UAFH`cdT zMzRQjB2Wr|8_2(v6O)38!L_yK^tZo>S?f*ATj?U2Rz$!?ieSrGo}m*G#|-zIJ0tuQ1GLjJMR5?m z=aJUxt`6dmN`w)@OFOe>!o-VWGZ$c7SOE2w2kLEXVOS!_S)d|qMJK_k4sR>6OA9nA zl?Ue8vEYAUWWVRlNOLhZOKMR^B zw6n3TIJ8y1=~WHBFs)NNF<$V;^mf9@@;-7o<}*ky%5H;OjjAsdj{2yb7-9XWI%HvW z{HTU!iPF$%5LVD=3ug>l{!!q>0Q#Ti?!FEyBt872dL#=|cA9!6OBCnjd(^8D z>%pIq2GEN9u&X{T6PZ>}J=#UIQ{A#fLQiG}1k%_G6kr@3&?iV?OaUf0;PMnEL%*ow zM--@YvPHfgPi?k1+#f6%P>yj+wiu>AcF7S=(E$d_sYMY&>7MN63N3jz&F9|Rr*|D7xHd*o)xe^BoU<4VY*O-nyYO43}10QyeY9C|1k5iTv9O zMR866>}yDW(Z88NBAVWaio@@y0fnMGlSdUAzZffJ?41{53|AI{uPIPV3&mmi{<41C zVqu2CqvtBl99-UQibVg8j-lC32i(X5^20b7>v{bznj(wg?e9a?jgIK7>Wjo_ZHmke z%CFugqrY}hu7jfl4CYCVoGx&p; ze&ff~@X(bN5pjv;ckP_3!EZarhp_BM%Bo~@XQ^DUJd)U2CtD2?B^*8@(SGE zUby;nnlLOB>FyM%(e1%o4_D{47X{t*X*4a1u@!iDHJiH!rU4KG(Q`D7TYqemSI@V{ z{svmoUL2pNHxQo2{cZa~vwxf)DOTe>SIPt9TkH{82ihab3ox`)oYlQ%*6U`>9&xmuTpr+n|6}zI zvAUx;B+a9XL#i~*Y+Wk;rfFtXsVMXbs<%NXRVvPH+7dd#a_2c0HTO3 z!VvN_oHJJWH1kjPh^zM5BS6EO?GcGB_6SwkNn{qaq;k0K-B3A5Xf%=QBu4wA#<`72 z&vg<*hu{a$zdYb@KGHJyGlCN*w(nLEc;knVQzJl&?J|+@^mmXh``bL0aKK@GIE~vp z;s9}XXOSPjdH4mmdE}@sJBtGBAhOF}+CfUx-@Az1KiEdDVt=ud?z@e2KRj;p(Xa(6 z_ID7kluibXG5ar{ar;RO(vV~ktd-^Bkp1o%f3TgjSKG=(xY?ePt-5s;1+kr^KpoTd z02@m|e}sxjQ)tg6wDyb0R z{qGwS+2kKAt)i9@wD%6Bp+7b5Lcj5Dj_O~k?g}NMG@X6 zR*FjNZ8g7A48ayk>q%`-2~tKsGaSFP@Yl0s%Ajpv2CCHp44CAC#Rzv7m!R_6?(vnc z?XD}|+Fev;y^STHkDFkjDJf|kY45a&l&XpzqF2@dnp9Wx5c%lcydL68JhFOj_ywky_PLI2lDokc}8$ z$?%$JgN)zx6osv^1%lR-VWw=E#htkn*&ryhaZ!1NIO9UZe{8;`|~#&e zAicEe@|!l2S9N1qBlzK8rMm@htLCZa`hzzqRE_<` zgtATu*b1qca~SSTo8e6upmb&#sgM zrSKyu%0f7ZvVCpeUhedTsGWxNX||{+POkz7yRRl`a3LUs;3x zWhyIlMW+O~!NXWr9qx)kwRMPS-LfBh-}H;lY*EzfhpKW#o0g^4#Y!#GznU8KOKsmz zskwhr>T~M@)$3rHxz(scS}pM18299Vw!{3m6~*6cO$-ULG7y z!XH~qo@J#aYl0C;(Muh|a+A4CwK)uGo*axXzSL$l;xNGAHTBS85FTw-Kk(tG{-eZ2 zRwwo7C@``=s<%doOA!rs{U9I{!=o?DO3LdVyrXPx5x1ZTtmMD&1+Ai@2Q4tk&D zII4cM$Z3TlNM%q&wEU9#ehlPIKdDbfi;|<3yb7#&lI7tnIMM0k>V$`hILlv03lVpH ztOabi?hd~3vlGBS2cAsuX!JW%gLMlO{M#6DI(qxe7}1^ZW^?XOpjUuHt%VuEbDAMM z_;p336)lIgGaifUx~W^)`V!tAVn;}}>eZo#iyJE(e7Istq#qt)N+gO04D%{n^sFk< zNelrx1e^+293h7Y5O$2eY^*5jJ=p0Apg_pcwcPkIbae)EBeh_wsM8`Qhxf)$$f0V- ziVki2X~0BrI|aGID7w#TUm7chcFuG1l$)%5>XKg=#oL6eMJ0-Xo3*jT1v1Y6?&c zyTK0-Rbe36)KGAv59sl$$>T(RQYY4BIi1w4sjHN0i}5`OzX@A052F9?asOR@4OK>bz@p1LCi^Wf2@8frABbcabFO zSW#0!zwx**0%H$0sdgTX^^VQ@Xpx(T+HLw~=zOhAzQnkE5z=^u8^Cno>Vm3hipKli ztVn|@L#4l9Wuv;c-?rKwWpV==$R5X?7tjraW;KvGrnS;ns^djFl82lQsEgKIYzHCj z5Z9tioE;hAB*H(wRiuMjd<;%n?bY&QAW`3S3^c|*VUG6VeL0uXIF64vwC zLEUn!I5_z(%Y`P$-MUtNcr3(z27m>B2pHA%IDMWwP@jS{x?`ViI8F@3e)HyWqWuYX zSrC)g7~3XdK_2JMagyw-+}&GNBZfg>EQeM5h5j8G;ntX6q%Mp_615nQ0+z5a{u2RR z#{8=NLX8j8XJqIKJae5*-NaV521{PUZkJvKk`;HkQ zKoA2JfAt2~sNNb6_}!_jELK?h6J%dT7)kGY5A*SA;Do++? zSdA-hKN*}LCVcfNP=h#X<0+zjI|mB~oHrgx;4wzR2o(eAq%tPp%>JXgegY-R;RR~R z1gy_JYW)Op9)LgORMD<&Cj!tApGXQI3fhkOuR2wf9MplXD6|Vi%0%a|h3@ZxDbZw- zzz%Lwm6JHdiB3dmM<*eVYhMU6pfM}M8hJF-?Le7GJ=UVP6Z2jRc$b4Wj&vue9>GlM?kzKLEU#axd#USg; zm4}}$jb>nJfIIdiD%)cp|&g3P>3~Qyi5xk8EVIJM(2tE6+bu3=E;U zX%@&x5W{%tOi_@(`vD+QmTN;ni!($JDnHQx@>>dUIcn#b;_5=?&=<$R4?tfWgAh#U z7GjB`*`L&`v&1+^D?U3*R91Fza0UW9M-NoQK&Uj~*R{3-8pD%EkU^^ZYbN;37Q-74%IcfX7WEc1iJNndsvN~D6$fk zn>Hs;6la0?*)UP`IKcp8f6ZZ%G3u>0#);<^Gxzv4-+~?;Fa;xj-}&KTo)L z3_nkF=wh%A8<5$TZ4}q@kmj@=36kakbB7j4sCnm!W3WQDpC<+-7UO577w((bvKcm=?wikEAaa96 z;3*Q+n14XL5elW2sQ+9b-f1?hNRr+MSs;8NHdIITyAZ&uRL5K>Dm&GDG7Ux&>nt}A z!d%1V5yvYmbMSds6ne3G3uBR5exc}*gI!@OK2WQ+h0k8N)q&4Swf91CRFd8?)7&lU z*o#C#GtlU5b3dRopixUNGTUZsHemO(GWlYd1X-V}6E6|Ntnbu)mxv4S)^;jJ@wpm2 z6&uU<>a?k1Al~Yyirln@w?Vn`-AxBm#nt;}c*@TJ`hm+@5glr(yKk;Ve<|18rd;d+b_qIBzzCOX4X5HAt$|np z+Jthi10x^4##XmoAs!ucHHjC(-Z0V250aCB??~Ul*ng<1Q9rQvDV!#8MJ7Y1s1L3bMb*BX2;{`l;cqEiLxV&{xq8E$|`yY)%T^+VQ=;E?C z_qr9_NB9B2V&Dh%*d0@$IA|{R3ubY~_Af&h#ONseR;cZ-t zs9otQN+%Al{|*O0KzkxWvpW+4zx;{CW7rCD&R|?U3LaXzQ3= zKu{`;fO~*{AiP{1FG#9~n^{Fmr;EHY{|l)#R}qFNA!@<{hE}KsXV=+8n;+E9 z=^{T7o#x;P<*ba>^t*_`xpnx7I5=|NALJ@$STB@dAD+cxc-vF&ns1^OwN}Se4 ztPY&&tnRNB_hb_#xpb*(!+NG7&PmI2Mycbj7Z)Wg!g2x2_OI(j`w-xSl?9R7wU)AO z5Yxdi*4`jS_cDlOJ`lx-z`Ui}(2y*{Pa-O;<|naZYBn-%!ykR%Z5Q-KV@x9X?>59B z?3~~y^h`wqEG47qq#MRPTK z(0y1M%p9HW4EF-Lf|i$#Q295B!;7f{h@{!o0;|k1^3wo*LA8|RHs~NBLfv$e7?g>W zfKFy~`cQdbs|DHrCpU>xQ#e1k({p0DM4f+&$m%fCXb_f3dtQmwvMDu{Khz{h| z!W>o2xEZt^5wbU-I%gE`Pz*V6u|ZzyU;5&qFI>ZEpV!_n00eq~0aoly%B3NM!d&QsXg)Hq6lWF0>aiVf811f1OP&J2M?g}xn!j^S}MK-~Kl zQJC%z3FE4m7(PXvehYYmJnC1=!CbYV0Ra85v@G@9Eh6XG*ecWZTza9QUPc$kBPo)F z3bD{YpF{2skCD!UI|{iA#6j%4doGpcz>-2_!MSV3s%x zy0qtJi3Ly-oOY|I)XGaVGFxKu@th?i<$TVRW+G~((eI?8POxhWSU2c-J)b6c=6wFd zW;K^jvs2CHPwX1A_%s{IOfN}~!6fN1@E*|Grfk#r6Ps5JpC;DdUJeyWyZJOpyZ93Y zci`!i!$5!+r(oKlox>Bj3|RyH%BD%oEsghRVeRA+5%9)Bxn)p?jf7_`&d*>mVD5*f zTMLmi$BxDU37fP8HiQ~sqUCDlZ8)GTP^)f(_P<1Zdz+{@9YGL74D(*g3rkQsTfx#_T-_?ny69AZ`)KoQLjyPF8JX=f}iJ$ewNk=ucwTR};I^m|JZr@?mzoRO40)uL5=d z?V{pbT?#AhFBH;x%2MAm7C@HNQA19Ng&TLI^{)ib$uYsd(;ba;(~(T{f$0xTH@fo_ z)m@Xxp)97m9>K5tzgR(p6-0Ce2eX*2pa*^xt0$Cj4lC9PeUQ*m%g5ud;_1V(eRSDj z#OIF4ODSEtb|8b81423@zr}9+hANsXrc%EvQ5hZv%=kh2(%vJG5p~3UB5w>~9e}12 z^ewJ~?PEqPhP(a4iKF+dnF3WbPxMYgLrJKvy*gop&stECDcaS(LBB$OVdUdN^h%IcLz>%ZEKX7DEq*N+^zJu%| zAgo)nm1Hs%zrIqN?+~4;;fg>csNi9Pj!^-C1}k4KQGfo5~W&RupG!UT&dozEhO)&JOG- zao1@;2;4kcKwKyR*J~6yHE2MY@!i{FZ6&yGl7Z4R97 zT#*49h4$#Zve$fZnq@6hbMF!Z6L>fY-@Ed|yI@W2MROWb1w`TG1l$3!r3uVY3HOM{ zt6#U!l0I%|sXGm0^epNn)I(!#0FHvF0w|Z_qg(*7*iBN4N^Q^{u-wv+o%)3h0eFO_ z>)5W%Jwky6YXjl>67(1O{R=!`LCX;!#oSR~KB*Jy#o19JG*O>JF=DU%BEHr&{|Vx+ zEV)+*tGz=b4p#Z6t7+^Xt|o6!)(iJf7F57rP*2?_zKnCrqcKw;{DN9`znGKhtqK^O z(8)kw7A@67mMF`nrHteBM1MQ!si9J|5KCH9DjXq}71(X_dk{i}`a3N(I_qC$_yq}+ z`ecE~E#qhoa&1V==zewv^W!-|XEaWX@QFlIRVw;`s7uxEq9$dITK#|+JK1vz)p?Cm z==_#Wp}0v1b~nu@{rh}7R4wQeT7#RtVvfMzS0PXEJb`!N(7+ zt{}!+jLP3pKQ9(z(8eJTi-X|Cch$qtPOVoDJ}d_Jm`-Qn4yILonXxb3Hh#U_|7{9o z)&dQv=nDZavX_9t^)0AucM0Sfz6F)-F2EZss4iFnX7f~)wNwo2YZe5cq61Wddm@#H zG*Ll&hzl(s>1zU7NO0GJ^>8Txp1l-%N4my=jXfKGLiQt~5 zUVcQBg0KDl5s2>4xn<&p)CR@Rvq<_A)g#ML{C@SpGI3t&{H717{E(y0T`pSV>($F) zzHyJbbGfJ-vy4O(2SA?qlK3YTcT2k~AxCyg-9{}=CS0gr^4zCML&En$(+I67MMBXe z3P@CAnrMDbASQSn9G)DeZbu5Wrw)Ws$9kVntr%Ev`-?Y3@wVqAujQYa?Nfa#o13!(u+!JTYj8{v~%bcs|*lA|tjInw+$M$1KLJ zNA<)CQJnO~(|`b+c~#>ISmHMDEu_uFG&Qr_y-Z2K_wW-UxBIkb@Fv2i;W_|#Hk(}t zX9*d~3)t1*RFYvoK~^lhR~HY2e^nft9u_cNvoH(2F}QF&fIRC_x_xS$Rm@EPayR%d5PXMk6tK0Cs7JX^io%p%v^f*&Rp&e@`r6Zly8lU0GPX{TO_m&y zn_7hyxl>AaGpf>mP&teQ6RPwP1$tkm^AFO&*kj$Z_kfby$S;jsRMtu{=!7+V;U8pk zufp087hf_3xp0KmBSrT$6m303G;W7)MyC;Mzq z2?^zN`1&|7Y?6!_4nYF4Kr;jIMuOxmSz#R@2mk4<@-9KR5qlsp%$5@MY-En(T1dLuz6zDD$p75@xUW5Hhw0=e~D)R|9-NVV1v0pn>& z<`pHR{lT(Y+qEtrz}K^F82jPM#kgLeoCyC4`HAKTaGvJ`x>MaNG$!OxtPRjOVq_k~ z+7S!rL*9nXB?1iHbS@Zygy)D*sH0_7V}k&~+C~U$0oQ;}9F`kE`VQ6eX>mPt49`Ce z#nKR;wZvCL*`1^BW zly$Fq{5fpcG4NrAu}5%Dw0Ma?L=*^%Xv+J~T%2ra64X4uDt{g_+D%>Du#*_)P_QH{4af3J+8)x!rF)H^RtP4h=f^`L+sZm6QWfWK&JJh+W zMbCWmJvE~5QqkEEmK8hzaCxVCezhp>vg3KsLMV^$Fq$GSVde{7f`0~wVS-9~QDha= zHgE?+^mljHbNuDt7bKdqkQ`p5+!w`nL%cfX`*pZp!jhH=t6C8+d#u zT=a^l&Gq|lMC?4G0TuL7U!C--a5`uoHyJtti#CQD`_FqqfnOIeRIgM9tH-dtnSA$E zF{&wxHj%|;3pktsEs!M%ogTPWjNV@sNRRz253Us*0IfIIg5TJwzFG@vvqvSrCd!)- z9bq=ZV1`n3>nYHg0UiS4cLd<%;Z{F*5e`I9h*yt;Au_zJE__XN*PL(iz1Vp6hx(hu+vF~#Ed6w#>s*a2cVHo#xu>(Vt+=> z0SsNyw=W_j8TXocHSTpWDnABOZ&ZLORtM=E;Puq&;@YM@d*@x`pp6-X_(Zbf-T+~K zTV47_{OG*8Xl)8q^eTJt4e)vIsPEr^#C)epM*N&qb{ICnf|?rDYn|xT)L2s$0FYnB zjCFc)9$BZWcx|1C;E329bxBF%2a2()v^RxY#I|rv67_#ZwBe83Q~peTQ*;?S7o?uE z7BC@@Q^7ZuARdwrNbfA{ORDa$Z0oB1;4N7f568cLQ|yXv)y_dl(M0zeXa^Af4H{H; z)+?Yn5w`{ps62lEC$^%ks{LD{eddmrk+c{C!I2q?24+~SPJT=L&E9O){jE#im|}=} zg}|h!phV>H`?};=_O*813*~3$(uf%hJXESwjM$9SGxQqxe%35i_r5KDu|87s-Vp;b zn}lo(eq!F#*YAkRR;B_+c)LvLzr+eG0~)sJv%7_MY3+wa2AgXw^1=a1qYifFm6;pF zP%AxFy9-}z%)*)Piut-{42&;m8I+BOc5Th3@lD=FG2Ys(F4`zITK`s~-xGPT)I0k< zQAGRU>)(TXcd2^nJyBK^tN3<_GpNloD6W0Q5fn_C72bUNCh>u_Lw&eOOri-2`ILIV z1N6Q2b;6n$g5FY6pnZot$kf(l^d6r%msx1*1EfvyLDKj>PHCG}-Up&r8y{=X_3TMe z#F`JkTK9gRBSp>9+PbcN%j}P=y5su3l&*Jl`k#4WL$$*$I0ln*b1dgv{ma27Pi#J?G z=rhs7-taH=(Pv_5JFZqn&<(_0QrkZlg`H;cE#19`53Fm7=@#(!7n|@0tThnO-NDM=ReiRIZV9h#LTzcv zIXu`-U9&~BZM}*KUdc`P9e!Hv{6h4yKU}REw}@=}gVk!!7E#*%ZGB*|!tdxOIuc$c zc(%fiulyg+tKnaWuJ)!)>XI)+w^6Y^Y(ryg)Bs6PURy@#ebWI=AbLGR>{)?74nxRB19@&DrXr9Bgxj=DJZ@iS ztDC+PW9@0S`s6!N$LEFLi^CJPY(RyJ)!OexpN#30Bhj{NO-%bEcAw?bCOK? z21}dY(PKPiySNS%UVXV;oMcb8)vz6+$DwmSZU_Y32GW3sQtDJH+JV?@-Vk9Imld&z<6o!X1rx?c>NQ zckmP#79t&>qE!TlUX8u-$(`5~>>Zz|Nk58?)tgxs(EzQGK6nJ^s_I(9Wwon&80((t zT?Ba}>@$0*53=qoQ~+ydDCaCddFvbtu8T*Ys@@sJNh;I(08c`5F(W}&oRl3!$^wa=$D=0`TDm+l?KWg#M zq9`=~Bk~=*iRm*H`B@YuEIrVknkTkZAC5OFtr7V8_RQePbSS?2UU@^Dc0m5=w4x7cax(2!dWVGFXZQb+WY z|2T5PG|*O%YC$Qg<$l4}c6{ZsaDU}%CST1W#j-Z*^p@-JA;q1iA3$nQ!3Fpo-XKD1 zS*4ZN>U|MP#`?t4dPRgzR=19nZPeKQGSp+%Oq9%WpSl4L&f_A!-|N58N0A9n@sFVc z5CGrYU*_zGh<@hN&aeF+Th+S$azOQln^8K6-Nwnoa_3)<*A%{j6|>x?A%m}tAF_tP zW|nQUe+YoRIRFGGY-obOi~+LqiJNXjMQQFAd?aI_IF;?-?-~vbLQ}WlXUs;ec_ReF z8wKPHAO=*$1wsWHJ+T9T#=*4Rop#G=ZRiJy;ajTJK-o?L#)ApjtUOo`vYrh0Cq5WX z6Wv({RbP06I)0$+721Gw&YTUk-yH)bh1)L;k;v8HsN2P->4BoWT$@Xz0F7~O9P?K zMDKl>j{Tq|L_e=tc?BylBPjA%vw6lcv5+`lZ5bjvJ8Qngq-h=Q5bPNxSo-Ex9tao^ z;D1$v>gLLB`M#HJ&nAakTr8f6J}+ocm$@?EYEa6RMVXI5=4KBe$w-azD1qZjgL>VS zgRRF@%1}AX#_PDDvWE@*>-3?R)>qZSp)%SVvORL={+*mds(1!-H=}ddj<7>PtNRsx z@4z2JsU?+->i41Y794GEIaq!R$AHTZk;mfgUx&zlCoK3LIUiQ<43p<~ya&4&&MHy3 zPwQVi5W=DZbAse-yx>8-03>Vq>bgT^C3LUY_h2cFS#dB>;&JK3sA1D!KDXgeP}3(= z)^J%|f@&~e9S%O=YV4+3&r}al1WeCS^U1^I=%O{iJz|aRZu^3?ze3mQu0wKokqD?c z!(~yMW}oKkPwLm^`UrVKnm56e z06}H(#t7+#V@X*0uy=b!<&Tu(vprxZxZAOL#z9-%G!i$c`lzIy7%2yYYQ8a>7a|F% zz4#1soPxvT$ZYl=H&O!mA=bqj!a0?a#QW7%hspA$lfEZ}r0$-)7|KJe@LZ#HNQg33 z*TQ?fPz@txWoSW*mO`+6654tobe&57)asn8UGw1BL3|9l8@&9yC|r$AhC|uZPp#JI z->;)2V*wY8#$%%zJX+=$ogY9z)!yl&rMpiD0c!}^a2U}YTs>Moozm1nHEoP6gKO|3 zV`Ls`d~~|iQSC?)vhJI;$64>G!w;8TlAt|g+4t%$dCl#x5ifqYQq)-<(BVph_|9z9 zva=_3AHUWgwzss96I4?|Az9b)^@G`2njGQ%2UT-~gvzt7{`JwZF(e|}FR%BuAF}JZ zzA+dd&wb-Y>+QNdZybW(gV%ZGq47icx|`N@M2}aGlU_JwzyRe{#gP)>l)@Cnx+3Y^j!SwSsC?k(Hk`jZ~Xj zuk(tmK22|r6j`VB*~M>m_(7w=YNq9K^!nFFOe}pYB5cNfb|sDlQQBy$orP9Gv$iK3 zE4ybc!E$2}V(Jo11O-^ANG<=y8mIOgD?7Ej@g}s($VFI*mV2l7rurQxJ5)c+w^V#X zshHwTK=FpdqUEmS*F=7`o4!i_>t1fKh!)7c8?O0z=4XIC(1BQOL6aZr9z^*<= zp1G%(eBVrv#p=XUP68w`+-m?*PU+NrX&nt8fRNm!%jLd`#2Udx6eXBhYn zz_SUySssLvT%jS9h^g@4>w`YY13f>fo0^r*jg?MlS(>09NBJ{u*W$$K(jT88M`d}K zF}t3aLGc_6jUa(k<0i_s>XqF{`v*aiOrTgDy7d|KaT{OgY=6cR5?;ReRl@cAq~)fgwVfC5}jI?T=}8+(+D6qd#W&9~Z=Z#2st; zW7z+=BJLx?0qBqE{>L@=c$k4J1hd}PR{qxwaYbR?la!X`f7#-H@e|e9K@u^L2I4p9}8IFMGdE>TsSMo-$8Mg@FPOs7ub1MfQpZ)ZFuAal$IrvuNe& z^Wk-Wlg78I;hRV3{4DCBTDu(u}UFg2CT}`_P{%d$H zyhyg^^Pd;Vvivu&*O7qr3t$fhA#lXdQe=l14LRCeEDz3Wo&ze|G{p7tGEBKx=CP`q zFP2e0AG_F8{r<(W7vIB|$n2cv6+nw3hel10+)LykeVTu61p~K*j9ln75#PJ?W^J#! z#I)IXiD@%&s%dl3)P34SWQGI1{jDxF_4m5e)IaIcedOzQVbWfsAceHn0fot{v2=w-5tkJ>Z!l&b2>WJ%Vlmh-*D ze0=6Ind`*2lg`=Wb#~m2GQ0`eb(!gW-sRYC(PF>Laar_yze?CRW~xgsH(Ba0mqVFl z%jMv@@JznKjCaTtvbZ|FA%>yhJ=Q@O5$#>bg=dIlf;-cH^J&CEu9tm#=*ah06Z`98>7K_A@jKrARz=^2agMR^fLBRJi4!K2{^_3BkPjjUHY zu9Ddj$E2XT;wtI<^%}OuYN)9;HAr=S4Fpj$eWwoHDL7DtFNkMNoYYV{d=9> z3kK|3h_Ab;6?HZRIJ$eWyxVa6;R&DYcqs^pD+tT9v9q;pTnOSDqxphBWI*}XS3SfETPVzrs^_H_Oy4cQm0Lm#hEjo1Fo^K-%SeK=iy69tWOj_!`K4SfjHYCSnt!L zxN(|v+IVMhV?+gRfb_r3b+U5`#5O#C(b;#zb+V|yNL=WI;ST_JmqSo##45{g10Ou( zR+-YL*;gZUK@Xp|Y^&O$t{LW4klx1>DE1JqH=oXwx$5WZWEmm>VDLePXV##=GU7QC z4I66$uamJB`|rQSS0UN-%((zntyO_kEY_~qYW;MXA43^0?e*!h1TJJ+faajX+J*r? zGUIj0sYqD#o0-!<3?y{8c4z&^n^V(ME@BN={20_UaMPFtPYm?R|Bex3btX9hHF<_? z1GeGn8M0l={yi{5HW@Z~ecmubR%)jr+L&p*eA7t5IC#ZRQW6O*4P0<^}|Rn^7y%6Hz;{UVVBUjuVg7%4~=t->8)xj@yM+ zu<7>+kP<=1y)FJ7pxP4uzB%>+p;xT?Jh8I-kpE#>L9GCJAi}s^59Y_{w_&sft^$52 zP7vliu;Qdq;f>eJ;?M?ENHS!(+trR6Wibq)Ke}Fa)9!&r+(&JfmX5|o4=nQ>FKBgv zDMM+HP)(a4Y9noeQOPw%`sl9(&?ZXZW7z(J^szk#t<^le=MoKVb>j`Pod+|aVb(r2 zTDQSlv5-;FvBnhhCi$})WRFs=4qzD;h-jh}ILnW%;{j2sAOJoKt`f@;?FvM@9kng4rWW2F$tO-N_C zCI2(npB4Kc>1y@jOj!tY1bNAekwy1|CMY-Qay=+JH%a=1!Hoq}T+=@54^grhPW8Z=w9TW*2V&MbKapncaY z+2KH)TVXoaI7@bd8JebUv3@lnj$XlvyTV`Hs(S2yUWzQUr>AXenCD9 z$pE?T@aFwz*bwk-{h1O*r|7+p0QshRn-LbF^j7i)Y$x zjNjFcfX|5NjSR5?HB+=;jvSP(5g+kh5}iz^UHG4B=Nt%{HrjQ!Zpu=fZkGeC#p>+a z5lWnkzRUU)DT% zf~jW~j!Fmt313p|pBt5$C$BOeYVaWhl|tkWISL;p-yzGJS`I;^f7QcsnEDpUSV%h` zmVNW)P$e(J4`BX>rKK(R|a8%=c8lq zs7`muesCEY_=vnneQ=j-g_gg*OLm8Y)xA&35;f#**(&`WE43Bt-T}8P_VA>;aJ(b2W{LVJ! zFZj!U-6x^XQEl#*C$u-SVtS@;7F=LQIG=No1Rub9JIcHD>h719nZEMoBc|jm(0x5~ zL403%CE(o)lwGOMIYAIyC*G94g6qt;#gC4%8A`i-et@ZF4k&-nu zFf?UoAiPVR|DZe%uxWe{+66u9gWBXQgib&shu^jP)$oP#ktPJFTqLheg1SwX2R2!1 z$6Y|1&5LBn$Ai>|3?9G_A9$cUuu+vgBwt29w?E{Ac`ZHww>6j%r;cE5KoY>b)`}8y z&RgtbI~~H9^6$kO%)=gz2eXIm7x;)im(cz%5#1}J5&Z?Vb*ap08Z5B=T6BE%BTa~& zz03>{hD&hr^g7pTnUCnltG&p8GNI-EU>OC-AFPgW437{qSOgGC#n5hC?$eGMq%)=b zQ9am8AC>y@RkK=Cfm6#Lm4`QJc=20+@KadCI`0jw0S@vy)H?b zQo{??p2uYW!dZk>5{W`uS}R~>0%MB$Ep1RoJr1^Ksk-5D4E-VX+~e{Jzoq+?yFyM# z^2*<@9$F#a2FNadLKBE5pOAep9p678uLcy(e^OQ$)aZ`ox8X@-*{IT2%5&S2kc(lw zKq&#YC*jbe1F?Zr9Iv*m)DZl2r97rsqwOZ>!F&jwsIi3#U0};`8h-zHO3w7?2a*ZD z(9_hms-vIY5B$2RXP%aYg}$N_?%-|!D-+uCpnJW)T2@uoGR3m z6=qwsxpVCh7Pel$^cvm&EFk)v4`FW>ycYE=;QkHF0+iE!p8d?iLF(man{-6`H-M>sp{z`WJM71jL@y;o|82I%%JBrLQi>KcEhyX`#d$y>f`5Sd%VdP zYn#*g5V|Up7E(zfpx(qr$~%%xbBxhBU+B zp7_LSG_gT_xLQs|wvjK&5;JdR&wN*1`l1|J?sJ5+hv!L;M<3t{&U$bx@)X)v zP_e!pmB7B4K7TwCYF>f1VeD1eOR`IrC((e52DuTxFH6;=m#`ymRQJ9lD|vFnK*&>h z1A^Eo0;A7JiaKRA_KAcw5ZYr~S|iK7Nbfo?5P{81StBnS;z@#@f~?vIle~lj=;V3G z@x)E0i0b?@fU;iAds$Y(lfziML9Ty~+W4{@4lgx&78<7ZNp^?9gi1A%x@r$OJ zo&bh<)R0$XN~U4U{Lh}*%j{QVIqigAdPSDD0gQ28hA6c|{h*j9I8) z0Ce6|<*(}Pcl@jJ(B>a)Sh_5GRgUkWStWQA>r=GFy7YO@(;ndD-P`~MV0cE2F0#wi zq^o4In!FZr-L==LkKT|K)K#RajMrq_(AMk7GSeh#r>cBSD??hnCbL5|)BW_XbUKTq zm?HHpKBeLl_#SOc_q|&7nv90l#j<>_Zhb>mvUCzlw@ZnAX{r}DKCmnGGnzM9fTI6I8fS0-lU#UH>qX&&~S=a++0jkGmsjY2l&+nu#U0D$O^h0d) zw)wOw_UT9csXZ#jk==6F;Dg&5R(PQZMKGT6+u@d=yO_FiopjQG4NWpAwRoKztvbCa zQ`-5bBW>>;6K$xm<-yEezA(@?zoJ+f(gWZ8N?U|b{2XvB$O^PqJX{Jld^^>>%o1*vb0(}onG>6Fd`@E|>OM$YQHsA~29!XL<~bj# zW}dYDW+l3y`LJgu`y_LwyD#$ri5$nbp1&LU$Lsl4{0_ehG-}?;Ze~f@ZzI*9Tk&1L zhOByMzgdZ9ap1U#Ig?z&r#BxY(JZd#^Gwcrb=A5CW3Nj1R5t?yX6x0^#(AG6DvGmb=-s5}$RemlbFmKkD7g*}6Fr z+{jARuW!k`6Q;!(){4-0b8?TlGhrm&Wd08Zy=uyOP@WIfy!G<5>IG;A(k(Zd+7|tD zU-4dZQZxDbiT9e%``U1|s`r|Qn|JYg`z%woh+DnwKH?{ijpGK#HH=2LWzeSz<4i0qd)vR~q@U+I;F~#}ry1AIvr7O3*BQLQEo27B@Y?h!d z-5@`0QSR^Wf`4tErWS9M_u{(x(eFX`zM0iOsV;s`_J~Q#pp*m0v2x{m@@bi{4&4CD za`9&QTiPszE=AnEOj@dHK9aqlLwfQfc}!+KI-}JsG-Y(RnM#X3mLtI@=sPPYW~In0 z{FJ)%V_5>$`0kJ8Sq1A+quD3sYwU0U2WaUwAsL1Skxw8IhEGA?FLAPsIhDdC#c)K% zi43n$&QyIRpG3~+R#|7UQ(wz};c>$^V9~r@*TP{9yR^cXDgyheBJiBR6<;Fj4_`!NY3C z_p*GT&#!?P`HBS#Vp6TO0#l*sJ~DH>z8Wh%gejCbeblR+-^=bvjZ4rTS*gz3A*WxC zHv^kH)avcnE7q&a@aXszbJ^IuAluh!%X~aynYsM}x7=8n&$i2Madq9P@^|1KE2tO^ zrK0}fPGBJSLAV8a*B)u}3j~&lb>U7md57%MK^L>BmZP%@)pBmV&O^ly;udm8c;aF8 z!VXy+o`tcx$N{k$=4+ZzKkSefC&!G-)s&sGDECX>&!Nek4K8;u!``A6?*x~;XXW~x zatNn1<44&uX&V{?az3WU{3x@|L39et9sfa$HB(zFVqzf53wV(}0DgLuLSYu3Euw)~ zj1L^MV2~|w(~Bz*64S)4&_F=#5UkzCUJ19xrhii){EOPTTb3uT*@6MB*`lmnvZV4x zssa7nSl;#!Kb(kT4`=i4Ka!Ad;VeR*es@fG-)jhjpRyBfZ#JYx?vYUE?YE3{3 z-~qg1*gXGWj8LI7>VAMdFflOVtFUwxt}ev@9r_oPSvpvUPF=@T{y|;6<10gikMxi> z8ubPbXz!+#r{zwa;;#A(4jX`ZHNjBz6ATsbyx}MLp}pi&_4l7;kHodCc?pIJjbBE{q0o*FEPUfU~R!U(e_l1e9YT;Gts!KQVk%HT@Uq+JN6{ zzsRFotw0Z0g$?!KlFwA<-LhBpHn#bD5l%)yJjO7fijx$2I1zy>FnI_G12Cc9sKsz5 z8e#DMe}^uu{{p^5`T<96gq4X$8spXWzavh0bHqWQC;&q1$1&GB5K27WsI)yYx0)yb z_|aV)(A_^m5FZS^LYIjT`$H#gj$2G+V<0=gtsxB219hEE^s0#F5{@>frM$G2=zH~%Wz_1F!j9mCOo03iCH6M9Y{%|Z>if4BmE z{#71bgwZGXqYwI{$0)p?>YTl@Ya%isuH6=O_g;Az*UUG2WnR1M#f6bX_8tF&g49e$ z8p``kPHqFR1*@EZAL9siiCfg2zsb&7Yq%7-5@;}?R|F`)s?XF%zscM(QYx%i+%9VZ z2VrTz!tuiJEf60doDG&1*cal9a{dFP@Yf~ci=_a3wc>1gXX(|;n%NsTY+`v@VTIMC z0}*pYArVfXShbEA8MX6Bcu79P?Sh?LOTfrpHF)MO?npWGs$}4U_pk&5NFN{!2}T8Ij;sI)v;OBB0WQ5 z^c;-=^dKXzI${b$<&5BjDW;LZFCefU$~%Hito#O8!?7H|jcuxY-K|4AAtF=rjl~dn zLP)sk?^ZB_z`e{0_CEd=N+oBvuN-&PqWA1PdJ`t!g5UsJNPyph1Wc&FioivxEjZ0{le6j=lht9D$Da z6F@whFyhv@Pa%bO661bU{z~C5&Xj{V((ou{0Uawvo*g-kZ%G2k=NQ*W0BgNZpv+9gwCHJuly*`4qXH-H?bRrB$@3J zlnBe5d7A1&7m4E<{>IA*D?sXaL$P)0RBKfCKoLcUn;~a3Ko|-$7SPVBsHT9-t|=g> z5onzb2It|Z?c*3?6_^P^PLL1anBJvY;#jptGIY<3MuU?Kl^!Nm8Hk7B2oljX3^BpL z%FAzwy*&3^y7h3AiS`$wdNiE#I#ZS!7F^sHP+toST&t?Ak|9 z63B~YSbpav+<$`eYk~6aDpeT@zLzlVbNt?`u*GIp&*X0=u!^~SVG3Vn$G_C`g(>_p zKmKJAUzox#|6g%e9#>Vh{m;Fyh(YwChzJN55SaugoN(d-VTtopPBC7UL@qHXPC-iQ zFSV>^ElP4odRb1G+O<*>vmA1&XQn>u(I@KX>)Fd*HuviHUFY0$J@E7Q`@Q$qkI!eZ z_S$RhefF@{+Ux9d&b|#sqEQIR5zbB{aZm`!8Bh(@em4c;s1TAPg$@~slR`+2a4raO z+(ig>b1n;U#>Elr7HbybqKhLKV%1u8*M+*~VhMK3-4vq5#S!cl`%#D+E{IP>7u_mSDHsQ6cubID*|`hm0JT-QB^rYYxh_G`QEBD8%Mi8zg=amsQ-3 zVoSu0{+o8InyrNXnsbn)6}CD?j*&p?{%^nMrTHli^QYi}vJlG8&gvcm-+5@h!@c6^ z4pGh)wdso`&-15&aaycya>eRV9=C%G&w01cp|m{1r~N6W<1^A#*LCDU0Pb*2?WtQ= z?Tk`%K|Qz=enZah1p1x_wx_6(>XDP`?W|rJdmQL3Ix6dDBzz+hS{dB+;E-cA?V+Bq zDLxfZ8n#DxOMAMzdh>2frrGi*S@*U|+7owm2$HrVjU#~~6_9bMN++-n>g-N9>et0K zyd)T?ZOI|HgmaTUrB$!N6)JKnI%qs3`27HuY3-d?#rA_naA61Pnt4WQmIEFFAGBT6 zYPK|~*H(XL39eK9>|71T;Y^bhoNY_RO9vEYOtM^ zd^z1iI)OAEe@IAeR$mmfD(&JBuHh37^)aAdtx4OF$B`}AL$j^NHc66#+bWFISsoKW zDdvVfydr?2z0T}GRoi)I0Clh44l!uA4TtUgei!Z*XZT^kx$ctF$LF<;{-5+!f_FFHllmm^_KJvMagpb7ehmJH=+XwW(KH!v2G(A$^ zdc|CM;r(AcsB!JU!jiRT#TPnZ`D|(AuRGDK+nb1!1F3Iyi`pmst$Npt;pj-*;koNo z-wDM1s;uoEa0$lhT~E|uqO!58ZupAI-*Q(g1M1i54tf7H;Ucb=@dK$Uu4Bs-(f&- zx`CSF%!9u)YxRrzp#N$unl8Ci1HYI?t}eKt8a$=ps?9b5s=7G3HEgM^T- zmDoo?d+-Bn(tQ59GevZ6bZR>n7^Jmu60&(=Iq!@PqH0s(&4apv{ivo~3U=momx8s! zFhU;g^6z}M3!O5*Z{iUjn`W9nFme6I`1N3QpSb^BkcZ5xoZXdr2`}OkQ|APEYXTjF zzl09k6u%Hu29w^P>3WNhBx)bw7g-^_MOOvP5#`KhM1apKnSID z{RCb`e%>ArKjO?*Y<0NKQTPk52%+J(AFN<-@rB9x5K6+EDgO*1ISsT+D8(dx0KJJb zXGUT-3wUT0vPQhMPVF&ctl$1doDwpR}EoKQ;gZC0;19$PUyB804bB$Rwi zpYX|0>W-?v3Z;;t(p@zYS9kL=(I&hf?_q1kuV4K|Ev+6>5@$}s!Adr>+^T!v2OyvT z9+nR{BaDWlcgw>lsr?rB!yQC9Z#WN!QMjpXpZ?m7diK5M8g^K<*>(uSWb21kN8pqo zN!Ot>>d7j`?{Y?l)4258cBZW&@N4R$Q7n9N2r4|Vx}l>Xu~gX+xqW~pUasKF;nc%) znST$bu3oo9Ti)jI2#oJ>9uz^bu?O)@5T0+>3xX=!PD)~{MyU_Rwh zwb{l!?O}d5f@;lmyLhyflB;WBQDO#I4sbk*q~Hs2;0B&;zGe#cs!o>A0fGM#n48%XJwA6vy> zU}P-N7TKJ;*z7j)qpqYJrq~`P*IzspX7&sIIfe?moqS8PGQwzU!+?an;)We?nQsXsmm z^}!6)!1|BjI_kIM2GaR%EZ&bb9pTyWG#2PUJpF7s%Z&->^*MelkrIJkOQdw5pAzXa zppSb}iD@s7PNLv;H(gy)6{s|cLXzdsA~+v;``l#N>w4`(z9F!>mIkY;Ikq3wlKi=q zq79R$&d85)?cZtYE@&DXASNpDK_x~9tT3%zMw@b)uMnx3|rvp~o3>dZOdV;+{z zcw`@n4PN;H$T-_2L7UCC?=AxGF@w9Z4-HGcfqJx0mfJ&t@$&rwTZe~iw{!i~TyIw{ zf76Eo4Q1qQH{86pDdVf=2I^&c_oLX3+b^qrQoJOdh{8)==Hk9I*-+R2$MyS!V#rN+ z5D8awDXseB~g`RKI_)pm=Q|QY!N)$}# zv;@CK{YW|mr`(d;FnOidjCa$&ef4tFrcH;>JY6j>sS77u1wxgH`zP9u}+TQpkOd8W39HY|VGXeoV58J(58&rkngy2BidR!myM!!u+i!)HRbL zO#66nCVd6{h`pO)qw3LFiKjdw#lT#r`H3%AV==5ZN4fNFx(@MaS(Mvq?STc2zdbZudHV^8kCLIN2PB;QrJ`V)SU59b%O5u;RdN zoNJ(-1o%3i8BOY;xq6M=#=sjM!?{^B#@Z};kA(&=l%SbduLI0@vV@;($Fd!0!+qg5 zV_;ibk2=G~(m<2R>6|={&YFUEim|HxQFLE6qnl-_ukzptRP1#@OYfLKE6neo!g*E{ z)LGUoyaSATMU=ooB>TKqoiirVOjFOR5*R>>;I!_-mVO+nyM}i^kGf3sq9J{jKbu4e zqw3#7vt>6^USsuuG0Ki9O4}}gp`9&*--$JpYg?Zd9}wb$`zBM0rR6m0!&jhceV+Ik z*o~9vMv~ruwiPuQ8pf{lS>8W|hWD?NisTu)G>oKSxOJ1h+Y-@X31QHGcoro5pe8aH za2T;u5lA|D_Eh@LOB-5e-hEVW>U`mZwl>(z^V)kTCUZM%RG;FG(_kmS1E=AQ9N@fZ zR44eCX&6M{Zqv1V(BW*KP6zMoj9~h@Gg2fhu+5+lxW}0@XkTC*7Bp=fy|Eyw)DDiG zNu~Z;XKbrQU>9$hNo)VL+Q-kLbpbFdFT`LtUPAw{9Ew$S2&zLi{1yV59*eCTG&?ev%I@3*xr;G)TXyEsk~>Sb9g3-Ww0P(p zJ$M^QF?PHIqlHU;VVF*_n}#dgE+2dEk6q!+e7NJsugKmDzIe{3aIY4aoaGqr$fr>e zcQ(J<))!bnDgM9S4im38^OORbgjssIfbRRB;=7Gb+ZY# z_&UAUMMnb5p9v5J zhz4{A!~l8#VgW`O?D@$)pOOGb1oQ;pu0Tl!U{!7<+gnlkxi7c`Ok)F1wV}Uv)6TCK zQkKc*vGx|ljLfw>d=dS*b5IAZBljXJ2wPQ~F&7_l@?v`Q-n}lCv?~bE2Ve!r5cUQ1 z1Ec`@11c7k+EcAVtn=)PQmvrVEEdHJI1BhLzPXJuc>QAP%J(m!h_GB_7J*p_=m>Dn ztfRP)S1rMJqQe4s*iwq>h<#A^tl_(V1^Evxr83hEZdpo0BJ(?HSD6d!3w9Z>AMi5Z zcECS#+A_*EUFEgQ5DMYo;lHh+sWCk}S(MS>{tY10JP07t(yze)Y@I1XaQ+Dm@i$J< zP;Pvl#tpiT(%F!x_feGgz|ur1DKHE$954c4%ufT&TbEELUa^*DnV#U%YKri=5ol35 zfb$F2Ra37X?K*2@D6kB7ZcnSds?=UkVK21myv)x0RW*h9%qFZ0$1kTSp9bVhJ^Oj`a@=^G1SyvE7p_^3tK0%9 zP23Oc$u|$soQ}c479}59Gf|O0aBwh3uAm?@@Zc4cny2%BH7N>4S2>FA%mzLL$TZM< zkd_AO{C!A^kr-()GM#=6X;q#tuAn)?YPwofJIupnq!~KB!A0j+6yy{aB^BkyOmS7kjyYUcOC!wpgz%MGIRBau z4tSKNu9!^ z)X!YFk{qMPyGVDozeORil`w7G1AxW2-X_g9ra@k8BifbUA6V2ZJB+)nqVTClK@0yq zV5tZFn^#maC#Rw+XKr5k+?=`gDy12`PT=JgR1__MO0+HWEBMmHCD048M`-;ctLTNU z2fJx?=I7-vDt448UwUfv1s=MZViT@|Erys?R06fFSTw%Ov7o5XUN%XF82Nhf-r>A% zH4X614!5X^SQyS{S5uU46=<0x&_AuFH-c_~E&$yb5P*H&BeK2_N6w=#n~^6vrqkkV zMO}@wkuQ!}<#Uh6Xo%0X2#e~YZ}EeV(ZYDE)uPOWg!DpInUR1%fT+zqfO`R>0NL!j zh7tqzLtOqo0*2BlmpN+oQjHas7x~b~)KFErx8fh_Aoz_hit)H`= zM)?lxp{d5?9{lEd>g!tyTI50hu$~fpci!eFK1n@%uYnHN_%oiQgdj_-ULNZZ^0NRK z-i=SvfT+>nMS(5>7R_&KhihZ`+b3zI>3d%M6pi#96K7FZT3ou%N{ZuepQ0esCieXU zz2t9-wJVIxEy1i2T}(+^mu8$tIr(0f43xa<7g zprx@o-4S()x^Lv&PeXa;CUWdEv;bS#o1UTQ>ifabSIB8dPX|bY1f<(V-GL6wj!1Ut$qONuI5H71W&GDSz~J^rVM*8b*1P2rbdM5I5>e45D-RGVZ`q?t<~ z1|K57`{4J9r|Ls^ULEy}5(guHQbzi%7g&k{=_<{y*Fj^ek}YcVR-44%)lquh}escf zk43e_MZluXwZPK0Z@6(Iy@_9ODz3-&OmSacS5FB6wS6`3{~WMLzsM)+Dc8K^3mnxz z@trG>rBAp-X$t@gwUDR^N%@nywUDSwL%-G`(G65;TYsH{Hc@=cBFKrt3M>Xlz`7J* z%wMLN%;rtF)ti~ZO`B+x|JNy6IP@DZjtZ!zF20uj+S2x03J27{NXBob4*n^w%)5cx zNi>tedp1*;xv)Q<-At*1eYVhZ$%6-26wxiYwycY~wNIIxHRxf`fdFY^HDK@net!!+ zfRBxPZ>936l!2||7M)Ik%E+3KGSKHsI$K_(&?L(ciyF2Xr*S!? zSGd49^R*JVPqUUI28At_Czq8&Xgn&&0}cVmx-xzUzyBg7gj__v(> zBW*H!Z5e7&ym5~AHoAX&(fm?JS%uWtI9$8`a6nXoF{4^M3VJ1A6<{?WuduKzM~!R| z7g+6L<@Q31&(IN^_cEoMmyX~Uf${X}`pYz;Ys(0W8r$oasD#SO=r(fND>TU`GYwj* zlJ&1pcKjBQLxglSXs0giqTkbLw(P*u(Lfv9cF=6|P#eFz0}Ibin>OX3uk4_Q&BM}p z+D@7}%h;d)K=o7YWks`#3RLf=bs^QdKi#6L-$Z+X13uAOTA7dgD4nY)7r>WLZKS;f zr3>7Qo7`>}Y}z}6lXhV(jLXp0nam8%+l8&*nHjun7bSPALVgbvw~7wVc2t%WDvFq> z{B7rxyC^#AI7EU$UIT{uD5?j=#FrHzAX|(u&?+~0R^=x6qOiK$I5c;5v16eqX>ca@ z*^OwvXC~jfo05}^J%0>kT)i8wb`BRX^4D;~ZWlvS__nqLQINo;6Nw! z@(muNxuJwHJjMw{x@Qa*IVqe9k>6Q@l>35ek(9_%ylDtR?2S!|Uvp0m-9(Wba*$@2 z1IF^ggOp13W5q425fR+G505=TzGj%9*X#6Bb-QsE@+GN@JHgs3e;$HRZS%kjZka1TVf#1M0 z7Wl3WeZx(&<4s!Gw_<`tku{|NAQqt0+mIHgtJBXREhAMifnyI*zPaZ_UUP{0PG3FI zqHccaa^m}CdqtIz0{PJ_dRW(lTQ@KN)FJ30$YkVS2baY?4Jmq^UdukbdcO z9nx8C=rjY(NE_v){YJXJ4ZW!iy;-9R+!vI^tRFycfY31pTFf@J4K1dv%cmhNx~Je~#vPEs^cfc~>zj4T0)Xy9|g~z=`ArnSV(bgO{8)8ra zcUV-4#TI^Fse+t%HtDDC1jSmUpT@k+{Ki}4sD2yb)4}>2vNG-aK})qd&b2zqthu-8 zw5gi+)%lJRyVWt<+S7_MTLBW>2#7(7Dm4J~-L1T`Ipwt|FAla>S!H=e0Z!+69-F}i zM^ndtKS~)>j8(k|aqMgq{t;N3Ch!tqzP-F0`_9UCq@_x^?8|^`$g1lh(o&B;3a{|W zCW`f`xlfC`pXS$^5S;DjOHGu4UnmVZh8w5g`?V!mCRrvyrze;-^VR8zpu@p8UV8^< z-`NXz6@b5FwR7UErj(RdmP*WJFU-J5Ip(X;Q|mF_@BH!@ zoi|svpwTw~zXJTHp#y+Kz%amAz;r+Xpd9cpU^U=rz-GWsz(K$%z@Gts1^f>1n~o3$ z5Dth1^aTt9Oa|lviUAJ;R!+A>DI1X30@wpM1~`O zPa%C8@E+g-ho7O)fD0H6DH00v3sJL2ouQ0`(tNG;%YmbiT_zj0R(naI71nOAvhGK| z4A1g>cAlXGpNpV_K!3?!o}rNe-UZt1b^{jYe2~-6Qa|5ZkaCg51zdfW`g+%cP5{kK zXQ>LmW9#Ydso0)6#lz0w^$k1+uR2Ggqb?O{x8R=w_ki$ScHAcccL4SR?ri5T&fx|t z4Rm|ZV}Yf^6M?0P;3u4?@Q!*twaAyIB7gdMih@U4cAf?XG$UKq8EM}DK(q6m^R$mT zHq5iARx=)XVm%G>_^}TuwezpY7ughmA7EzX66IIE@*x6ZfJ@Y?RTf^xzC^LD pvd%dlxkS|-0Unr*ct94Q81NJaT%|6Z(u%Qt3a9{71MV)i{1?vty5Il+ delta 148850 zcmce<3!D_iwLjj~-SgO;ncZ2~U6y^Y-NP>I0t<)=2ngHgf)7+kjEZmLBf1y`d_?18 z7R3Y=71L;ABnAx%CO+_D0vZ!RiK6&`NEBa)2}YA^t|ZrAuDQ|p|9($(&&)2Ec<=xB z`H9do)m5iXojP@1b*kpm8|r@k=zz3w#zo&$hGD2Zs`=LRp-str_@8mQg-`10(+%VF zn3Spft>0{VWW^MvQvNP=jP;iFhCjya7-?AeV_5vxwi1R_R%YNstgPHfSe8=wCz(td zF^m88>+df!n*m_GdBBkBxDhjKWyK6DkpvFq_>2Ekjb+4?{?Asmem`sf`~U^;34@rj zAM}TUxE)JaW$9SVDlaQ9w_+-8NGr=mwHQHJ=+(BYI)01A;%Em5{9k2lr3~B1+HpM7 ztea3OuK$yk(YG`}nkO4+c8RJOgULZDbD+ZK42H)Fanp*|^Mg{B%9wx@t7>S>7-qs$ z#6+noWi_FK{?9ZmbC8`-bJdILMc=in%Xj^5qmjxR-mc&IQ|zYw)~eY2v*(_Fx$#pK zn|I0C^Dj5nsl+$W`^Nk;EuM%fpcJ`T<;NxS;zUY#(E;JtZZ?cD2dsK^mi`|qu z>+Fjzo`2!x#-G(_e6R8U({5CM@w2i0Mt!W3XPkfjg=Z4XPt5YO&Mtg=z|77+d)_7I z%|H91(=NLBj5+6B@D1Y;e{QV0;}Nr}@aDXW&jtz?&Nm)0`=56KzMON$nP;DN>Dluy zI`6^@P8*LFkHnht*ICN&RO$tF!t5VezcqhuE>fqSa@uP10d@7YD&M2NqZXKb*O zTCD1u0`+~>aEDs1oL`zZst3(A=8-cVG9Nbo&0K3fYW~#xnYqqfZ$4%|Zr-FCo0h3N z)s5=6*3Ifi>K^r7wbQy=-KAEjt9-E?`5pDTdP}{j-cUQ$hidkX>UY-1>My8zgL$2Ko$4`X|G>NvI4?GDGOsrm zp%r_)1vuWQ*k@pV2W59!OVkE)iFvE}u3Bn-rhN0Zy!p1e*8B&m-E3ZCE;PSuETDj{>%Kt{J{J_=3i01 z+k6lIF15aA`PNl8s#`Jq?_0~Qwbmon{T5%}s2;U`ZarbWYyHBi{H67zwadECddDh% z;Mtlt{L>Sg)O&vU@zdJ9mTt$+-e)=qFWK$HoJ5=1l2d$)$i9TqHnYv{bX4{ue`)er zwKB-s=A`&-mXXTd?%!2*JxWeFLPaHOyUWKYwPWoMQfDjYH)dL;9Mj8ow_ApraLjfq z=_Vb^`_N#QJN#VcBK6|h+cWEw`i*~drJH@=z70lpgM~IuH@bY)&sR35fQ0JG7>)@P z?yo$e^+nUM+RS9eOj{{$6IyuV0CTg^?S0BGJ5~Y4!)xoZ2Pqlhk!t(eyQ+RotmgIK zt)@qPD4@_|W&~KLs{mp|w)S@ocLb5(&^_v-wVMZdLK0`;RAOX$pTsa?Z*`*ETdlGzier2+8LjDUwYzhi2~>(+ zqpsBrLb0~L)u{*Me|L^SuM^!9@b6Oh%mKfIw97k&x5wyiGYyif%{(6ySCJcm+7oj* z^-*wZe^ot=BsILHs#t9acuWdcloT$H3RkP{?6(N5jzGP-?(C(h)V;y!Bh1EN=HKm@ z|7Na5ee}J-C!(8^20Qro%E8W54X~P>bY&FUW%&{PRI>M^E;k5PCYh!BqyCi5ezbPy z;E`rrGmYPGNRRoc@|OhWG9}8x71ty;tqo*(dxfhBX`+6*;yDy6p3i0BvU4wfIP4B5f}< z*1Q;x&mP%;Ihc!2SqLifvS)h+mZ6n>PH}iisdBKySJ7e+KF^AqL&q2t{8<@atd+?Z#$@pOz5 z6CkEu)6>(l;gz*>M((ewmqV~+?;@|1L6GQg{=bdduR=F;EKn^DwEjHmQLL{~9jXS{ zJuw=qVC~zZr>e?Adk>NgNR1q`T>2bqHiARV2}T_rX)bN7t3Ud?$IMoL@+a^AYSVvU za+98sPI9?`CN>_)2seMf1De%xf7Ssb%?+>k3l3Dx zZnIAWZ`t-&tPQU$4EBrJ?f!!Cn<}ZWAVsYR;K;ar3P`m$Za14BnL*VE^;Lh!geiUC zubwarhUqI4CRc2ue%uPZ703L);x|tm3kn}MaYL=}sh5FlPf=H9F(~TF5tCf?l7IB1 zK}Gyxo^^3f2|MN|HLB-0b_%T z9tSlQN13dM>TXm{cvw}5V9BAXS|x+IhpFacZO=F?W1(9cI?=OTMMYMaim*4R?N|z2 zod6Ezbf9K>SI>h5pfm#L8(=0F1|Bvj8{9oj)gHpG+f9R5*j^jEk7J}n7kHT6xy1C0 zk>Vmz^Jo>oQt_(K@5TT%B(9KPUYDwGEJGdZV!VOG=MuNMcuin|`3Y8asitGfKys3+ z8inOTekggeB_3J=#k|pa5;oigf#!Ofei$;aXM<$g3c}RrZ~k)!cQ^$a06|hb)|J6z z#(<{@73;?R1uGjObuw;pTm7fOMy#te#QNf!`Kg+9u@JkxDg9@Eymsc%nb4*wmfr8r zJo*U#ugB0x{rSwJ&}G@IOJKp}XPu+!egaNyGv{V7fi2NZTp2**kD_ih?k+O4fdRziLQX%Sf~R1Tu8;eM|C@?>=y8lJKpRx^PTty%csNG zqsaGIa;6Kp?Al^scfhT4E75GR)$KOoxe3oYJeQl@u8Zd)JP*QiJIZr-K5BQn1Mysm z=LkHvp!`TYSK<2vc4bM2{3L&ZxwFi4@KL=P_xGGouPXi2?8$8@j??r$2vH?=e-Jb} zj1P!q#(-Q%I+gys**P>>I@`_f3hU~z>|!mD5Dni|UT#`Oc@=Il-ND6ui`A_cG-xx? zxCtr~piIvmYc8_VBT^uabiM)hXe#?W@Mtq%uple&+-#8+ZRRGdHa<64xujP+J(B?$ zojB(V1VOt>tl;_DL*ZBG|LlCHk}?IV6l)eu7lloS6UW6?ZUE-LB5hiBES^Y~m8a5` zkb3=r^YD~2SO5bd@9(se%CnQ8Z7{Fk4U4Q~dYkiBB-vo3wF5B-IS$73^f;cAaR6T% z_yQcJvK_;qC~VXqUa)AglF{1PjCiNAQ$kePD$~X&sXo7XU+7>Y{~L5#i|8CuicU+2PDhB&q!69vbZb849JR_*(=xe2j|bC7#QYsS zRk=s8CTJ1&YNurc3??*Dq^WZ>OcU7730fr(10hjnt;#ri!8-=rcL_ z?#!rlTgv&$s?4ChTF*r5uave1!opsq*v#A;o1rPEJ)-xYPx}ITqtgF|-c3b%Uqo!c zsWSaw8JYeud}8`RQJMbsvem25}ut z?anjm+xNMYT8d=57?Zrj>dwV|_v_X9MdG9Bbv{kN^q3GpdS%0D#3EQ^jk7*c?2Dp; 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

    *|RZb5^NFt@6rnfxyTD=Pq-$>#qIR=8Ic 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 #*N&!)v*2<7=xAJiDjBx4BW2f_11Qru6A?p7 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 Sd9@XIcnh!#I0(Er$MSzf9bMM| diff --git a/test/e2e/bytecode/version.txt b/test/e2e/bytecode/version.txt index fe1e8905d..213d6e302 100644 --- a/test/e2e/bytecode/version.txt +++ b/test/e2e/bytecode/version.txt @@ -1 +1 @@ -fbbec8678137a979b66ba02895385c013341ba21 +cd74000f248bda1179d218501fb2296577be024c diff --git a/test/e2e/configurer/chain/queries_btcstaking_contract.go b/test/e2e/configurer/chain/queries_btcstaking_contract.go index db6f8c071..4d6d673f7 100644 --- a/test/e2e/configurer/chain/queries_btcstaking_contract.go +++ b/test/e2e/configurer/chain/queries_btcstaking_contract.go @@ -9,46 +9,85 @@ import ( "github.com/stretchr/testify/require" ) -type ConsumerFpResponse struct { - ConsumerFps []ConsumerFp `json:"fps"` +type ConsumerFpsResponse struct { + ConsumerFps []SingleConsumerFpResponse `json:"fps"` } -// ConsumerFp represents the finality provider data returned by the contract query. +// SingleConsumerFpResponse represents the finality provider data returned by the contract query. // For more details, refer to the following links: // https://github.com/babylonchain/babylon-contract/blob/v0.5.3/packages/apis/src/btc_staking_api.rs // https://github.com/babylonchain/babylon-contract/blob/v0.5.3/contracts/btc-staking/src/msg.rs // https://github.com/babylonchain/babylon-contract/blob/v0.5.3/contracts/btc-staking/schema/btc-staking.json -type ConsumerFp struct { +type SingleConsumerFpResponse struct { BtcPkHex string `json:"btc_pk_hex"` SlashedBabylonHeight uint64 `json:"slashed_babylon_height"` SlashedBtcHeight uint64 `json:"slashed_btc_height"` ChainID string `json:"chain_id"` } -type ConsumerDelegationResponse struct { - ConsumerDelegations []ConsumerDelegation `json:"delegations"` +type ConsumerDelegationsResponse struct { + ConsumerDelegations []SingleConsumerDelegationResponse `json:"delegations"` } -type ConsumerDelegation struct { - BtcPkHex string `json:"btc_pk_hex"` - FpBtcPkList []string `json:"fp_btc_pk_list"` - StartHeight uint64 `json:"start_height"` - EndHeight uint64 `json:"end_height"` - TotalSat uint64 `json:"total_sat"` - StakingTx []byte `json:"staking_tx"` - SlashingTx []byte `json:"slashing_tx"` +type SingleConsumerDelegationResponse struct { + BtcPkHex string `json:"btc_pk_hex"` + FpBtcPkList []string `json:"fp_btc_pk_list"` + StartHeight uint64 `json:"start_height"` + EndHeight uint64 `json:"end_height"` + TotalSat uint64 `json:"total_sat"` + StakingTx []byte `json:"staking_tx"` + SlashingTx []byte `json:"slashing_tx"` + DelegatorSlashingSig []byte `json:"delegator_slashing_sig"` + CovenantSigs []CovenantAdaptorSignatures `json:"covenant_sigs"` + StakingOutputIdx uint32 `json:"staking_output_idx"` + UnbondingTime uint32 `json:"unbonding_time"` + UndelegationInfo *BtcUndelegationInfo `json:"undelegation_info"` + ParamsVersion uint32 `json:"params_version"` +} + +type BtcUndelegationInfo struct { + UnbondingTx []byte `json:"unbonding_tx"` + DelegatorUnbondingSig []byte `json:"delegator_unbonding_sig"` + CovenantUnbondingSigList []SignatureInfo `json:"covenant_unbonding_sig_list"` + SlashingTx []byte `json:"slashing_tx"` + DelegatorSlashingSig []byte `json:"delegator_slashing_sig"` + CovenantSlashingSigs []CovenantAdaptorSignatures `json:"covenant_slashing_sigs"` +} + +type SignatureInfo struct { + Pk []byte `json:"pk"` + Sig []byte `json:"sig"` +} + +type CovenantAdaptorSignatures struct { + CovPk []byte `json:"cov_pk"` + AdaptorSigs [][]byte `json:"adaptor_sigs"` } type ConsumerDelegationsByFpResponse struct { StakingTxHashes []string `json:"hashes"` } +type ConsumerFpInfo struct { + BtcPkHex string `json:"btc_pk_hex"` + Power uint64 `json:"power"` +} + +type ConsumerFpsByPowerResponse struct { + Fps []ConsumerFpInfo `json:"fps"` +} + +type SingleConsumerFpPowerResponse struct { + BtcPkHex string `json:"btc_pk_hex"` + Power uint64 `json:"power"` +} + // QueryConsumerFps queries all finality providers stored in the staking contract -func (n *NodeConfig) QueryConsumerFps(stakingContractAddr string) (*ConsumerFpResponse, error) { +func (n *NodeConfig) QueryConsumerFps(stakingContractAddr string) (*ConsumerFpsResponse, error) { queryMsg := `{"finality_providers":{}}` var ( smartContractResponse *wasmtypes.QuerySmartContractStateResponse - result ConsumerFpResponse + result ConsumerFpsResponse err error ) require.Eventually(n.t, func() bool { @@ -65,11 +104,11 @@ func (n *NodeConfig) QueryConsumerFps(stakingContractAddr string) (*ConsumerFpRe } // QueryConsumerDelegations queries all BTC delegations stored in the staking contract -func (n *NodeConfig) QueryConsumerDelegations(stakingContractAddr string) (*ConsumerDelegationResponse, error) { +func (n *NodeConfig) QueryConsumerDelegations(stakingContractAddr string) (*ConsumerDelegationsResponse, error) { queryMsg := `{"delegations":{}}` var ( smartContractResponse *wasmtypes.QuerySmartContractStateResponse - result ConsumerDelegationResponse + result ConsumerDelegationsResponse err error ) require.Eventually(n.t, func() bool { @@ -107,11 +146,11 @@ func (n *NodeConfig) QueryConsumerDelegationsByFp(stakingContractAddr string, fp } // QuerySingleConsumerFp queries a specific finality provider by Bitcoin public key hex -func (n *NodeConfig) QuerySingleConsumerFp(stakingContractAddr string, btcPkHex string) (*ConsumerFp, error) { +func (n *NodeConfig) QuerySingleConsumerFp(stakingContractAddr string, btcPkHex string) (*SingleConsumerFpResponse, error) { queryMsg := fmt.Sprintf(`{"finality_provider":{"btc_pk_hex":"%s"}}`, btcPkHex) var ( smartContractResponse *wasmtypes.QuerySmartContractStateResponse - result ConsumerFp + result SingleConsumerFpResponse err error ) require.Eventually(n.t, func() bool { @@ -128,11 +167,59 @@ func (n *NodeConfig) QuerySingleConsumerFp(stakingContractAddr string, btcPkHex } // QuerySingleConsumerDelegation queries a specific BTC delegation by staking tx hash hex -func (n *NodeConfig) QuerySingleConsumerDelegation(stakingContractAddr string, stakingTxHashHex string) (*ConsumerDelegation, error) { +func (n *NodeConfig) QuerySingleConsumerDelegation(stakingContractAddr string, stakingTxHashHex string) (*SingleConsumerDelegationResponse, error) { queryMsg := fmt.Sprintf(`{"delegation":{"staking_tx_hash_hex":"%s"}}`, stakingTxHashHex) var ( smartContractResponse *wasmtypes.QuerySmartContractStateResponse - result ConsumerDelegation + result SingleConsumerDelegationResponse + err error + ) + require.Eventually(n.t, func() bool { + smartContractResponse, err = n.QueryWasmSmart(stakingContractAddr, queryMsg) + if err != nil || smartContractResponse == nil || smartContractResponse.Data == nil { + return false + } + + err = json.Unmarshal(smartContractResponse.Data, &result) + return err == nil + }, time.Second*20, time.Second) + + return &result, err +} + +// QueryConsumerFpsByPower returns all finality providers with their respective power +func (n *NodeConfig) QueryConsumerFpsByPower(stakingContractAddr string) (*ConsumerFpsByPowerResponse, error) { + queryMsg := `{"finality_providers_by_power":{}}` + var ( + smartContractResponse *wasmtypes.QuerySmartContractStateResponse + result ConsumerFpsByPowerResponse + err error + ) + require.Eventually(n.t, func() bool { + smartContractResponse, err = n.QueryWasmSmart(stakingContractAddr, queryMsg) + if err != nil || smartContractResponse == nil || smartContractResponse.Data == nil { + return false + } + + err = json.Unmarshal(smartContractResponse.Data, &result) + return err == nil + }, time.Second*20, time.Second) + + return &result, err +} + +// QuerySingleConsumerFpPower queries a specific finality provider by Bitcoin public key hex and returns its power +func (n *NodeConfig) QuerySingleConsumerFpPower(stakingContractAddr string, fpBtcPkHex string, height *uint64) (*SingleConsumerFpPowerResponse, error) { + var queryMsg string + if height != nil { + queryMsg = fmt.Sprintf(`{"finality_provider_info":{"btc_pk_hex":"%s", "height": "%d"}}`, fpBtcPkHex, *height) + } else { + queryMsg = fmt.Sprintf(`{"finality_provider_info":{"btc_pk_hex":"%s"}}`, fpBtcPkHex) + } + + var ( + smartContractResponse *wasmtypes.QuerySmartContractStateResponse + result SingleConsumerFpPowerResponse err error ) require.Eventually(n.t, func() bool { From 5d0062733e3f8d4753ea1791f31e8be50ec260c2 Mon Sep 17 00:00:00 2001 From: lesterli Date: Wed, 12 Jun 2024 22:48:44 -0400 Subject: [PATCH 28/85] feat: Add `cosmwasm_2_0` to `wasmCapabilities` (#255) --- app/app.go | 2 +- test/e2e/btc_staking_integration_e2e_test.go | 17 +++++++++-------- .../chain/commands_btcstaking_integration.go | 14 +++++--------- .../keeper/btc_staking_consumer_events_test.go | 7 +++---- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/app/app.go b/app/app.go index b37ed1f93..104509292 100644 --- a/app/app.go +++ b/app/app.go @@ -173,7 +173,7 @@ var ( // The last arguments can contain custom message handlers, and custom query handlers, // if we want to allow any custom callbacks // See https://github.com/CosmWasm/cosmwasm/blob/main/docs/CAPABILITIES-BUILT-IN.md - wasmCapabilities = []string{"iterator", "stargate", "cosmwasm_1_1", "cosmwasm_1_2", "staking", "babylon"} + wasmCapabilities = []string{"iterator", "stargate", "cosmwasm_1_1", "cosmwasm_1_2", "cosmwasm_1_3", "cosmwasm_1_4", "cosmwasm_2_0", "staking", "babylon"} // DefaultNodeHome default home directories for the application daemon DefaultNodeHome string diff --git a/test/e2e/btc_staking_integration_e2e_test.go b/test/e2e/btc_staking_integration_e2e_test.go index 03e12411e..46ca8a49f 100644 --- a/test/e2e/btc_staking_integration_e2e_test.go +++ b/test/e2e/btc_staking_integration_e2e_test.go @@ -2,6 +2,7 @@ package e2e import ( "encoding/hex" + "github.com/cosmos/cosmos-sdk/types" "math" "time" @@ -16,7 +17,6 @@ import ( "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/wire" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/types/query" channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" "github.com/stretchr/testify/suite" @@ -419,7 +419,8 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerFP(babylonNode *cha czFp, err := datagen.GenRandomCustomFinalityProvider(r, czFpBTCSK, babylonNode.SecretKey, consumerId) s.NoError(err) babylonNode.CreateConsumerFinalityProvider( - czFp.BabylonPk, czFp.BtcPk, czFp.Pop, consumerId, czFp.Description.Moniker, + "val", + czFp.BtcPk, czFp.Pop, consumerId, czFp.Description.Moniker, czFp.Description.Identity, czFp.Description.Website, czFp.Description.SecurityContact, czFp.Description.Details, czFp.Commission, ) @@ -431,7 +432,6 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerFP(babylonNode *cha actualFp := babylonNode.QueryConsumerFinalityProvider(consumerId, czFp.BtcPk.MarshalHex()) s.Equal(czFp.Description, actualFp.Description) s.Equal(czFp.Commission, actualFp.Commission) - s.Equal(czFp.BabylonPk, actualFp.BabylonPk) s.Equal(czFp.BtcPk, actualFp.BtcPk) s.Equal(czFp.Pop, actualFp.Pop) s.Equal(czFp.SlashedBabylonHeight, actualFp.SlashedBabylonHeight) @@ -449,7 +449,7 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyBabylonFP(babylonNode *chai babylonFpBTCSK, _, _ := datagen.GenRandomBTCKeyPair(r) babylonFp, err := datagen.GenRandomCustomFinalityProvider(r, babylonFpBTCSK, babylonNode.SecretKey, "") s.NoError(err) - babylonNode.CreateFinalityProvider(babylonFp.BabylonPk, babylonFp.BtcPk, babylonFp.Pop, babylonFp.Description.Moniker, babylonFp.Description.Identity, babylonFp.Description.Website, babylonFp.Description.SecurityContact, babylonFp.Description.Details, babylonFp.Commission) + babylonNode.CreateFinalityProvider("val", babylonFp.BtcPk, babylonFp.Pop, babylonFp.Description.Moniker, babylonFp.Description.Identity, babylonFp.Description.Website, babylonFp.Description.SecurityContact, babylonFp.Description.Details, babylonFp.Commission) // wait for a block so that above txs take effect babylonNode.WaitForNextBlock() @@ -459,7 +459,6 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyBabylonFP(babylonNode *chai s.Len(actualFps, 1) s.Equal(babylonFp.Description, actualFps[0].Description) s.Equal(babylonFp.Commission, actualFps[0].Commission) - s.Equal(babylonFp.BabylonPk, actualFps[0].BabylonPk) s.Equal(babylonFp.BtcPk, actualFps[0].BtcPk) s.Equal(babylonFp.Pop, actualFps[0].Pop) s.Equal(babylonFp.SlashedBabylonHeight, actualFps[0].SlashedBabylonHeight) @@ -475,6 +474,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod */ delBbnSk := nonValidatorNode.SecretKey + delBbnAddr := types.AccAddress(delBbnSk.PubKey().Address().Bytes()) // BTC staking params, BTC delegation key pairs and PoP params := nonValidatorNode.QueryBTCStakingParams() @@ -487,7 +487,7 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod covenantBTCPKs = append(covenantBTCPKs, covenantPK.MustToBTCPK()) } // NOTE: we use the node's secret key as Babylon secret key for the BTC delegation - pop, err := bstypes.NewPoP(delBbnSk, czDelBtcSk) + pop, err := bstypes.NewPoPBTC(delBbnAddr, czDelBtcSk) s.NoError(err) // generate staking tx and slashing tx stakingTimeBlocks := uint16(math.MaxUint16) @@ -558,7 +558,6 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod // submit the message for creating BTC delegation delBTCPKs := []bbn.BIP340PubKey{*bbn.NewBIP340PubKeyFromBTCPK(czDelBtcPk)} nonValidatorNode.CreateBTCDelegation( - delBbnSk.PubKey().(*secp256k1.PubKey), delBTCPKs, pop, stakingTxInfo, @@ -569,9 +568,11 @@ func (s *BTCStakingIntegrationTestSuite) createBabylonDelegation(nonValidatorNod delegatorSig, testUnbondingInfo.UnbondingTx, testUnbondingInfo.SlashingTx, - uint16(unbondingTime), + unbondingTime, btcutil.Amount(unbondingValue), delUnbondingSlashingSig, + "val", + false, ) // wait for a block so that above txs take effect diff --git a/test/e2e/configurer/chain/commands_btcstaking_integration.go b/test/e2e/configurer/chain/commands_btcstaking_integration.go index 2782b2ec3..94145a337 100644 --- a/test/e2e/configurer/chain/commands_btcstaking_integration.go +++ b/test/e2e/configurer/chain/commands_btcstaking_integration.go @@ -1,12 +1,10 @@ package chain import ( - "encoding/hex" - sdkmath "cosmossdk.io/math" + "fmt" bbn "github.com/babylonchain/babylon/types" bstypes "github.com/babylonchain/babylon/x/btcstaking/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/stretchr/testify/require" ) @@ -21,13 +19,9 @@ func (n *NodeConfig) RegisterConsumer(consumerId, consumerName, consumerDesc str n.LogActionF("successfully registered consumer on babylon") } -func (n *NodeConfig) CreateConsumerFinalityProvider(babylonPK *secp256k1.PubKey, btcPK *bbn.BIP340PubKey, pop *bstypes.ProofOfPossession, consumerId, moniker, identity, website, securityContract, details string, commission *sdkmath.LegacyDec) { +func (n *NodeConfig) CreateConsumerFinalityProvider(walletAddrOrName string, btcPK *bbn.BIP340PubKey, pop *bstypes.ProofOfPossessionBTC, consumerId, moniker, identity, website, securityContract, details string, commission *sdkmath.LegacyDec) { n.LogActionF("creating consumer finality provider") - // get babylon PK hex - babylonPKBytes, err := babylonPK.Marshal() - require.NoError(n.t, err) - babylonPKHex := hex.EncodeToString(babylonPKBytes) // get BTC PK hex btcPKHex := btcPK.MarshalHex() // get pop hex @@ -35,7 +29,9 @@ func (n *NodeConfig) CreateConsumerFinalityProvider(babylonPK *secp256k1.PubKey, require.NoError(n.t, err) cmd := []string{ - "babylond", "tx", "btcstaking", "create-finality-provider", babylonPKHex, btcPKHex, popHex, "--from=val", "--consumer-id", consumerId, "--moniker", moniker, "--identity", identity, "--website", website, "--security-contact", securityContract, "--details", details, "--commission-rate", commission.String(), + "babylond", "tx", "btcstaking", "create-finality-provider", btcPKHex, popHex, + fmt.Sprintf("--from=%s", walletAddrOrName), + "--consumer-id", consumerId, "--moniker", moniker, "--identity", identity, "--website", website, "--security-contact", securityContract, "--details", details, "--commission-rate", commission.String(), } _, _, err = n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) require.NoError(n.t, err) diff --git a/x/btcstaking/keeper/btc_staking_consumer_events_test.go b/x/btcstaking/keeper/btc_staking_consumer_events_test.go index 478fe8d36..983067e2d 100644 --- a/x/btcstaking/keeper/btc_staking_consumer_events_test.go +++ b/x/btcstaking/keeper/btc_staking_consumer_events_test.go @@ -64,7 +64,6 @@ func FuzzSetBTCStakingEventStore_NewFp(f *testing.F) { // Assert individual fields require.Equal(t, fp.Description.Moniker, evFp.Description.Moniker) require.Equal(t, fp.Commission.String(), evFp.Commission) - require.Equal(t, fp.BabylonPk, evFp.BabylonPk) require.Equal(t, fp.BtcPk.MarshalHex(), evFp.BtcPkHex) require.Equal(t, fp.Pop, evFp.Pop) require.Equal(t, fp.ConsumerId, evFp.ConsumerId) @@ -93,7 +92,7 @@ func FuzzSetBTCStakingEventStore_ActiveDel(f *testing.F) { // register a random consumer on Babylon randomConsumer := registerAndVerifyConsumer(t, r, h) - // create new consumer finality provider + // create a new consumer finality provider _, consumerFpPK, _, err := h.CreateConsumerFinalityProvider(r, randomConsumer.ConsumerId) require.NoError(t, err) // create new Babylon finality provider @@ -183,7 +182,7 @@ func FuzzSetBTCStakingEventStore_UnbondedDel(f *testing.F) { // register a random consumer on Babylon randomConsumer := registerAndVerifyConsumer(t, r, h) - // create new consumer finality provider + // create a new consumer finality provider _, consumerFpPK, _, err := h.CreateConsumerFinalityProvider(r, randomConsumer.ConsumerId) require.NoError(t, err) // create new Babylon finality provider @@ -219,7 +218,7 @@ func FuzzSetBTCStakingEventStore_UnbondedDel(f *testing.F) { UnbondingTxSig: bbn.NewBIP340SignatureFromBTCSig(delUnbondingSig), } - // ensure the system does not panick due to a bogus unbonding msg + // ensure the system does not panic due to a bogus unbonding msg bogusMsg := *msg bogusMsg.StakingTxHash = datagen.GenRandomBtcdHash(r).String() _, err = h.MsgServer.BTCUndelegate(h.Ctx, &bogusMsg) From db66211b67afe768bd96fb0e6d1bacc7ba0260a4 Mon Sep 17 00:00:00 2001 From: lesterli Date: Mon, 17 Jun 2024 21:05:59 -0400 Subject: [PATCH 29/85] feat: Add Grpc querier (#257) --- app/app.go | 1 + wasmbinding/grpc_whitelist.go | 20 +++ wasmbinding/test/custom_query_test.go | 114 ++++-------------- wasmbinding/test/grpc_query_test.go | 97 +++++++++++++++ wasmbinding/test/testutils.go | 81 +++++++++++++ .../testdata/artifacts/testgrpc-aarch64.wasm | Bin 0 -> 253512 bytes wasmbinding/testdata/artifacts/testgrpc.wasm | Bin 0 -> 245597 bytes wasmbinding/wasm.go | 14 +++ 8 files changed, 235 insertions(+), 92 deletions(-) create mode 100644 wasmbinding/grpc_whitelist.go create mode 100644 wasmbinding/test/grpc_query_test.go create mode 100644 wasmbinding/test/testutils.go create mode 100644 wasmbinding/testdata/artifacts/testgrpc-aarch64.wasm create mode 100644 wasmbinding/testdata/artifacts/testgrpc.wasm diff --git a/app/app.go b/app/app.go index 104509292..daf4e680b 100644 --- a/app/app.go +++ b/app/app.go @@ -740,6 +740,7 @@ func NewBabylonApp( } wasmOpts = append(owasm.RegisterCustomPlugins(&app.EpochingKeeper, &app.ZoneConciergeKeeper, &app.BTCLightClientKeeper), wasmOpts...) + wasmOpts = append(owasm.RegisterGrpcQueries(*bApp.GRPCQueryRouter(), appCodec), wasmOpts...) app.WasmKeeper = wasmkeeper.NewKeeper( appCodec, diff --git a/wasmbinding/grpc_whitelist.go b/wasmbinding/grpc_whitelist.go new file mode 100644 index 000000000..9f38ef44b --- /dev/null +++ b/wasmbinding/grpc_whitelist.go @@ -0,0 +1,20 @@ +package wasmbinding + +import ( + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + bsttypes "github.com/babylonchain/babylon/x/btcstaking/types" + bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" + epochtypes "github.com/babylonchain/babylon/x/epoching/types" +) + +// WhitelistedGrpcQuery returns the whitelisted Grpc queries +func WhitelistedGrpcQuery() wasmkeeper.AcceptedQueries { + return wasmkeeper.AcceptedQueries{ + // btcstkconsumer + "/babylon.btcstkconsumer.v1.Query/FinalityProvider": &bsctypes.QueryFinalityProviderResponse{}, + // btcstaking + "/babylon.btcstaking.v1.Query/FinalityProviderCurrentPower": &bsttypes.QueryFinalityProviderCurrentPowerResponse{}, + // for testing + "/babylon.epoching.v1.Query/CurrentEpoch": &epochtypes.QueryCurrentEpochResponse{}, + } +} diff --git a/wasmbinding/test/custom_query_test.go b/wasmbinding/test/custom_query_test.go index 6237edaf6..2e736ee97 100644 --- a/wasmbinding/test/custom_query_test.go +++ b/wasmbinding/test/custom_query_test.go @@ -3,20 +3,13 @@ package wasmbinding import ( "encoding/json" "math/rand" - "os" "runtime" "testing" "time" - "cosmossdk.io/math" "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmvmtypes "github.com/CosmWasm/wasmvm/v2/types" - "github.com/cometbft/cometbft/crypto" - "github.com/cometbft/cometbft/crypto/ed25519" - cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/stretchr/testify/require" "github.com/babylonchain/babylon/app" @@ -39,9 +32,9 @@ func getArtifactPath() string { var pathToContract = getArtifactPath() func TestQueryEpoch(t *testing.T) { - acc := randomAccountAddress() - babylonApp, ctx := setupAppWithContext(t) - fundAccount(t, ctx, babylonApp, acc) + acc := RandomAccountAddress() + babylonApp, ctx := SetupAppWithContext(t) + FundAccount(t, ctx, babylonApp, acc) contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) @@ -60,9 +53,9 @@ func TestQueryEpoch(t *testing.T) { } func TestFinalizedEpoch(t *testing.T) { - acc := randomAccountAddress() - babylonApp, ctx := setupAppWithContext(t) - fundAccount(t, ctx, babylonApp, acc) + acc := RandomAccountAddress() + babylonApp, ctx := SetupAppWithContext(t) + FundAccount(t, ctx, babylonApp, acc) // babylonApp.ZoneConciergeKeeper contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) @@ -87,9 +80,9 @@ func TestFinalizedEpoch(t *testing.T) { } func TestQueryBtcTip(t *testing.T) { - acc := randomAccountAddress() - babylonApp, ctx := setupAppWithContext(t) - fundAccount(t, ctx, babylonApp, acc) + acc := RandomAccountAddress() + babylonApp, ctx := SetupAppWithContext(t) + FundAccount(t, ctx, babylonApp, acc) contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) @@ -108,9 +101,9 @@ func TestQueryBtcTip(t *testing.T) { } func TestQueryBtcBase(t *testing.T) { - acc := randomAccountAddress() - babylonApp, ctx := setupAppWithContext(t) - fundAccount(t, ctx, babylonApp, acc) + acc := RandomAccountAddress() + babylonApp, ctx := SetupAppWithContext(t) + FundAccount(t, ctx, babylonApp, acc) contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) @@ -128,9 +121,9 @@ func TestQueryBtcBase(t *testing.T) { } func TestQueryBtcByHash(t *testing.T) { - acc := randomAccountAddress() - babylonApp, ctx := setupAppWithContext(t) - fundAccount(t, ctx, babylonApp, acc) + acc := RandomAccountAddress() + babylonApp, ctx := SetupAppWithContext(t) + FundAccount(t, ctx, babylonApp, acc) contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) tip := babylonApp.BTCLightClientKeeper.GetTipInfo(ctx) @@ -149,9 +142,9 @@ func TestQueryBtcByHash(t *testing.T) { } func TestQueryBtcByNumber(t *testing.T) { - acc := randomAccountAddress() - babylonApp, ctx := setupAppWithContext(t) - fundAccount(t, ctx, babylonApp, acc) + acc := RandomAccountAddress() + babylonApp, ctx := SetupAppWithContext(t) + FundAccount(t, ctx, babylonApp, acc) contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) tip := babylonApp.BTCLightClientKeeper.GetTipInfo(ctx) @@ -170,9 +163,9 @@ func TestQueryBtcByNumber(t *testing.T) { } func TestQueryNonExistingHeader(t *testing.T) { - acc := randomAccountAddress() - babylonApp, ctx := setupAppWithContext(t) - fundAccount(t, ctx, babylonApp, acc) + acc := RandomAccountAddress() + babylonApp, ctx := SetupAppWithContext(t) + FundAccount(t, ctx, babylonApp, acc) contractAddress := deployTestContract(t, ctx, babylonApp, acc, pathToContract) @@ -197,69 +190,6 @@ func TestQueryNonExistingHeader(t *testing.T) { require.Nil(t, resp1.HeaderInfo) } -func setupAppWithContext(t *testing.T) (*app.BabylonApp, sdk.Context) { - return setupAppWithContextAndCustomHeight(t, 1) -} - -func setupAppWithContextAndCustomHeight(t *testing.T, height int64) (*app.BabylonApp, sdk.Context) { - babylonApp := app.Setup(t, false) - ctx := babylonApp.BaseApp.NewContext(false). - WithBlockHeader(cmtproto.Header{Height: height, Time: time.Now().UTC()}) - return babylonApp, ctx -} - -func keyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { - key := ed25519.GenPrivKey() - pub := key.PubKey() - addr := sdk.AccAddress(pub.Address()) - return key, pub, addr -} - -func randomAccountAddress() sdk.AccAddress { - _, _, addr := keyPubAddr() - return addr -} - -func mintCoinsTo( - bankKeeper bankkeeper.Keeper, - ctx sdk.Context, - addr sdk.AccAddress, - amounts sdk.Coins) error { - if err := bankKeeper.MintCoins(ctx, minttypes.ModuleName, amounts); err != nil { - return err - } - - return bankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, amounts) -} - -func fundAccount( - t *testing.T, - ctx sdk.Context, - bbn *app.BabylonApp, - acc sdk.AccAddress) { - - err := mintCoinsTo(bbn.BankKeeper, ctx, acc, sdk.NewCoins( - sdk.NewCoin("ubbn", math.NewInt(10000000000)), - )) - require.NoError(t, err) -} - -func storeTestCodeCode( - t *testing.T, - ctx sdk.Context, - babylonApp *app.BabylonApp, - addr sdk.AccAddress, - codePath string, -) (uint64, []byte) { - wasmCode, err := os.ReadFile(codePath) - - require.NoError(t, err) - permKeeper := keeper.NewPermissionedKeeper(babylonApp.WasmKeeper, keeper.DefaultAuthorizationPolicy{}) - id, checksum, err := permKeeper.Create(ctx, addr, wasmCode, nil) - require.NoError(t, err) - return id, checksum -} - func instantiateExampleContract( t *testing.T, ctx sdk.Context, @@ -282,7 +212,7 @@ func deployTestContract( codePath string, ) sdk.AccAddress { - codeId, _ := storeTestCodeCode(t, ctx, bbn, deployer, codePath) + codeId, _ := StoreTestCodeCode(t, ctx, bbn, deployer, codePath) contractAddr := instantiateExampleContract(t, ctx, bbn, deployer, codeId) diff --git a/wasmbinding/test/grpc_query_test.go b/wasmbinding/test/grpc_query_test.go new file mode 100644 index 000000000..4019f1a73 --- /dev/null +++ b/wasmbinding/test/grpc_query_test.go @@ -0,0 +1,97 @@ +package wasmbinding + +import ( + "encoding/json" + "runtime" + "testing" + + "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/babylonchain/babylon/app" + epochingtypes "github.com/babylonchain/babylon/x/epoching/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" +) + +// TODO consider doing it by enviromental variables as currently it may fail on some +// weird architectures +func getGrpcArtifactPath() string { + if runtime.GOARCH == "amd64" { + return "../testdata/artifacts/testgrpc.wasm" + } else if runtime.GOARCH == "arm64" { + return "../testdata/artifacts/testgrpc-aarch64.wasm" + } else { + panic("Unsupported architecture") + } +} + +var pathToGrpcContract = getGrpcArtifactPath() + +func TestGrpcQueryEpoch(t *testing.T) { + acc := RandomAccountAddress() + babylonApp, ctx := SetupAppWithContext(t) + FundAccount(t, ctx, babylonApp, acc) + + contractAddress := deployGrpcContract(t, ctx, babylonApp, acc, pathToGrpcContract) + require.NotEmpty(t, contractAddress) + + query := TestQuery{ + QueryCurrentEpoch: &struct{}{}, + } + resp := epochingtypes.QueryCurrentEpochResponse{} + testGrpcQuery(t, ctx, babylonApp, contractAddress, query, &resp) + require.Equal(t, resp.CurrentEpoch, uint64(1)) + + newEpoch := babylonApp.EpochingKeeper.IncEpoch(ctx) + + resp = epochingtypes.QueryCurrentEpochResponse{} + testGrpcQuery(t, ctx, babylonApp, contractAddress, query, &resp) + require.Equal(t, resp.CurrentEpoch, newEpoch.EpochNumber) +} + +func instantiateGrpcContract( + t *testing.T, + ctx sdk.Context, + bbn *app.BabylonApp, + funder sdk.AccAddress, + codeId uint64, +) sdk.AccAddress { + initMsgBz := []byte(`{"admin":"bbn1kghr9hekuxj0tqa9pfnpxym4x6z0k0x77qxa79", "consumer_id":"op-stack-l2-1"}`) + contractKeeper := keeper.NewDefaultPermissionKeeper(bbn.WasmKeeper) + addr, _, err := contractKeeper.Instantiate(ctx, codeId, funder, funder, initMsgBz, "test grpc contract", nil) + require.NoError(t, err) + return addr +} + +func deployGrpcContract( + t *testing.T, + ctx sdk.Context, + bbn *app.BabylonApp, + deployer sdk.AccAddress, + codePath string, +) sdk.AccAddress { + codeId, _ := StoreTestCodeCode(t, ctx, bbn, deployer, codePath) + contractAddr := instantiateGrpcContract(t, ctx, bbn, deployer, codeId) + return contractAddr +} + +type TestQuery struct { + QueryCurrentEpoch *struct{} `json:"query_current_epoch,omitempty"` +} + +func testGrpcQuery( + t *testing.T, + ctx sdk.Context, + bbn *app.BabylonApp, + contract sdk.AccAddress, + request TestQuery, + response interface{}, +) { + msgBz, err := json.Marshal(request) + require.NoError(t, err) + + resBz, err := bbn.WasmKeeper.QuerySmart(ctx, contract, msgBz) + require.NoError(t, err) + + err = json.Unmarshal(resBz, &response) + require.NoError(t, err) +} diff --git a/wasmbinding/test/testutils.go b/wasmbinding/test/testutils.go new file mode 100644 index 000000000..89dc6c9cc --- /dev/null +++ b/wasmbinding/test/testutils.go @@ -0,0 +1,81 @@ +package wasmbinding + +import ( + "os" + "testing" + "time" + + "cosmossdk.io/math" + "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/babylonchain/babylon/app" + "github.com/cometbft/cometbft/crypto" + "github.com/cometbft/cometbft/crypto/ed25519" + cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" + sdk "github.com/cosmos/cosmos-sdk/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + "github.com/stretchr/testify/require" +) + +func KeyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { + key := ed25519.GenPrivKey() + pub := key.PubKey() + addr := sdk.AccAddress(pub.Address()) + return key, pub, addr +} + +func RandomAccountAddress() sdk.AccAddress { + _, _, addr := KeyPubAddr() + return addr +} + +func SetupAppWithContext(t *testing.T) (*app.BabylonApp, sdk.Context) { + return SetupAppWithContextAndCustomHeight(t, 1) +} + +func SetupAppWithContextAndCustomHeight(t *testing.T, height int64) (*app.BabylonApp, sdk.Context) { + babylonApp := app.Setup(t, false) + ctx := babylonApp.BaseApp.NewContext(false). + WithBlockHeader(cmtproto.Header{Height: height, Time: time.Now().UTC()}) + return babylonApp, ctx +} + +func FundAccount( + t *testing.T, + ctx sdk.Context, + bbn *app.BabylonApp, + acc sdk.AccAddress) { + + err := MintCoinsTo(bbn.BankKeeper, ctx, acc, sdk.NewCoins( + sdk.NewCoin("ubbn", math.NewInt(10000000000)), + )) + require.NoError(t, err) +} + +func MintCoinsTo( + bankKeeper bankkeeper.Keeper, + ctx sdk.Context, + addr sdk.AccAddress, + amounts sdk.Coins) error { + if err := bankKeeper.MintCoins(ctx, minttypes.ModuleName, amounts); err != nil { + return err + } + + return bankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, amounts) +} + +func StoreTestCodeCode( + t *testing.T, + ctx sdk.Context, + babylonApp *app.BabylonApp, + addr sdk.AccAddress, + codePath string, +) (uint64, []byte) { + wasmCode, err := os.ReadFile(codePath) + + require.NoError(t, err) + permKeeper := keeper.NewPermissionedKeeper(babylonApp.WasmKeeper, keeper.DefaultAuthorizationPolicy{}) + id, checksum, err := permKeeper.Create(ctx, addr, wasmCode, nil) + require.NoError(t, err) + return id, checksum +} diff --git a/wasmbinding/testdata/artifacts/testgrpc-aarch64.wasm b/wasmbinding/testdata/artifacts/testgrpc-aarch64.wasm new file mode 100644 index 0000000000000000000000000000000000000000..845814260bde3a13163d42dfd880b4584d717ba3 GIT binary patch literal 253512 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%0D4>i^+=kNi11^Jm3e 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 O!ZpCPkL#3coBj`lL~{%P literal 0 HcmV?d00001 diff --git a/wasmbinding/testdata/artifacts/testgrpc.wasm b/wasmbinding/testdata/artifacts/testgrpc.wasm new file mode 100644 index 0000000000000000000000000000000000000000..0a407123d28a8b9118bc76ddbbb8b71586ba7bae GIT binary patch literal 245597 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 z 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 vnkXZX7)dyN$BG6T=`m{S;*V7Q!yVb%gX|pM Date: Wed, 19 Jun 2024 20:29:50 -0400 Subject: [PATCH 30/85] chore: remove aarch64 wasm (#261) --- wasmbinding/test/grpc_query_test.go | 15 +-------------- .../testdata/artifacts/testgrpc-aarch64.wasm | Bin 253512 -> 0 bytes 2 files changed, 1 insertion(+), 14 deletions(-) delete mode 100644 wasmbinding/testdata/artifacts/testgrpc-aarch64.wasm diff --git a/wasmbinding/test/grpc_query_test.go b/wasmbinding/test/grpc_query_test.go index 4019f1a73..6f6aaae0b 100644 --- a/wasmbinding/test/grpc_query_test.go +++ b/wasmbinding/test/grpc_query_test.go @@ -2,7 +2,6 @@ package wasmbinding import ( "encoding/json" - "runtime" "testing" "github.com/CosmWasm/wasmd/x/wasm/keeper" @@ -12,19 +11,7 @@ import ( "github.com/stretchr/testify/require" ) -// TODO consider doing it by enviromental variables as currently it may fail on some -// weird architectures -func getGrpcArtifactPath() string { - if runtime.GOARCH == "amd64" { - return "../testdata/artifacts/testgrpc.wasm" - } else if runtime.GOARCH == "arm64" { - return "../testdata/artifacts/testgrpc-aarch64.wasm" - } else { - panic("Unsupported architecture") - } -} - -var pathToGrpcContract = getGrpcArtifactPath() +var pathToGrpcContract = "../testdata/artifacts/testgrpc.wasm" func TestGrpcQueryEpoch(t *testing.T) { acc := RandomAccountAddress() diff --git a/wasmbinding/testdata/artifacts/testgrpc-aarch64.wasm b/wasmbinding/testdata/artifacts/testgrpc-aarch64.wasm deleted file mode 100644 index 845814260bde3a13163d42dfd880b4584d717ba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253512 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%0D4>i^+=kNi11^Jm3e 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 O!ZpCPkL#3coBj`lL~{%P From fdd9040b53a4a72fac59a8a4d13cc7959acfb95d Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 8 Jul 2024 12:56:43 +0200 Subject: [PATCH 31/85] Fix rebase error --- x/btcstaking/keeper/keeper_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/x/btcstaking/keeper/keeper_test.go b/x/btcstaking/keeper/keeper_test.go index 83785bf0b..577847c6e 100644 --- a/x/btcstaking/keeper/keeper_test.go +++ b/x/btcstaking/keeper/keeper_test.go @@ -16,7 +16,7 @@ import ( "github.com/babylonchain/babylon/x/btcstaking/types" bsckeeper "github.com/babylonchain/babylon/x/btcstkconsumer/keeper" bsctypes "github.com/babylonchain/babylon/x/btcstkconsumer/types" - "github.com/btcsuite/btcd/btcec/v2" + btcec "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/wire" sdk "github.com/cosmos/cosmos-sdk/types" @@ -161,14 +161,12 @@ func (h *Helper) CreateConsumerFinalityProvider(r *rand.Rand, consumerID string) if err != nil { return nil, nil, nil, err } - fp.ConsumerId = consumerID registeredEpoch := uint64(10) h.CheckpointingKeeper.EXPECT().GetEpoch(gomock.Eq(h.Ctx)).Return(&etypes.Epoch{EpochNumber: registeredEpoch}).AnyTimes() - fp.ConsumerId = consumerID - msgNewFp := types.MsgCreateFinalityProvider{ + Addr: fp.Addr, Description: fp.Description, Commission: fp.Commission, BtcPk: fp.BtcPk, From e57fefc3dbab1fe40b71fb4a5fd7381e8ecd60bc Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Mon, 8 Jul 2024 13:36:20 +0200 Subject: [PATCH 32/85] Fix rebase error / Simplify testutil btcstaking helpers --- test/e2e/btc_staking_e2e_test.go | 3 ++- test/e2e/btc_staking_integration_e2e_test.go | 5 +++-- testutil/datagen/btcstaking.go | 6 ------ x/finality/keeper/grpc_query_test.go | 4 +--- x/finality/keeper/msg_server_test.go | 8 ++------ x/finality/keeper/votes_bench_test.go | 3 +-- 6 files changed, 9 insertions(+), 20 deletions(-) diff --git a/test/e2e/btc_staking_e2e_test.go b/test/e2e/btc_staking_e2e_test.go index 08edcfe05..a6194d36f 100644 --- a/test/e2e/btc_staking_e2e_test.go +++ b/test/e2e/btc_staking_e2e_test.go @@ -84,7 +84,8 @@ func (s *BTCStakingTestSuite) Test1CreateFinalityProviderAndDelegation() { create a random finality provider on Babylon */ // NOTE: we use the node's secret key as Babylon secret key for the finality provider - fp, err := datagen.GenRandomCustomFinalityProvider(r, fpBTCSK, nonValidatorNode.SecretKey, "") + fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, fpBTCSK, "") + s.NoError(err) nonValidatorNode.CreateFinalityProvider("val", fp.BtcPk, fp.Pop, fp.Description.Moniker, fp.Description.Identity, fp.Description.Website, fp.Description.SecurityContact, fp.Description.Details, fp.Commission) diff --git a/test/e2e/btc_staking_integration_e2e_test.go b/test/e2e/btc_staking_integration_e2e_test.go index 46ca8a49f..26b44e30a 100644 --- a/test/e2e/btc_staking_integration_e2e_test.go +++ b/test/e2e/btc_staking_integration_e2e_test.go @@ -416,7 +416,8 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyConsumerFP(babylonNode *cha */ // NOTE: we use the node's secret key as Babylon secret key for the finality provider czFpBTCSK, _, _ := datagen.GenRandomBTCKeyPair(r) - czFp, err := datagen.GenRandomCustomFinalityProvider(r, czFpBTCSK, babylonNode.SecretKey, consumerId) + czFp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, czFpBTCSK, consumerId) + s.NoError(err) babylonNode.CreateConsumerFinalityProvider( "val", @@ -447,7 +448,7 @@ func (s *BTCStakingIntegrationTestSuite) createVerifyBabylonFP(babylonNode *chai */ // NOTE: we use the node's secret key as Babylon secret key for the finality provider babylonFpBTCSK, _, _ := datagen.GenRandomBTCKeyPair(r) - babylonFp, err := datagen.GenRandomCustomFinalityProvider(r, babylonFpBTCSK, babylonNode.SecretKey, "") + babylonFp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, babylonFpBTCSK, "") s.NoError(err) babylonNode.CreateFinalityProvider("val", babylonFp.BtcPk, babylonFp.Pop, babylonFp.Description.Moniker, babylonFp.Description.Identity, babylonFp.Description.Website, babylonFp.Description.SecurityContact, babylonFp.Description.Details, babylonFp.Commission) diff --git a/testutil/datagen/btcstaking.go b/testutil/datagen/btcstaking.go index 834e003d4..195c5a0cb 100644 --- a/testutil/datagen/btcstaking.go +++ b/testutil/datagen/btcstaking.go @@ -1,7 +1,6 @@ package datagen import ( - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "math/rand" "testing" @@ -80,11 +79,6 @@ func GenRandomFinalityProviderWithBTCBabylonSKs(r *rand.Rand, btcSK *btcec.Priva }, nil } -func GenRandomCustomFinalityProvider(r *rand.Rand, btcSK *btcec.PrivateKey, bbnSK cryptotypes.PrivKey, consumerID string) (*bstypes.FinalityProvider, error) { - fpAddr := sdk.MustAccAddressFromBech32(bbnSK.PubKey().Address().String()) - return GenRandomFinalityProviderWithBTCBabylonSKs(r, btcSK, fpAddr, consumerID) -} - // TODO: accomodate presign unbonding flow func GenRandomBTCDelegation( r *rand.Rand, diff --git a/x/finality/keeper/grpc_query_test.go b/x/finality/keeper/grpc_query_test.go index 3de56cd85..885e8295c 100644 --- a/x/finality/keeper/grpc_query_test.go +++ b/x/finality/keeper/grpc_query_test.go @@ -198,10 +198,8 @@ func FuzzListPubRandCommit(f *testing.F) { sk, _, err := datagen.GenRandomBTCKeyPair(r) bip340PK := bbn.NewBIP340PubKeyFromBTCPK(sk.PubKey()) require.NoError(t, err) - bbnSK, _, err := datagen.GenRandomSecp256k1KeyPair(r) - require.NoError(t, err) // register finality provider - fp, err := datagen.GenRandomCustomFinalityProvider(r, sk, bbnSK, "") + fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, sk, "") require.NoError(t, err) bsKeeper.EXPECT().GetFinalityProvider(gomock.Any(), gomock.Eq(bip340PK.MustMarshal())).Return(fp, nil).AnyTimes() bsKeeper.EXPECT().HasFinalityProvider(gomock.Any(), gomock.Eq(bip340PK.MustMarshal())).Return(true).AnyTimes() diff --git a/x/finality/keeper/msg_server_test.go b/x/finality/keeper/msg_server_test.go index 07a799904..cc78f0fd7 100644 --- a/x/finality/keeper/msg_server_test.go +++ b/x/finality/keeper/msg_server_test.go @@ -107,9 +107,7 @@ func FuzzAddFinalitySig(f *testing.F) { // create and register a random finality provider btcSK, btcPK, err := datagen.GenRandomBTCKeyPair(r) require.NoError(t, err) - bbnSK, _, err := datagen.GenRandomSecp256k1KeyPair(r) - require.NoError(t, err) - fp, err := datagen.GenRandomCustomFinalityProvider(r, btcSK, bbnSK, "") + fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, btcSK, "") require.NoError(t, err) fpBTCPK := bbn.NewBIP340PubKeyFromBTCPK(btcPK) fpBTCPKBytes := fpBTCPK.MustMarshal() @@ -215,9 +213,7 @@ func TestVoteForConflictingHashShouldRetrieveEvidenceAndSlash(t *testing.T) { // create and register a random finality provider btcSK, btcPK, err := datagen.GenRandomBTCKeyPair(r) require.NoError(t, err) - bbnSK, _, err := datagen.GenRandomSecp256k1KeyPair(r) - require.NoError(t, err) - fp, err := datagen.GenRandomCustomFinalityProvider(r, btcSK, bbnSK, "") + fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, btcSK, "") require.NoError(t, err) fpBTCPK := bbn.NewBIP340PubKeyFromBTCPK(btcPK) fpBTCPKBytes := fpBTCPK.MustMarshal() diff --git a/x/finality/keeper/votes_bench_test.go b/x/finality/keeper/votes_bench_test.go index 05ac0bae2..2bd8ae413 100644 --- a/x/finality/keeper/votes_bench_test.go +++ b/x/finality/keeper/votes_bench_test.go @@ -31,9 +31,8 @@ func benchmarkAddFinalitySig(b *testing.B) { require.NoError(b, err) fpBTCPK := bbn.NewBIP340PubKeyFromBTCPK(btcPK) fpBTCPKBytes := fpBTCPK.MustMarshal() - bbnSK, _, err := datagen.GenRandomSecp256k1KeyPair(r) require.NoError(b, err) - fp, err := datagen.GenRandomCustomFinalityProvider(r, btcSK, bbnSK, "") + fp, err := datagen.GenRandomFinalityProviderWithBTCSK(r, btcSK, "") require.NoError(b, err) // register the finality provider From 253dab4bd7a9aa24aed36c5c00236e1d5d635ac4 Mon Sep 17 00:00:00 2001 From: lesterli Date: Fri, 5 Jul 2024 09:53:10 -0400 Subject: [PATCH 33/85] fix: panic to merge proto files (#264) --- app/app.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/app.go b/app/app.go index daf4e680b..5a98afb1b 100644 --- a/app/app.go +++ b/app/app.go @@ -1069,10 +1069,11 @@ func NewBabylonApp( // At startup, after all modules have been registered, check that all proto // annotations are correct. - protoFiles, err := proto.MergedRegistry() - if err != nil { - panic(err) - } + // FIXME (https://github.com/babylonchain/babylon-private/issues/266): This is a temporary fix + protoFiles, _ := proto.MergedRegistry() + // if err != nil { + // panic(err) + // } err = msgservice.ValidateProtoAnnotations(protoFiles) if err != nil { // Once we switch to using protoreflect-based antehandlers, we might From e7658c22ea5fe5dca536e397ecbd091179dfdba3 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Wed, 10 Jul 2024 12:14:13 +0200 Subject: [PATCH 34/85] U/contracts 0.7 (#270) Update contracts to v0.7.0. --- test/e2e/btc_staking_integration_e2e_test.go | 34 +++++++++++++----- test/e2e/bytecode/babylon_contract.wasm | Bin 676910 -> 751073 bytes test/e2e/bytecode/btc_staking.wasm | Bin 394620 -> 631362 bytes test/e2e/bytecode/version.txt | 2 +- .../chain/queries_btcstaking_contract.go | 34 ++++++++---------- test/e2e/scripts/copy_local_wasm.sh | 7 +--- x/btcstaking/types/query.go | 2 +- 7 files changed, 43 insertions(+), 36 deletions(-) diff --git a/test/e2e/btc_staking_integration_e2e_test.go b/test/e2e/btc_staking_integration_e2e_test.go index 26b44e30a..905cd1d92 100644 --- a/test/e2e/btc_staking_integration_e2e_test.go +++ b/test/e2e/btc_staking_integration_e2e_test.go @@ -123,9 +123,9 @@ func (s *BTCStakingIntegrationTestSuite) Test2CreateConsumerFinalityProvider() { fpFromMap, ok := fpMap[czFp.BtcPkHex] s.True(ok) s.Equal(fpFromMap.BtcPk.MarshalHex(), czFp.BtcPkHex) - s.Equal(fpFromMap.SlashedBabylonHeight, czFp.SlashedBabylonHeight) + s.Equal(fpFromMap.SlashedBabylonHeight, czFp.SlashedHeight) s.Equal(fpFromMap.SlashedBtcHeight, czFp.SlashedBtcHeight) - s.Equal(fpFromMap.ConsumerId, czFp.ChainID) + s.Equal(fpFromMap.ConsumerId, czFp.ConsumerID) } } @@ -228,16 +228,29 @@ func (s *BTCStakingIntegrationTestSuite) Test4ActivateDelegation() { // assert the fp voting power is updated in the staking contract var data2FromContract *chain.ConsumerFpsByPowerResponse + fpsWithPower := make([]chain.ConsumerFpInfo, 0) s.Eventually(func() bool { data2FromContract, err = czNode.QueryConsumerFpsByPower(stakingContractAddr) if err != nil { return false } - return len(data2FromContract.Fps) == 1 + // Filter out no power fps + for _, fp := range data2FromContract.Fps { + if fp.Power > 0 { + fpsWithPower = append(fpsWithPower, fp) + } + } + + return len(fpsWithPower) == 1 }, time.Second*20, time.Second) + totalPower := uint64(0) + for _, fp := range data2FromContract.Fps { + totalPower += fp.Power + } + czPowerFromNode := s.getFpTotalPowerFromBabylonNode(consumerFp) - s.Equal(czPowerFromNode, data2FromContract.Fps[0].Power) + s.Equal(czPowerFromNode, totalPower) } // Test5UnbondDelegation - @@ -319,10 +332,15 @@ func (s *BTCStakingIntegrationTestSuite) Test5UnbondDelegation() { if err != nil { return false } - return len(dataFromContract.Fps) == 1 + return len(dataFromContract.Fps) >= 1 }, time.Second*20, time.Second) - s.Equal(uint64(0), dataFromContract.Fps[0].Power) // expect the power to be 0 after unbonding + totalPower := uint64(0) + for _, fp := range dataFromContract.Fps { + totalPower += fp.Power + } + + s.Equal(uint64(0), totalPower) // expect the power to be 0 after unbonding } // Test6ContractQueries - @@ -354,9 +372,9 @@ func (s *BTCStakingIntegrationTestSuite) Test6ContractQueries() { contractFP, err := czNode.QuerySingleConsumerFp(stakingContractAddr, consumerFp.BtcPk.MarshalHex()) s.NoError(err) s.Equal(consumerFp.BtcPk.MarshalHex(), contractFP.BtcPkHex) - s.Equal(consumerFp.SlashedBabylonHeight, contractFP.SlashedBabylonHeight) + s.Equal(consumerFp.SlashedBabylonHeight, contractFP.SlashedHeight) s.Equal(consumerFp.SlashedBtcHeight, contractFP.SlashedBtcHeight) - s.Equal(consumerFp.ConsumerId, contractFP.ChainID) + s.Equal(consumerFp.ConsumerId, contractFP.ConsumerID) // 4. Query a single BTC delegation from the staking contract nodeFpDelsSet := nonValidatorNode.QueryFinalityProviderDelegations(consumerFp.BtcPk.MarshalHex()) diff --git a/test/e2e/bytecode/babylon_contract.wasm b/test/e2e/bytecode/babylon_contract.wasm index 62cf1b5b9215f5a680fca9fce58950af0a20c66e..e010147446c63220262f684071d39cf1256b70a6 100644 GIT binary patch literal 751073 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 z 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

    Nh&=b%e){}MRpq{KNcDTX1GOu^m6+6UW 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

    KIwY6;wWl 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

    DBj*`nJTJ{| z#oLr#bKk8)DnBpXbt{kS+`_%0{4xI!xqM!F^{rXL^HK4cSKc|G>`Zb8&A#%^6PlJ} zX8Ros=3Rjz3u<_nP00N@2GwT{KN-;_ZNTnp1&)`K`LEVyOlQn41X7>p1%{t zui3v3gMc`if|5CMSWM`h@i3P5bAoLSrCjam}Ayr(Mb8#HQv&nhnC{dQkI@FWSGmN4t=t|AIx8jPlOoXKo9P+FkRgF z?{#G&z(#`v#E#3i%P2$P15Wu%a;3OxbTT>FJ15@ETd~NFMbU#9irOX{9xA{C@41nw z!ta(|EqO};zgGAiCkf?3PFr|P=)J2#Xr=-pThn%mC^@=fu~#gSb~3yRZ-;IwVRwRC zXyWA5aI%h4+iY7nRW)c@t<9oBAkdUT%P~IK3&SZZjghRaXOmrYj^Re?bSzjQSTyg* zl%ZS#OmP3V>Mm{Vac$US#Ahtq%3DWW%jgdz+gL4VSvVQvwss`#GH(t=LCuljUp6Q9 zGp|m^$u5mX9cS%Kj1{~in{o|Rdao(bs!us}Y%=DGtrVK9YxV1t0uB=P=}@I*_z)c= zBie%V2JcjaGSR@%O>|N80t1pqnIH1AZ&N;@ zDfET{$3XB3(xz3UO~;XzL=+t9jw;icZ1O$P&!lyh&VyBk`8Z^yT0R53;ZI&fbtjxB4r4 z!%;_Tya6JLn8V|yoaSY;GZ2RjbAYS-nYWU*%%%MvWVt}?5MFWof5xKVfbchhB9o3Ra8V26RzxC+k&Hdb{X-5wz(6b{8OpZ)REdj`rT@sh&?_Uzb7==20R*AD zk($08>eFMGt1g1}E<0P%5->RI=qD#!)cNhWbcV6dbf_@zRVo~aRqR%Y#tw>_cR6d&X}G42&u**#>}EpmVN!B^F#_(! zMu62E$=gx7BfgChbRaNwn4KU>uuq?M1k*l(X&=F~k6`+=BVcfx1fKPZ$(SxDgR8Nj z0M_q#DAUDIUdDLV!Z`OKcpN=Tckhfy&h)U;Bcs9NoEQHTzK)}@=8PBaAWryNhtP5h zvYFX~Yxh^`-~@XlSLVzHCJHR^4sUgfIo$<;*)G?V7bvs%$Ocx(sfsudr84kQeK-Z{fz?}R4(&|orgo@!h(ma?s6FIhGF&cx zFj*@c!6S_h@oAP9ht5PVWLTJZgB(~4L$Nqg zZTTFDfmgz|7HLY1^#6CdO{Z)4ZgQPih6b~pST6re`$;$9{DTIkno>?H0>PMY4x{## zup_KtyJEKl)U>6D#I8!&ah?3U+Lsc+NCNx5(uz^Aorz<^+0yw8@VeGS_gKH#yQ*`(uq!TxYF@Wm?8XZ_RXDACO}(wr`V(94QW{} zO#-1p^J!&0BM);*!HqBxX@+CSU~HOg#-gOTyzO<9aG19(wSc0uGSnhJowD6Sn6cNg z;EX4dR);OM3#TSJ>FqMD{md3^Wqo>3R^K6E#{8g6RdG5fmmJy~P6yQ#hSNc{)`F8Z z=B4JKDP-%E0^pe!?fiX&wQXl{Cd#xs3+;{17vBr$E*`JcijXi16syjH@ZO?lm?1Sw zAIV%6QVvdizf5u+IYe!G(#StrJo$2qEE6p9r_oBC(GY18TOoWzMmV#@ipNAI7P2c( zrQ01hJx;?#UY;L4W4a!L}k*&n zz?x-<8FLn1P2rbKm`{Ekzy+%M`;P` z;)O|sM@@^V79j1#7tSl8UIlR0B-H}xWC40LRzMr0h?#-Os-c-n17%FICsR@M8g$S5 zDjr#cTj@0+@7P8pC2WZFxtxK(`IRIu%~l68N-x@LOSZ-L8XP_5^JeD_l2V(SFPM*v z0pcWE@iQBZ^C{_s{C*>0E=$fwaa#^x#h2j0&iUw@As>}ex+F0!M_502CP_fi&?P?oWZ?vneTwQHfT4{2*Rs}N_ArEJ>(n<16MqN`E6r@#m z7=ya-zONQtNT0n6-kiGN&8Z8QE4gU(h>IrF93xU|xboE6iE_XsCqCPNeVA&^+f}H< z+f{J)as}ZSV*VJt@BeFYnVPRia%O{8qdJQ5psC#8CetE}v+~87I%im;>Xm`U%Gevp-C3*pvh|`ny}Z@|SyYV>Lr@%P zg}^WXDenB9vL=&V{)fjNTW8kAEBV2j0!e~DYpXvG55 z*6m^?(z$TZo_WVFY zF`Q^v1fROt7nrw9rIG}?gSJ``%abHW2k%@qZ0MXP-e--?83z12PYY)zd#z}Q_j+pH zkq%k{cq4kKAl$U~dTOlK!nW1DHj*3fb+71kZ?f0)iiie(I(yjMMIC6ml_Js-Suwj> z*{D0cEW#_c?@CkHBkafCGwcyJ`_{0Bqy2wGB>^73WTX&`xNtoE3y#qz_2g+JN&-~%?Zv35EDBr!S7LLqiBNC=r;$9Lb0Y!wT zTBK_pN5kw^NIqsVv{<*`!{fhzdNNnI+sPlJGt>m}AZo7K44vSXmv-=Kj)YKvfmJG# zg)kv7i&`iROopOG4N`zD$#<=i5RT{W*3vYsqeZfcSQ)~v?zOZkrD++$O=;0nV;RCz zo*_&DrT1C^U6PE9Je#WI|2C{ZUD`>bn*VEySR1+Wf7zJC2C9?;jJafu(Xt$0pil`6 zzcown%66$7l{`&duu>{PNhJ6SdxkxLT!>eB))iq#Q^R7g-9};qzMg3sQl3f7!q?Hc zTc!+3OSO;_LF+t5n%tx5nYiV4I9!^ z?Q8DO3(5gN6F;N`x;8650D#O$q-!05+KVzMX?MQIROI@6x9?1%7~PAVkLIn6Lanq)3eg3JUU<_!RO zCxwk(DJ>Glqn4|i2apEk~yF`ZRD{XIm{k- zS||1Kgp4c8R%Aw$$o^tayj0H9HR_ig+5rsf`IOv=7?rho>W?fbYG}DpN+4qQ!y+dK zOJF=Fhqd=87BC#;0j-rvlfeLNBi5N`KK$tm-hfix8ZZPCUM-~teLj+?hsU7BTTe)d z;<*sAXw|cf)~a3Nw^r=WRjC2BZLFUH5kg?pM9p(_WSkYbBLx`p7sFFLJ%dahx#{E1 zyW?*q1N*zYHeB#S+IRrrWQ<(1Nmh1vN^d=@2u>0)wUD?kgs+{_O87)8;k7j-+`L!` z59-XT%9;K(AZ2Z)b|;f0{wSh*-XwO6lOD-_LX-9X2KvWHnr0+TugXHRB+ zbT)c88=Wj8NbX0t9AelV#BX?xYnfT5V zQX2TB)`or>wpEUIFj4PhjWV=rBv-QZN9m%x73pz6mEQK20kUW2IREwE1VgI@s0xI4 za0he{TNF9Y52bl}LaA3?LBi*BM@19sDCO1VmSCmDO^~QQ#q?K6Ni97|^u)fM!6eXA zMriP(Z>f!epC7qn(6o-JbH{I2;s(P(D=MK>cPI%qLPr+=AaUv(zL3=i;{R0$C8`z> zJA|YuObLnYfGAUuSbeu&!gl-f$!Uz(|x3xlr4f?stS`r8yk8ZSu zd2yx!)^C#)p`exMydjQnV+biYYzvq0iVJJxa=vd^y90g*Ezau>^n*QSwL8oMC@?yT zL%Ny+D94E}5m~(o4k^gMIK+3hM-qglEY;<2i6r{?Vk7}cVvs=7WZ|fntF&`>-P3}s zB1}%o+df_N4=14+FK8w>$dL0my*bd!HeajJV;ovXhfRz<+ej@HPfO`XBBsya=#H%- zu;+}nc7;hGL^VgaN0C%Au`t@L03z-dcl4g;{g( zjJtJXG4A$CF>Yx*iq!%bmRDLB5`BT%BayO(ZQq0uPnMRdCv%#ap_ih3>1NO$BjQ`v zqcyc7%+esWw#dLNW8Cxe(2-eLtuN-aA3F-NLp`8~P&L%UbBYyf1UtVW;SW#=G6TcD zoNZ!(q5$CF@J|JQJO9vz1mKE3!CP(41#v0`8wGL7i<}|_$NZ=!_mFB#R3u;om?@MB zkqEyBu#t=f!1mrk9A!s)A%H6%{cM(t3zhFXJtYCQDM=zf5VQe!~1Lg5d{ zf)WhS+5!~pt1&1b4oWO+Fc@Yk02W7tg1w1jAvT_dCH4$VT4PvIqoL-3pCD zY+7$BS_PjB3u{J#;Ic?i?J>*QRKP-f1!Gv~+byob!qlb=Q9PnM%}%wnjt~d_B5lV) z+q@l%^UO%73F+K>A{|6T6CR8@?|AX+k6m~8!1D5e#f2;8ZkeCE2Qb+gyqa%gekrTgAIw{QN) z;(>*g0}D62^v0LHbZL1T-(Sr4oA|qhzq2bVbBB+tWGjo=?Ed}PO$S!qoGsosw{-oX z#hYF?d(*4R8s?5H?tAmzg=2@WJG8iOe(#%Sm*0HdftACvN3J`xy!Y_2Ln{aNE+4qz zId$tN78mCBEiUXkFt>EWoOdhwgV3*9=+~Zw{c|_Z?Z13(cK_VczBkVvSlD}DzZ!k> z+<_b3ys~oO@LU+>-Zxtr?~xC@d}L*dayEkEX60u4;F_h`h2`0OD-Q1iYVha3)MF-n@p@)#foihr56#|?EzhlF*Bx8Q78W&=dOo+D9a)-N zrjt3Nym5{`T{?GY?uJa{NbLhbG%JRzW(h83?!nuY0;c8`ZW%khC zUEdye%;<5d#(NMzSM8S zP4pic{b(Jy^Pl+b@r$T}HddDBjvkv^*f&R4u7Ly4iisDocVKh)2+f)N+NXZZEx`}~ zbn$Qz@>&Ya0pKH4L}v`($Rh0P!2VICGm=?Lb2lCkA7Ppo7H@*SZkQ7U7ncs)AfSa| zEzKR8y=87`k*4862UhH2W$70Bd}p&CP4WA){I>Y@(W_8^!{WmA2bK;;AK-nP_rJrh z#%fj2s{PVY75Y@D<8gjPQ}p$pf!_v4ntt8f@(~z=;4(A2d|+R3kGNhs0EY+bV5}?4 zyno%?zB$-mQQ}pIdk}Q-@V>?6!#B+?9|pa@ z8G*=(h~Qldpm?DgEEg4@<|E^40JYS^it@9E!0DYkZ=BqPz9;Y?TDKtg1+AC-|~^;l}Z= z!}Hf5h_EpvHOAi;U97OJRdr94d6jeN(-!m521#(*QlY_DN%*WPRDxw0f#_XlaIc#? za_E-RAn|A_&P*YJSHgf6V0)+mus-X8GgXO4Y$p`i=z@K-OE)ZD zurzlA3gpr)W~`aP@zQ-u)Uy221B=^Ve*McX+W!MTaNTvYFZ;nAJ6?7@wutkk?J)7} zKk(8WFTK#dn_F61Tw1<>hkNZ3!wwnpXs;g~;P;pKyRmZr3*nwlAoa3qp*lGI&Yi~= zZd#f>vhBQUv&DsMb|JfV_tMg}8EV|IxoE&Q+xROvH{|bkX&g68R4>#0cTe}DYiZ{s ze`V_y_YZ{o@8ehh#r)mM-xu=tMf`m+f7Q?P_**UW{oKEVzr@z%Zj4^aUsnG|JNQfD z%~;tV;J#?@ZCqE|{|Oqb-fx(=zii_E+KKz0o4DUTasQ2p_WmN=Un(S#q(@-^!O-sa z$~ND>G<#E_oR#+@`(q)mvkUY4jxDb& z9u7+A{z{8HTEay9e~Wt$fGVs1fBdrdIBeX_={&R+^=imQ6KB!@>XcKIeHZ4@iA0KmPt#59fJ5&)MUB-s_xW zBov@4Db8nOLSI;h=}aU=j%ieX&Kw&0nJh-WO!Gy1GtQ9K9Lb zC3qBiC@~v}1jj^WxGNbH>S%qL*<6y91*}#G@~@a-{5YZmsh^@{(h$>|B~NG+g>}qR)vG1tG1rn-GPv%QBj^ zcqZ9V3bCL}Du9;FX7Ut0$aL_*7Ls!mP?H$JaGAlUGe*T|0rn$U5Z*_cc1YtR$-fBS z7Vs4bmT}p9ydzxpwD@NzGebeuR0SQJ`@V zDRvZ5N$N-;r7myfe(2O-&NsdCHB=nATTI6Bs45MLZ1o7IGZ;HNoBM1^7F;fxhBj}v>fzGhxXABZ6J*}jW ze}hJ<+rUleg*5+k;Nu`1&s1)5UEmb+-H=BDJTbFOd=Aop8ir|}!8%OyjfI|G|FxW1 zreY&6CWJpmzXFqiN-78kP}bh?`$B|(;{NA$sFpq^3H74D=7?PPu1LRIVrrT$H9aOK zE;W@scZ-hI#U;fg$0j6oXD?Ec6Oz(&Ny%xtALq#PETR4qq}$S zt4kZ05~u5(klH&sEv5&1-7l_hLi|8od~`x0kKId`kg7{aicd&NNE^srQO2n;(TUN0 zL6Dk?pSoeG%6>rJc^0#uJ}axFfYrZVBR3%(^iSYGPBh@B#9f(XSb%*3d_#Tt`o~}>a4b|_kH&7oVC2yi zBugFmGF+kIc%(O}rV4Y!tlYeOgGlNaQ0$0P8)5$gl|l4_Ok@ZLkPhLEr>tLImN_s8 z%T0t-KL%6Xv`yTE{z(4_oCll?(>keyFG_Gl&4^4eLjGFh^6g;_|4a4M)D z!Vm_|FjWl%oeQca2wM=AxF>5^EW|a1{0!klgo`T$5l-?@o`6^Yw2d;1GSUi8+8u-u zn!2%d|F6R`YMq7lMp)vC5+u5g2(n@ka!8QIwB~xUj)biEIiuGAgr#;!GKoaaDMIml zC*ylPe3xlN5Qn_#k)pr+j!MaL2et7Q!qXUf%Kk)4nk_^=1o%dAEuC0sh&_jD6M7J=XVe5N0@frD!bU^oLIfh& zAm$XCN{VQJ%Jmzi$4UZC2B(ro=M@`8PGX6k@(Lyrjk3NOulrv3qzya{pKy#^Ucx&q z;htPp*mU$|3yK&e2KbAxQDg50E5G=N0Yk-3qJL?)f0Z1Ank#eXNIQIBBrOs`-G#xi6%5y)62)= zMC+cMei2}zXP6QVI4C>M2pp7=;n9L?7J}eY8EOOve#Jt zgjgwFD*XC@GrTccI29tw-^St_N#_kEMOd7{PRgm`-C}&BF;_ib8Y7Sli5d8IKnf$L z(~pgx)VxwlS-h#FxLckjk&V+>dEA0AEw*&0VHa0uV18O|9&{dQqfH2$ZpjX3OClS8 zx{@ND#Z+Y-C)$>gR62|xJS*v&Xuye>*vUmu2ovfiy`22WCM};cc$J-3ngvo7U89FE zfuSQk5K)Ge5YLDdiTDv_h#VKa1|Qw?v~!&e@#D}0tZbBTMsa<9MBEA~j9WcGyD245TXR_I#bQ9o|a8K#od4wgpl+u;UKs2@z zCR&i*39a0OBzVbiDR6z@`og8crNI$y=?6#cH2^NbRCOE-#Jgn1c7WT1<^XJQH0cu9 zicn1YI4nU1aA64?%`w#jsi>vNF$nRgE;QE&_d=IcqR+3I#}K?n%l8J?R-n(vs81-g zr09#y#(2i$RT-B<5jGt<@FEfg8V#w&90<1JVa;G&;8;h|nnX--45`tfi$sEajg@JX zC={v@(vsmAz=WS<{FA9S8$*L5#kAJkh6d%UoA&h@I`81=nGIV35W$= zOvQ2x?IOa`7$awZlLGWG${j=4AjxC_A}KVm#zm4Ow}YsV7Nu0=0ww)(M!e>8fxV`# zrxj43exyDmNA-wh3{SVRL11@U1EwE+0~sSgZqG)Hsn8mo)myGt4hvI2mL?EeRn9YX zmhv6%NXW*3xfm$|VzSy&Dz6WMaNEO;_2*O44?qQ3P>F(q2(n5bNE=KGkRL`G>DdXz z2zA@IvAUi>T}XS&Rw%-OB*(z;H;~*6D?X9vxkj+ArL-pGSpY+mEj2dilK*{qnIHva zF#GW}k`-4tj`C8!Z30fDaWBKK0VX+-+_dSSSVDuvcI`wTF|jQl`$OQU_vWI+gLCm~sEe)Qaf~iQZ%OYl3hSvMps#FWx)MmkU{AV39e+k#)Q~3}zT)nao1dhI}2lXd^JX z{>eGcYRTp~;UG3%;LG#m0G?wN@OC^?zsTQr;h8ipO1P~8egn_S@C1|AhGP#acI<(s zk2e*A_mU8x)sCggTaIq4ypj-c8E~V%Ae~c%sFIP!E7J*79jn8UH$za#Ma8WNfl7ec zRAh#_-YQM6)Onlvs3U7EQpfLI{NpzONiioLeMH+FH8oL7I-4G7l1KSBa z2tv8gp37>n0<%zqKdJlPXIJH6ohPL zB#*rzRVpu7Lbn(ZQdd|)RSFjk7&nlG{e|5Wc)i&uEA^d>Pj~{6;t{;3H3IAw*{Db! zGc{yWjP3R}w8?G0N4J&>LjRd4;UL_TFwnAmT28qxs6ala*eiAVvi~hPqhjgAtGL64A&s zW@UI2o?9y5ULbym*RWc}=qmeop`5pDf+&?~2i{X%6z!_3j4zuhR!%G^1Pl=D)8yus zL9pX3HWi57xLyXMQ4qdGnxx6Dj71h_oU~KMq`*ymxxA?|tegW+P~^kmi9C8Bp3h(A zp^O_TmLsf3m9SDCF@vN^JXwb=h~tGgyj?7%B+jZVBM?Jgc9{qUmnb!{x3PEx8ikF@ z%9debGbS!zVmS7d#B-t^!W+^Lkz|K)7o;_jFcw9(ltzkO{5UNs<0sDP`ik*H6ad{7 z1KZ@9N|;O&!Zt2(L3uL}k7%N)@NMA}-&H-0RJN!-naEni@l?bm{Q~b~F42?IVY!oC zy|K8a&l26us8JF`vL;|6L75>V0hK~_0Vq=R7IT0>*<)jWKHd}HlPs#Tk@Pt^(8rQg z17deErI(qFHv__vUI*`VsR`Y6@S&Uv59l7C8_+v8GPOsvPhd!>E;Y4(x~^}sE-5`x zSDB>Tl}L{Xw5?XCT&&HO5v2Vl^6;%v7OBH3!!uccGS)4`sX7lZ^N}B_$*gW*QVSDW z+6Mt!#NslT7Dq;=5N3m%fQAG!MIvQLWF(UbV;Ph=N!akQF&7!h#~zDDjo}gCCJe7q zPN{-v)-0xuAb+{o=#Iat9dQ=Z`Lpxj5HBSizk5>Fww%Q!qM;qemOx5_FiVH<;l_ZZGW z)y$$HkEG62HHLAi9dbYh6+&T6NQ2oESUZc+F;e%{uxtrGqHMHodBb79(77A1Q24b$ z74j}Y;--tq+D*)ZGF=!N%vaqs2ZOs=rV5k(=&b)~%| z)=VWM6G7M!;>Pw^oq|sz2t|PWnH3i@WZEPG>6=)Ya+%RWrTlMgiYT=)ZJAZeycIH$e>;1fk6kH#8eTH~Z3Y!if)<4{px7e^C5uMmin z71-0uTW-WmGTJKU!--m55~x%QF9?&7ZhfS?6uv)v8N|Lt1YI-_ zHw)j18&{M^Ir6KFjok?Q*JA_JDbqSxL?46ENDR+aDed3kL-10)4AQKqg2E~%6$mu9 zNZ!^|c3xU33g_0yUWK}heL~kV{+70o(V|S$Ne{#irF<*55i;E}Qenh-H+f?M5r_6Be4;MfskmgZ2Q(TaF*=6#R8MQVvUQ^M zg>?snv_imEkOrj8B7=q{&JYuuw#~5B0^9qFEV-3ECvAFqj(;S<0`?I>f&iuh@yOm) zN6RE7BMA}knpuu2UqOU`a<=No>*WQX>Jto~#&}QoWCxrFpSajD@QG7@5q>TB*KK$` z*Lv}IP4J%DhjJh$STd_45S*_9;rVL%lUr7KQ`r7CYc}!My>u7w!NYwGT<=$@)Zg zBweF%NMmqpLpNa>+!DAQa3|rug!=_f)rj{Gr9ojyNY zIFiz*@H93^ibiV?JyV|3I=cz$;P${Bhx-KXN4N?&_b7^4#li^!$tR4Plon9W#KM*_ zUOwFXgRDs89Tbv*mJrazO&E%DZiAz`DJ-(ET>_*AvB!i_twIJ~2R&#JY$pU_#j-&b zf-*bLO+=nj696{$uZ>=!&y^p=Q2})oMg2?TvF}j5!KfA~3~0K^aBelYuo^tJ8a%NY zJgpl15@2dR`l(vSuS8Y?Gt< z(D0@u$W#rcWtiUKf+1lf{9-to1{9X$cuLqJy<04WrF7-6C3sfCqX5&p;|Mz%ekmMH z0!p{68vLB}?iRw1!85ftF`L9-J`Yz8Hvx{?eG=ScxG8W?*^bzXZY(g+Jg91?D8zPi zV*=5Y$b*!=PnnN7S0Bh{TR3BDN$f(K5SgHQ3-Ti6a}*qrB1)LhTF$o)!>4S^*3FE=!2_+NF|JYSk0@j_~w=EDwcert;N!zHQ?tG(ZuaM|Zg zSNr!4+@Ugb+;D0#m7~M&3m;QiZihD0QF%U``0Z9IQ;Ynl4pgoY2csWQ*~(guuS4Zy z3MMWSAO=8U7eUe`ME6UCOohyAto#AWdn1MmcB;iAqdekeYm6nva-l}GIJCx+QQKcd z6VedR7kM%+!^+(MWpH5@!nd)8|Jx!72N1TEHSFJ4`v$^#AZ(`IAh!q#K{g)1BXN?V z0N;obf+eEhk9V|eR|`)&wZ&L`BitiPKe%ug!dtv|#e0Qu3HW3ZMJK?}|t5v;Z4Vhd-9Dq=S?^JKacMM8uY1-ga zf(;{rFc)DO*Bl0-`$%#3lX*}AEQj;>Ms-|_x(A z)rF?ZC#4dkB;9#^*mt?E*kL8&h#T6U)D_=p-aqjjBK=}8JsDNv7m_BEv2fH@QgT8$ z!Zbk|thFW40;IMkh2$?J<_;`4BP zO;BLByd3E%5ob^28yOH9EWZv7=CAv5X$HcRdA0;07(uj-kt6b&$TlLwWuL}3xzA9R zt8h2qeu4WP&ZY-g6S$^u?cttsoR2VOW$8z-wIhTfb(w^s^@4sA%b6$4;C?w4F?uSW z$zfVo*wX~*y#s$=J_CX1NBEn5cwbIF>d1V==RUo}yXocJ*GRrv^0_CJJ4z2y{Bk+J zaw(i#4tt(%d9(<7OSVxGo7Z6TYXr$BNf3I)#l%GS(#1p3k)9N*i^1PCSxRD+akdmt zD70@s_`kprJM_QVv%ro*0ZND64;>MMa?t|%Qv#>y0$5(rR~LdByrEH0gHI6JQxQ_8 zM5vXg!%?e`?a7JsNYT+TMo&8qAwP(86!EiuTZS-dgr%4G3H6;*AI+V*YskHdQA=_j zHYh#1s$<=gi<0Yg|L)wK4~B2M)%EV@El(Go`MKnQ(~9WPs@fx4edl~(!Iph5K5AIj zIIGpHGi~hp*U=69Vqu@IDP9A%^f@w6*xF@QQ`h0E?Nc5`9dLS7LAg1MQVY()y`z;K1^C zR&KT}ec|hd<9Bw<*%dwI^c#(vbe~f1SJ$84ICkgf46{S~`R+Xv6Ec2xG$#&P7CNlO zpJN9O%5vPCKjqu+bO|nn-|xA(e|4Liw@NmBYXLgbpx?x+}ZmY~BkUfWD3 zqCVbRQIWdyam8!RJ?`(gzw#shoWr%J+?m{KwBge&y<*&a&32!u22ZMe zXi9*`+vA+mEkh3#Ki>Ie`3Bp|uUKxsa`b54E7xA=e(2_ja8wscB|M<9^5CqkP{xHerf)@%&Xc4zKQ&-FRcs%wEUV^vOTj=*IjHJ#3eJ zG9|?IZqdr&ZuO6@ZDgMx);w`^k9K(+(gs$cM!Cl7JpbVXGii zC~P7_Zl70(W41)n91A@HV|7KHQ3!q*D4b4xzT9!d zbKlSD{;9{lZx4oAElg|R5`n_F$a&w==_!qto zIQZtg>qFieoAm3Rc}>4+7t-+Ih)acGo>Q9HU4J`0t==HP(Re$3$&60lpPm2VF5}|p z<9DKJ{rvH^ZpY_$zT^8+r_~FSKm9!XTB~~Rm8P{lutj^hqBY8&KdqTC*MGK9RO@Ze z0Y5kJ$Qj+W!R46mTW?w3vR<8KO}eC~+<3$Bkl)Bzb}e)*KRz{bPs}l&qNX=9cAs`~ zdpS9InvbPJ_?qy*DDTgw%{kL$RhL@VDpt>5ynVGh<)4kV zHF`e&_7u-9+FcdD2LEumb((Ob;-dkBKfHTLbQBNOahQ4V^C96=rcd9Teeqz&r$C!ZOR zR}u4E)|GWWon0clYkm61SBr;SIrsAG#q07Ge^&AMMjOAA6{Bmf-)LJa;nv-<36K2C zH!l2riko5P&NTl^wT&**Y>dyZ`}($UE#p_q%Ke__THY_qeAC`($A!{;amC-37#g-% zy072l-5qy*d;jpX()VAewPx>>dSCzYIQ{13W$SIWth=)GizVMW*p0k*xc}SNU0!!< zJYw5!7suHj?An#Hzu(u%uP;yP-|zg4vgk)Cx_L3$lB}6u{?==j!%44;xVb5o&BoT^Vy&E>DhE*v%|fvB-@M`HQSid{`2As zyZW#GbKc<@-Cr|=P5LD7`yUJJ9RBNT+2w_pJ-^Hyc$KkJ_&5xU^mC z;SG!n9Z#K|UvVovY-dlejtjOGr8K=%;2tOblsMl%?&mYNC;a@$q#*l;KfM~e{@9eo zw}M80d^)W|&u&M)BcuaAI?WNPNk7!scd9J;s-jVx1XLZ_JM{HF0gH|uh zd$9Y9Q&HUvi9Ops_^q8+>mQwtb&mY~e(yj0r`;+4)Z_fm+kV`?@Pbd*)3$TEyxzxs zREzVw8ugDcdTa{Z>wRL{jnKP>YbW~uwrW$+l?jOh2hUy;lxLg0JFNJ5lk;!yjw-d- zcgnj}e)bQiDetxNIGVEe(#W|lw%$Ib=_i>7rneq@;nHVck2uh3Ro%@~^X4^pRKL!$ zn2K+jY`8MAB+|pUWWopcGQIBqcCu;c!aGYhp9s9$?$}oie>t{4cz?h<`@G$p?GA4l z^IqLiOODK+x3@U!cm3O4Lh3$TG;6S5!qoQpwjEBnPt7|#cus@*H?H2j_37pHwR4Im zeSPQoejRc)4A|R$Mek;2^Fi$obJS<9e4Ov(xF+EAg0^`R*Ebw9&P~()e5{?nOP7Rh z>vZYImX!W(=>hEgct*y{b7p4T8v1TR2b;j~t99327`JGB+pMDWxaeaSx6XEqyg#J< z{B9TPjBDPu@SC9VA+zoKO&+`2=IpJMecv@ZC><|H18t z7d`4f#I8Zwu=NAicosN?-rs#@QbcOO_&@Hy`qlQ|Iy6d&n-h=GJ9GK958iO<(q~4+ z$xNq#kItMb{wA?kfUxncg=Ye9j?i@;xoG9&D+TjfF5Z!N<_E*TmRT_Ey{Dzk;2V(^P2jqTMRzCpux1C2VHrjO1Ze< z(;da@jEy3@PnzH}QJ|JXle9qsdFP_qF))%2BT-KiYYG zaQwI8MOPQhODP*QcYadno<7@i$H(VQsTF)LV&TSdYYn}xO)Q`H=iRbFdEc(-aKSN6 z=aMwptM0s@*GKeO)2GY1?84Np{l*XIJTZ8~rZpeE@Ml>1&$qW;aNV@PJZyO2vSoD} z&#&ES$Dt1K4SKe7{PW(@%Rm1ZdgI`W=}Y6cB{#nP`wBzmzUJEfBUPG zwHrjuaGHB~*q-C6`Hg=Xefja--i?27``oTY?}3ev5B>0g%e>T{LBDoi6ux%kfclGH zjaG{f^Ppx4!xEsD3Z@wT&FrAZpauoBLPPyY*t6s?PqGT6B9HKj|ZnZg(aRq9 zTfO0!>V-8W9dG_V=GQKE?~SsA&YZ4G@|!inw}*$Vz5C-&_FsK>Mr^>S=a23fc<^xN znHR=t+)wbNX)Uv~=sH;jesqdgp_M zK3V%0#At7v-1E!L`-Lac_ZNRL{g}t%W{Vr${%Gyak*6CuJlK3R+0Ao(w~MMP39jdh z14lbV<~!WIxmEY0`+=pmJo`^`Tz5Gz(VSPWcuk83yKId=jLdxV_>0A7mZWdUKL7I@ zi8{mi3C@GB%^d7{dr7o^*^Qlxt{E;>Tnl>Taa73rCp-+BJszxBVYIY%%nh1-%hr+@ zr7jI}S@*H!r}^7L+JFdQ4?kAjY@%?!J=R)=lIe6iEd7TlB*3F6>-TGWogW^?>&TZW`YD2AId-E&C z{^Y#&LMxX>Qyxv3f3@9jW2QIo-5(5?791$s^Ucq#2c6WX#W}YgvSOlG_(5v>(ameUII&_( z?Su_Chr2r-jcs?>t*KjD!0{EIpv36mmxUkz|*Ib_E{??o##3k<)l-ZXk&dXB;V#FcNfk9;kq<9sJAdf+;2 z`{|@(f4E*KinlKP>4;uxIyTW61g1ZF&za znU@i~-tphk+y6E^2>X2??ET-4D*>JEGX283DS@f2?zHzF|B8RM{j?Mhw`t>NHE~&; zJNNUilW$$C8#%>LuS>!8x?mM4Ub*Jq@|Yhk9kOod0Kce76OO*nx#hxcfnk|5-;MPQ zZy4p)=u!Kv^Y`8wyCpfPtl7K6CXRbJ|ANz{T5ATa-f(uz*zxn*AN{hy<=cmnMtnBg z-fzQs%cZH}sSleSIP+5Wz|}qMQ0_bqF3bo!SoufJa>+;{u)lc!y}>FOT2Z+2Oe&<8(x4|-wVTVDuA zU%b?z_3b%FTw8WOb^Ao8qZhP8#vJb6zE$^ux~A7B-*!_8(JK$3BQlmM(7c7~4CpsyKNT?~pB%$yi7%F^j z6a%X$zDrg%`G>>=CCI0pvy#{s7RdY{wkolhE=t-a@MIk9IG56`j3kSS6;_F4?o9#6 zyeiLBVwMV}Fl?l)PuOK@#KwDeEI;-Kkd0$y2%zbcXj|psWKT$ZQDdbkL(QfYLiANi zXhkhWC)I38@C?P-DuYs*jl-2uavE+l^ykC<*Q^ysSMjZrm3H4xo|T1s-a$ENsFNmX zES?kKZ-dH(1`m~q%0q4eTutXND8np77^az(j$u%KTZC`e2+Iy7c*>~^Ti(AqWQ}bO zWHV!ck#85xN50T}2xO@tx9`h%hC(zCd!VtshK{&lrGCm{{q2rxX30SXyNPlckbhS= zZ@6cfDGcr9TOL@O7_#}cj-6071R-x3-T~NO0dEKFr+~Ks4p6{q3lXH|IeZKIMU=q>?th;z!(>lvMSlzV8j;^Tv=5D~|9!r|$mlrE+aTLCPCPi63jPuk~?FzBgIWcW+Kr2SUH?g}^ubx^_!0oTWO15Swt ziud=4U^czXuvWy$HQ|c5uSnxVPJ0Pp>IWKA@^~kU7n+Ci7 z)R)1kHI5yK_H<_oTgCi7<}x$%xe?OAj9i~PCyyJ%jX}An9q6Z6AD&og{>`DnOL%gu zeoOHz=QS32byL7AC3rB3WG(Gb5$X+WSIbBH=Rh5bYga_XDILxiemSjUh--uQ)#J)% zpwbBDhipmu7D>fIY3)W@G{5DvzLe6E;U56gSh_W%^!n_5>SJZY+Q(c82UbchY+28j4oO5=<@g>pexihrF?go!G+Pk|7M-C@nN{@FI*0ddcDY6IF`%ke_VIj`AtK*SzxoZzd?SQ^sL(FeeL=PFo|xuaHnevhMkO-D!pL(EO2M!V@6u zS6)O-Uiw?DHPNGz(*Qq1y4&wqiWr#L9mu9@b?2SXDqeMt%MJ2YizK}!5O1fzpcVISY9Qnl7sf3AE{lBawt;`cNxY8A2bRMgGjKGt3gwa=wcl#oK zQCK77L2DSOI$ZWuxeFVkpU%7%@m|zhFhOy3mWXgEh}Q;wm7OO~Myvd+h+K}ifru;T zO|%)UK~mnH%xsHtG+X!3GPVuYl%|rLT%ro(ViAv3nFs9VILpZ_7=_cwhw5|@KCL@6 zeq@?>9iE@EKT$wj%b_^F#Y`u=qD?!E%x#HAz^6Hp4_^)ce@C~l9f~!a4o4@^fxyqft|wFv zL=u_gXOc-5ZD{`m<)AVA1AM{}3*h&M-wcIxfSBT2V50y9GOBsOqzG^%-`EJZ36d#_ zxWP^lvj!CTf1II*lxCSZ`BJ@j@=14_5#}|xEpS`mw!v+e;2rSg>RbgrB%@0iZjZW> zB0cp{+l;H@##2)X0+YPq|?hQEk`&xW=1^l$rh>Rbr_qTjf z?JNry8!Q5gZiBpJcn!u}D+PQ8Fzwrtzn`rJe+*c}cUcxCha*-dOc8H5V3Nqm-zQ4( zWO!0FxD+t48S?khC?pILtH4xl#rWa!v3w(hWDL>CMY6_OTCJ|HNbs9T=PfwuhrN`h zbZBF>sX!?7D_vc8*jITUmI!skNZxx6%~3Q{dA;19j;paC5BGo z=kT3=iuS2te*N?NOrlr*g8AA~k=$QQ^yqUGaGsJft(iW-aTEXYR)u6bNs}GogNltD z?Zzm{r-1*?IbY4;ZL7>vAVZJ|y*2}kk@%unH6xcA^r z!Tr~x+TTZ9`Vqo74fkK`QqxiGlS``})ehxG`LF1ik+G;0{hoG&!lagOQIXEUExnR@rK)rSxgzxgM7aDV}>%B4;1bW|3j zn2Mc#Ipz7@0g#-@DF295l!@zMg2#|TuvKb^^{8)mQT5q zVfl1R6fL@2Ol(|y_Z|s7dnNWxN>1t1H#IH2U;hCE2k|>qa&q&AkH{}5G!>1+sb3|d zMwga7S1EVt;79iK|L_-ua9#L)Es-5Nb(UfYDz!#yV{2#c;OOM+;#$kiy>^|t_3Afh z*oX&c+@xu<<}JjQty+7uY1_`zt9=J=A74Kz!avOR*#;vS8=Z#8=Lc9PT{%C!@e}kp zV>jV{3ilaYLpT~Q7puXSq<7O0_bJE8U)+6%z4f_%;6>?VX<9u5;d3~`cjPX^?Lgi} z_|36ydBg8VyV@WeFhO*Xqxc?FeOM}V6 zR}gCicIi%x@=#6~^V6nrI*q3?H7G1dgMj>&P2d~WcEP8)NKQ#geF0cOYt&4BDgrz~ z7$d&RM6S+Ek!n?f<9*SkLNMMFZ>ES|mF|9qokkQEmkwJ?1uzmq&MZ0|6bCG`Gbs6S zLsf$aKTG8{!l%Byh0dmSlVK5kN$@i+erPa;oW~@tx^zJqh{sd*-Isu`NKQ#^U&Xs; zQ#Oc*aUc?yfXe$WQN|-EV?Ofy5suW_&n9n(lxV8(1GI%slevJr3GyQvT?rGfC(RLJ zPjDO!i)mduk035>IF;j&T8&gKGECxM!Z|WhsCKI{xFCzMfNs`fH(RDM5Ql^Ss&;*_ z)Lc(_5pq=9ss(|y0nB3}BU3Gg=&TXXsIgfd=-W+GI9;BJ_8{3tT4Kl8zL6qFbL`3( zlJCJph0iAlX;b;#cetw=f>2y4Nd`7J76)gWgKRL1&@9rSV6<_lGAItb0O5j=Xj#1h zM~p#g4(=8Elp@9MI3bFtAD#i04O|)^sVI0(vgONYBeo<}N);jNB`HJ!E@U9}9bL>o zI2AWFARmdHW)ImoTi+}nRAxO!k8WE<}Z`po?lKO64o| zW#@U}Mi6hgnv#J{8QpqHrOCwJXR^g%=v@)l>?@|3V5ox=0<$bEGC#!+yG7~7MAAYb zN};!i8|ct3MNs|}8>v#o*vdsmQc>c0*rW|LQ6UaE%rdqV`@;$e1)?+L=^{8(pW0rM zTl1T}35vm~MRW_MH+DhOp~pxHQX96cm`$`s!+=D@b&z!O8Rdd~%1}}@d;zL&;K64z z{HzByvqjf)8mG_NNn`NYr`Hx~QF<~=A{AwR z1k?9t(+<$dNcZHfMY%GNj|t8NPRU<=1^8>YZ{V&;-@qy|I_)}q`t~i{cW|H?isk!E zfhdS$qsteC#2K76;d=+=UG{7^SBb&^;0#kCF3O<83>9h2LK?IN{8bvtXe^!F5}cDz zHI4I9IeK#?gQT_N2O-b|&c!+X#zM?cni#SY7_*H{hkm_%?;<{}A#!__Nc4gX&zE3M z`>}Ir193eR+d2s{5F!qrl{HT}8QwHfB4i0}3BUAk4q z`l0EIRqBHi#YyOab&5`3#XJwjcfy%+JG1kpNe+SQfu*A-JBwh1a6)nCG=wD@vIsum z6FE+$u|uRd4d1Ao5{)P63Q4*E?E>^Tw7#1vvlrGPJmFNPs$@r~Vhl)<-ShZH@{_83 z8B2ifWe`z(;TFOWJ!n6Ns~LG%#WgJKVm47|itkiUIb1SE2-zG{8nO6B`NUSa>N8Rt zfcHed##A%#0EwmOA>_!f)e(L`SPD=4FwxsmUs-Pe`bqKqXFONl0E9CKrN-p_BLT6} zB|vgdAkHsv)b`|V!tt(=!uP20P9VDSinu7c0O+6J3&b0PUjtOx0CKaj^+vAiEtDhr ziAzwV5x{j=(s9RhI}FsZ2)}+VKksiVd>Suu!mR%kx5y~x#(so*vM4MDD-X2^wf${4 zWxQW09_P!e^0>-6vSjkO=mY!%yZ)*Y*h*e6e-7p2EPt`DR*!v?EY?A8l`h8*_|kSZdaM;QvVZH zfQbR4fjLgBc8QAeb`;Zy`1yR!+<;7%a4lzv1Ysfi+8_3UGgSA64=<0ZQy;9w?A(c^+ev!$jFI0ZX%I4J9yzDbCp#!o#{lan|$ z_q869%gE!(Vgb{D`_YRT?IPP{REE+s+8gW$s2z6fy=QE=zyH_e3u3#)$9q+Vt1&er zj($dsDN*ls86dprX=v5tfmf=e9>Y@yLHVy!XBmxCCXY%{qk_<~mc)X)eju;U$fgT_ z@BnTArJ@C2QR^pb!xm$NRJ5c#kc{RmJus}9<^hNxU->qM;Kzz_)q>Mgfv_NHCJ#hmCdPRVI+~&f^7!?F8 zr5^XVF>VVsP&^`0R_vxc6o&4bpd;5wb;9o(W!ZorQC>3Y`;@fT-^$HPP#EeuqQQBAf)1Z&8l&zUwmlEXIHFOHY`U1IIi#|PRYr+ zzk)PL()cWEEnkZD7V;)(2uXX13zOmLc#c-UQ}9e-x^cY=`Y;=l<(ZWbJtpa2*bEhf zK`*PgxT54%AxJ?x4PgJX4YOSh&V8A>M(}u*yc!+cnFVJu@-q zy~L4=`5L7N&#@5k7o^-`G7&B{;fuiEhvZ=};h6Ox&Cona?ZCw2e;Ju^qO?Ve=01=+ zj9sy8fq!RbR@T|pSx?d}!sbLHCobi;nLOpltV!p})RQ@M8>T*A zS5#75ggeMcv4flmi$#~efsuM6N>P)V@e;;$IZ8Paelc8FHP}l569ww0fal_wq&RZ? zC3sebC%B2?`|@hv3HGe^y^#W5jb~;0I{*`KunW?V^T(FsDzIHO_%XsN!{4h06KACS z{*46xza4EL?&-uy47$6^K<%OoB$1$gl;JEq6AdiGG;XNeGQ0-Qq6GyV!oBRm_g#-K18C^1q452a!<#WMQfFz>JMzAwgMvz=WX+E&rjotGr z=S6E8t+O)R56`5PlHq}P4p6|o@l0b<{_cxs8uS0J+FV|rE+A zJQI#l!XmwUx?Ni}VNe-W3h%zktyX3rA2#k}RX&{#2fiRXn-o93Lhwp%_#O?P!u5oY zDJ#UubTv+UlgVv1O7&u>4_WwIPd~S^0Boe1%L+2V5DIgU4sr9<)0KIIBCJ7J>xDlN zM&{ND7d?bizIy~X15yumu`bvhuoh3*Y@BGOn^Xh+gP5_8@-Ed1lzR~JypBTA{JkZ$ zhwKxdCuUT>AG?a5qA!0ZCI>+m|E7B4&^j)fr+?2;Dn~xb{p(Vo%!KE}TdC zXfAI=hSa}*6&)7ya&&!ZWpr!&ZHP~E%CVC|t`XJAfPFQaw)f>`;)!eduC7x-`s~*QH2}SUC5w=Xpx=w2h9i-OAUsAIo`~xKrzkbdS){b&(pSC_ zQ~D*FX}VSIV<&tkF`F}d{AZ5VP-$yKmHv0d`(6mkFMJwX)$?MJkP=;mxPL4gbciNV;0!N_xwuE1b02#CMpBfLd4aIbjctgjo(GFb;gC-!grWKn zzNdU-c(R)B^H9!Rca(+Zw%lK}tHE^u*M+MGCyyVZof^P3grgsML_bw8ldrEI{#!>W zH&|tO6%$-yAJ0kk8HM=%NJk!%TC^34D~LX#^_|ChzB!I0+c>ZnKR%cFv-B5=7+TW? zAS{(DNxnwjSj>z{O@*e(`O3AwpH zUDnx+kPXF)#YJFQWSNj)u6(w>M2I*tEb5Es$%Xl4@!0ps?L{h|5>2L}R0}Qum$IfW zJs`5qm&IHOM5js18Hwl9aLbS(xx~`H7&50p*nghN4IknmPe6vLM&k&oNo5XwN=z1g zoFpEi*QC-UhPJPfs}Z`Dm{B>pyiATrZ(>nss%8vs1c9kWEKUu9Wd!2(#>w)Dd4(g) zQlThGQg25~o1+sUcBL#}wUI#lU2#bfnqP4iex-F=9PY?0u_R~rW~b05lbkcX5Nar6 zj;R=9&`^nkAq7Y7W(ZB#UIwxa(UY!}ByjSHCcsRYWS;?1AZ{`@8eZDSIY>PFkPQLo zS?T&(jwuQtSS#fAD!}!G%fX5&@Z7tIAC56fbC2d0(XO>5M{730w8qjLrteO0H1^s0 zCHeH7!clmll}Tep?uNW zHrz6}*WeDqoq@Xq_YK?~xW{nz8-NqxTEKb3g~KJl4Tj5udme5k+)HpP;5NX$4tEgl zJls{dpWq(D*`l55!ijKxaNXc~!wrBl!WF@lz!2=T~f$U z1#qijvzw5DwAaH?+dOsp5F05h_=V$0KN;!1jl^l~Qo=12@SFHf@KfhsDO?p|Uvm?B zBF${L)^IR?07)cfU>-Buvy#Hm#rh&oFVK!mbew?&KZ6UCg%*Tt@gq;fA4Ur>>D9uXc$hc+_Gec2Mv1k+fhcdhW;8qNbwZlmt_;DK*4 zEL(N!1|=!TQnqaYm)5~BBPZWT8)bY0IsHs$Fl5pF7D!{n7Ji*bXFSt9kYQR|lyGP@ znA(okUOBu8&m;$t;UYW}Jto7&cy6hHDeuM#*n(%`*J+oy9A`XWWg5Eyw}q3x@4>S& zP2!yr6yIm!nPeeyc!K@lVifO|<2eM*+siYmQ``1k<**a!og&<1Jhy=(URw?$^Opw?lp8{CnXW;ZYf$gJ+`iWSH8Y zaA;9UVHr`{V|>Q>%ijn`1>oC1m0Zg40uYaIy$lBf?*1>*i6pgEWF*PBbtRVUaNOP8 zS%l#oE=!c}=Y$l8amoQqBjU}hE7>FN)ubz5nTj-RyBo8JnGK)jyli) zAt)b>>r9g=pEOq_Ef3EN2+a!$%nJ?9gAI2c@ogpHB>|x&L4hTq!DQFX_NZhB1!ji^ zx77LiVvxz{(cGpnEW>0G-&_H=22ACUzk2|taVo=80aN+L9{e~R9jfD z_1HLO7}up87Vu6{;D`qgjf@nDVYxt)3R$_Lcr|1(UqUo6$g|wby#4(~c4%R%S*0P>L!}_4CzWMp1 z3Vi?3lmRKu=S=8Mew9lm;*%^#hV$@Db0!Vz4gJP2u9;nEXsxnxzHojdBNcs=n1}lX zjfVIFOSC}`(hF+oQ!U>t_f&HL3R|LzF}Epj$q|Cf|30baVZXkQ--H-6&SyF;eLl} zzr#&<2)`YCdRGU&D_koH*1~TH=Lpvv&KHitkyGKh9$X6A*-v_J2fqoN4;;fr$j=Lz z%4=JDJa>TehJ)r)pOuGOfk_fV<~<1Ov5U_wncrgkCF8E>&T#CiL)Ujj7+QyD?VvW% zlc6I_&6sgB>5yS5P4_L3xiY6#`6-21@5#=X@#;RvpMK=|;?I-$0Y@UQ9mtFDT^Slv zgzx30K&}wTfP5D{A<@XtTQWp5L}2ov8uSw3Zy`SM&llknjrtjU%2VQx{|~L4Jb{^( zt-9TYw7aE>jxC$zFCUdiN;O3&s|xKeLyaZ|jTCisHW#%j)6g@3(qb4D*iFaww(5Y_ zB>{PU9x(`9ea_Bw$QT^xEe3@S%>a+f%}r3}3%mK|X}PVfJ3UcGdBFuqv~eS|#d7dcp_@REy&6ON3mO5uqaP>dU83a>I=Ir69ek$oP zZOZ)M%?wG7=qO^mWuws@`TIyw2tyiFZjd<}z7d{Nbi6hn%NZ*rV+Dehb;jvN=s zTHEmez7ZY?LtW)L9FFG*xJWpWeq*q5h+`bR9mk2|JU!tLt+CtC%?xo@AWg#8gr}*@ z{-yr@{sI0F_4)_1Ox;I1O)^Kgam{Jgaw2LL1q1~K1qB5Mg#?8Lg$0ENMFjf?2LuNO2L%TQhXjWPhXscRM}+u? z1cU^J1cd~LgoK2KgoT8MM1=Z>280HN289NPhJ=QOhJ}WQMuho?1%w5L1%(BNg@lEM zg@uKOMTGl@2ZRTP2ZaZRhlGcQhlPiSM?|2A5y(CQNk<@B1YSKUxouD9Hi=PUKm_ov zRPUQ;HyYc1@U3ej;2zT0AA$}fdP0WN0k;Cok4xcpKz!WE1CM{9`N|HhA?dbc8K3qR zA7k0@E7PDOS9l7G@t($y{GG?=-&jt}{Fl*3h{OQlEyN-E><1doC){e?M3s|;l%VjWdc-0wwb?NE zwc*na4q5}CN#W5+Sy!0`vwz^V#9T+5_J||ttTEX^9?DHnEbTNX(3j>FloVjM4afvo zKud8{|3CkP=*{<_a1T=d?N3wfr=_0|eS@N&t^dSi1&UYl?Kk%ETeSOP&{EqfVd6bx zIL?;qFlE?W4Yo+IFc{?S&`j987t$#}G#EYU!HaLyrollbCK(w>d)R)y^D!Sj(J@8v zX}p%h$Mg|cxAMM{cQ5G~AY@Fse4wXGM8qYPm!(jmHRJAC3Z zFTf|+(HHPhTx&j*LKQ5}qg&%UAK-IBE?13hDk)JrAuQoP(m4>n`9xUBIM1&LX5UP% z$m!i&#A}1_G|q`PmtibROt%R|l}e-1s%`A-)b{ocYDXIa*$()#sfrIDDf1RDDTx)#fYpciJ23U&LG5-_?I= z9;lq#b&N_%p0i@bt7B#^cxmFS}OiDHwhrID-lcsj|j!tzOghoVe-1ON+hp@TxHrhFMjLOcN zGvD2$JN(PdL78_SR-~paeZ|+WooD*;m8;gQ-LP@%z5~Z?ot*16i|i8DXZ?oLAFQ-% z)VNifs4n0AbhF}}6I!u#o3@@o;gLOhCZ?pO_Zu*1$gqqoWA+Gh>A2@-tlhkQ$B}c} zwilWXEg05njEzR?qsi8&{CvwNHq!*uYO3{cXl~QNCRXd(zI?N-ht@;uX&>yA6f+^r zp}wPi!;Wzgnk;(<|N1s9HBD?(UBk7#Z2Yv2b`Ex3#dca}hfqzVO=CN)vt3F;SddGQ zov*#)gtmQqb+B(=zj529bsIP&A%j?#Ms|+2J?z^#lsI*ZYH!=o#?iKqt;)ttV^cme zvw07D$MW^VTE#gz+Pc(*i);1{L+sTmX+{3{!KCVd*`&5?%JIC_-@s76Ppfr}E=760=+;`@7Yjvw33oReL8!*tORVv2E)Z z@91e$XX1{*#$MV8JNK?MBwqgAe)1>n9aeugA*hzBnXRkVe!{Hj+7UJ`8V5VK`5E0E zES<{lJK`+4dhyTIb*}5&-=R_Y)Ct`+Q@YivH#wz+t!?>*4mMFORYg9U##;4+t}Wan zZB!G^wV(KH`EOo{T1TyVl6!1o=kjBnY*pHHn=>8OfAElDI)iccyiJJm&U;s`UBBhx9+zM+mQQ~Dz@ftzKD~8& z(v+EN*B?6k&dIZvKJT&k;0GtpoJ~kd?muvtZu*OJcE0iE;iD%`e(GMo!QdhHe|ua} zUNG{@E3PdHO--BW#*N>${rUX|>NjZKBEEZ4GL8T7&+mEX{DsT6Zr>|5&#{!e)YjK; z!}d21pFI2Nm8D%@UhF@o#YgAQR3s%28f<4@%dMT?FE(yHK*j=_s)Iz z*~RZ3R|ul6)x;~>iLv%gw6^XOwz!tRX4Ar9LK96RdzIEt8?3d{sO)U*+#OSD)wWBw z(`cJII%w=Qb{aL-8fUGI#>rOYTF)lQu8CcLJGE^C=M-&>#s}!h-L{r1MNE4#5;OxF*Y;-PTtzawoaPzE%@XY z&|6c!*1nUbmZpj<(_U@%GNP7N_Q#LE3>1<&zpV zb*%4@s4bsi``TLP2HJpC+6kB1+Bw_Ul&^Q2aL-O9wztLC+1m0$nkJfBE`N!`C0wqf ztvW#C-p9DUI|VqK)=n87f@h+so=8U_!?qwU;eOJq(3&-*WQ-uc%Ld#Uju`$)T2Yv1 zlOYVPvr?$tKy2YGX0*8Jy|P1lf6?2t{;IcnV}?)j2N}M?V=;6^MMmf&)mNb^$ChCp zE?iI!J5jIHpfG|?ypQ?wGe?2#q5o18DR%u(Snl~Bj z6zSlgYN%B?V7apCpy_1azM)DCLj-Aolp(Y5vn;;3${QmZ4du4&a6TdL-2 zjmn8&8w60*RoBO=htNpdUS+3oR5w?3L|kXY^hEMVRbzuuXQy^zsZx=UshZ%X>Ijri z&ZU{Ehf1qL;wpPpAC=n9**;UHc5t#wP&Yw(Dpi=P3OU+1sXQE1*;`%FbS;c5+Z*#H&iwtyH5lTD619R`WR;0j0I06xH^&j%t;E zivX=ZU>lXEgR@#hB~_Ymd_+V|q`g|bSfg@L*-?fX^@*;6>g|?-X0|Fr6m0XMPE@kmHJ1N%@%$Wb-F#h z8BXniuSN|z)dpr9>U-#Uj0n|SFz zl$A^UFLAnW|6Jw{FeQH DUHfXf literal 676910 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

    $HvVw(Xxeiz)HlcWDVX5uC5%>`_zNfeY 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]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%0AUm0sbLBYJeccfQg2#`3$1BIdn(T-Y{r^au)LgB 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 literal 394620 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

    IL7465WgUGlqYAn1@}c6*(f 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 Date: Wed, 10 Jul 2024 16:15:38 +0200 Subject: [PATCH 35/85] Fix: Add stker_addr to active btc delegation --- proto/babylon/btcstaking/v1/packet.proto | 2 + proto/buf.lock | 4 +- x/btcstaking/types/packet.pb.go | 185 +++++++++++++++-------- 3 files changed, 123 insertions(+), 68 deletions(-) diff --git a/proto/babylon/btcstaking/v1/packet.proto b/proto/babylon/btcstaking/v1/packet.proto index a9732cfd5..ae2b33864 100644 --- a/proto/babylon/btcstaking/v1/packet.proto +++ b/proto/babylon/btcstaking/v1/packet.proto @@ -58,6 +58,8 @@ message NewFinalityProvider { // ActiveBTCDelegation is an IBC packet sent from Babylon to consumer // upon a BTC delegation newly receives covenant signatures and thus becomes active message ActiveBTCDelegation { + // staker_addr is the address to receive rewards from BTC delegation. + string staker_addr = 11; // btc_pk_hex is the Bitcoin secp256k1 PK of this BTC delegation // the PK follows encoding in BIP-340 spec in hex format string btc_pk_hex = 1; diff --git a/proto/buf.lock b/proto/buf.lock index 334f15efe..850ba5bf8 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -19,8 +19,8 @@ deps: - remote: buf.build owner: cosmos repository: ibc - commit: d7191877c70143938cf411467cebf39a - digest: shake256:b397f418dc751326dd35100c5200c56e1fd7fd24746e39f3ae4d6c86b175e48fe12207867f0912eb31e98f695e9a8afdec7cb4076502d3998026501a88641a9d + commit: 6b221c7d310545198c1dafe70287d254 + digest: shake256:c5ea4d89af1c47f4d02057892eacdcb863359178079d9599f30d853b374fe9e9bfb3d9ca6720361c3439999a885a4f87fff4cd41c6c26b1f1142d60c386f8323 - remote: buf.build owner: cosmos repository: ics23 diff --git a/x/btcstaking/types/packet.pb.go b/x/btcstaking/types/packet.pb.go index 904f83257..3638d1bea 100644 --- a/x/btcstaking/types/packet.pb.go +++ b/x/btcstaking/types/packet.pb.go @@ -297,6 +297,8 @@ func (m *NewFinalityProvider) GetConsumerId() string { // ActiveBTCDelegation is an IBC packet sent from Babylon to consumer // upon a BTC delegation newly receives covenant signatures and thus becomes active type ActiveBTCDelegation struct { + // staker_addr is the address to receive rewards from BTC delegation. + StakerAddr string `protobuf:"bytes,11,opt,name=staker_addr,json=stakerAddr,proto3" json:"staker_addr,omitempty"` // btc_pk_hex is the Bitcoin secp256k1 PK of this BTC delegation // the PK follows encoding in BIP-340 spec in hex format BtcPkHex string `protobuf:"bytes,1,opt,name=btc_pk_hex,json=btcPkHex,proto3" json:"btc_pk_hex,omitempty"` @@ -368,6 +370,13 @@ func (m *ActiveBTCDelegation) XXX_DiscardUnknown() { var xxx_messageInfo_ActiveBTCDelegation proto.InternalMessageInfo +func (m *ActiveBTCDelegation) GetStakerAddr() string { + if m != nil { + return m.StakerAddr + } + return "" +} + func (m *ActiveBTCDelegation) GetBtcPkHex() string { if m != nil { return m.BtcPkHex @@ -810,73 +819,74 @@ func init() { } var fileDescriptor_3ed0d17ad14d6c0e = []byte{ - // 1045 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x41, 0x73, 0xda, 0x46, - 0x14, 0x46, 0x18, 0x3b, 0xe6, 0x81, 0x1d, 0x67, 0x6d, 0xc7, 0x9a, 0xa4, 0x25, 0xae, 0x92, 0x66, + // 1059 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4f, 0x73, 0xda, 0x46, + 0x14, 0x47, 0x18, 0x3b, 0xe6, 0x81, 0x1d, 0x67, 0x6d, 0xc7, 0x9a, 0xa4, 0x25, 0xae, 0x92, 0x66, 0x3c, 0x6d, 0x2a, 0x6a, 0xb7, 0xcd, 0xad, 0x07, 0x83, 0xe3, 0xc1, 0x53, 0x37, 0xa6, 0x02, 0xb7, - 0x33, 0xbd, 0x68, 0x56, 0xd2, 0x02, 0x3b, 0x02, 0xad, 0x46, 0xbb, 0x60, 0xf8, 0x13, 0x9d, 0x1e, - 0xfa, 0x8b, 0x7a, 0xea, 0x31, 0xb7, 0xb6, 0xb7, 0x8e, 0xfd, 0x47, 0x3a, 0x5a, 0x49, 0x48, 0x10, - 0x70, 0x4b, 0x6e, 0xf0, 0xde, 0xf7, 0xbe, 0xdd, 0xf7, 0xde, 0xf7, 0xf6, 0x09, 0x34, 0x0b, 0x5b, - 0x93, 0x3e, 0xf3, 0xaa, 0x96, 0xb0, 0xb9, 0xc0, 0x2e, 0xf5, 0xba, 0xd5, 0xd1, 0x71, 0xd5, 0xc7, - 0xb6, 0x4b, 0x84, 0xee, 0x07, 0x4c, 0x30, 0xb4, 0x1f, 0x63, 0xf4, 0x14, 0xa3, 0x8f, 0x8e, 0x9f, - 0x68, 0x36, 0xe3, 0x03, 0xc6, 0xab, 0x76, 0x30, 0xf1, 0x05, 0xab, 0x72, 0x62, 0xfb, 0x27, 0xdf, - 0xbc, 0x76, 0x8f, 0xab, 0x2e, 0x99, 0xf0, 0x28, 0xf4, 0xc9, 0x8b, 0x18, 0x93, 0x52, 0x5b, 0x44, - 0xe0, 0xe3, 0xe4, 0x7f, 0x8c, 0x7a, 0xb6, 0xe4, 0x12, 0xcc, 0x8f, 0x01, 0x2f, 0x17, 0x03, 0x32, - 0xf7, 0x91, 0x38, 0xcd, 0x82, 0x47, 0x75, 0xe6, 0xf1, 0xe1, 0x80, 0x04, 0x17, 0xb5, 0x7a, 0x53, - 0x26, 0x81, 0xbe, 0x07, 0xe0, 0x7d, 0xcc, 0x7b, 0xc4, 0x31, 0x3b, 0xbe, 0xaa, 0x1c, 0xae, 0x1d, - 0x95, 0x4e, 0x74, 0x7d, 0x61, 0x4e, 0x7a, 0x2b, 0x02, 0x9e, 0x53, 0x0f, 0xf7, 0xa9, 0x98, 0x34, - 0x03, 0x36, 0xa2, 0x0e, 0x09, 0x8c, 0x62, 0xcc, 0x70, 0xee, 0x6b, 0x1d, 0x38, 0x58, 0x82, 0x42, - 0x1f, 0x01, 0x58, 0xc2, 0x36, 0x7d, 0xd7, 0xec, 0x91, 0xb1, 0xaa, 0x1c, 0x2a, 0x47, 0x45, 0x63, - 0xd3, 0x12, 0x76, 0xd3, 0x6d, 0x90, 0x31, 0xfa, 0x02, 0x76, 0x03, 0x62, 0xb3, 0x11, 0x09, 0xe4, - 0x4d, 0xcc, 0x10, 0xca, 0x5d, 0x35, 0x2f, 0x61, 0x3b, 0x53, 0xd7, 0xb9, 0x5f, 0x13, 0x76, 0xcb, - 0xd5, 0x7e, 0xcf, 0xc3, 0x6e, 0xad, 0x5d, 0x6f, 0x45, 0x97, 0x4b, 0xd3, 0x39, 0x85, 0x0d, 0x8f, - 0xdc, 0xa4, 0xa9, 0x7c, 0xb6, 0x24, 0x95, 0xb7, 0xe4, 0xe6, 0xbd, 0x34, 0xd6, 0x3d, 0x72, 0x73, - 0xee, 0xa3, 0x0b, 0x00, 0x6c, 0x0b, 0x3a, 0x22, 0xa6, 0x43, 0xfa, 0x6a, 0xfe, 0x5e, 0x9a, 0x53, - 0x09, 0xac, 0xb5, 0xeb, 0x67, 0xa4, 0x4f, 0xba, 0x58, 0x50, 0xe6, 0x19, 0xc5, 0x28, 0xfa, 0x8c, - 0xf4, 0xd1, 0x25, 0x94, 0x92, 0xe2, 0x86, 0x5c, 0x6b, 0x92, 0xeb, 0xf3, 0xfb, 0xab, 0x3b, 0x4b, - 0x96, 0x34, 0x27, 0x64, 0xbb, 0x82, 0xf2, 0xd0, 0xb3, 0x98, 0xe7, 0xc4, 0x74, 0x05, 0x49, 0xf7, - 0x6a, 0x09, 0xdd, 0x75, 0x0c, 0x9d, 0xe5, 0x2b, 0x25, 0x0c, 0x67, 0xa4, 0xaf, 0xfd, 0x92, 0x87, - 0xdd, 0x05, 0x85, 0x40, 0x6f, 0xa0, 0xe4, 0x10, 0x6e, 0x07, 0xd4, 0x0f, 0x63, 0x64, 0xab, 0x4a, - 0x27, 0xcf, 0xf5, 0x48, 0xad, 0x7a, 0x7a, 0x86, 0x54, 0xab, 0x7e, 0x96, 0x42, 0x8d, 0x6c, 0x1c, - 0xaa, 0x00, 0xd8, 0x6c, 0x30, 0xa0, 0x9c, 0x87, 0x2c, 0x51, 0x27, 0x33, 0x16, 0x84, 0xa0, 0x80, - 0x1d, 0x27, 0x50, 0xd7, 0xa4, 0x47, 0xfe, 0x9e, 0x13, 0x49, 0x61, 0x4e, 0x24, 0xdf, 0xc2, 0x9a, - 0xcf, 0x7c, 0x75, 0x5d, 0x5e, 0x68, 0x59, 0x1d, 0x9b, 0x01, 0x63, 0x9d, 0xab, 0x4e, 0x93, 0x71, - 0x4e, 0xe4, 0x41, 0xb5, 0x76, 0xdd, 0x08, 0xe3, 0xd0, 0x33, 0x28, 0xd9, 0xf1, 0x00, 0x98, 0xd4, - 0x51, 0x37, 0x93, 0x1b, 0xc5, 0x33, 0xe1, 0x68, 0x7f, 0x17, 0x60, 0x77, 0x41, 0x4b, 0xff, 0x43, - 0xba, 0xcf, 0x61, 0x3b, 0x16, 0xac, 0xef, 0x9a, 0x7d, 0xca, 0x85, 0x14, 0x4d, 0xd1, 0x28, 0x75, - 0x42, 0xb1, 0x36, 0xdd, 0x4b, 0xca, 0x05, 0xfa, 0x04, 0xca, 0x5c, 0xe0, 0x40, 0x98, 0x3d, 0x42, - 0xbb, 0x3d, 0x21, 0x93, 0x2e, 0x18, 0x25, 0x69, 0x6b, 0x48, 0x13, 0xfa, 0x18, 0x80, 0x78, 0x4e, - 0x02, 0x28, 0x48, 0x40, 0x91, 0x78, 0x4e, 0xec, 0x7e, 0x0a, 0x45, 0xc1, 0x04, 0xee, 0x9b, 0x1c, - 0x0b, 0x59, 0x82, 0x82, 0xb1, 0x29, 0x0d, 0x2d, 0x2c, 0x63, 0xe3, 0x12, 0x98, 0x62, 0xac, 0x6e, - 0x1c, 0x2a, 0x47, 0x65, 0xa3, 0x18, 0x5b, 0xda, 0xe3, 0x30, 0x73, 0x29, 0xa4, 0xd8, 0xff, 0x40, - 0xfa, 0x21, 0x31, 0xb5, 0xc7, 0xe8, 0x6b, 0x78, 0xec, 0x44, 0xf9, 0xb2, 0xc0, 0x9c, 0x42, 0x39, - 0xed, 0xca, 0x2a, 0x95, 0x8d, 0xbd, 0xa9, 0xb7, 0x15, 0x3b, 0x5b, 0xb4, 0x8b, 0xae, 0x61, 0x2b, - 0x9c, 0x4b, 0x0f, 0x7b, 0x22, 0xc4, 0x72, 0xb5, 0x28, 0x25, 0xf9, 0xe5, 0x92, 0xce, 0xd4, 0x63, - 0xec, 0xa9, 0x83, 0xfd, 0x90, 0x89, 0x76, 0x3d, 0x2c, 0x86, 0x01, 0xe1, 0x46, 0x39, 0xa1, 0x69, - 0xd1, 0x2e, 0x47, 0xaf, 0x00, 0x25, 0xc9, 0xb0, 0xa1, 0xf0, 0x87, 0xc2, 0xa4, 0xce, 0x58, 0x85, - 0x43, 0xe5, 0x68, 0xcb, 0xd8, 0x89, 0x3d, 0x57, 0xd2, 0x71, 0xe1, 0x8c, 0xd1, 0xa7, 0xb0, 0x1d, - 0x89, 0x5a, 0x26, 0x47, 0x07, 0x44, 0xdd, 0x92, 0xc8, 0xad, 0xa9, 0xb5, 0x4d, 0x07, 0x04, 0xfd, - 0x04, 0x8f, 0x86, 0x9e, 0x33, 0xed, 0xa9, 0x49, 0xbd, 0x0e, 0x53, 0xb7, 0xa5, 0x92, 0x96, 0x4d, - 0x77, 0xad, 0x5d, 0xbf, 0xce, 0x84, 0x5c, 0x78, 0x1d, 0x66, 0xec, 0x0c, 0xe7, 0x2c, 0xe1, 0xf9, - 0x3e, 0x0e, 0xf0, 0x80, 0x9b, 0x23, 0x12, 0x48, 0xa9, 0x3f, 0x8c, 0xce, 0x8f, 0xac, 0x3f, 0x46, - 0x46, 0xed, 0xb7, 0x35, 0xf9, 0x62, 0xcd, 0x13, 0x86, 0xc2, 0xc8, 0x5c, 0x3f, 0x52, 0x57, 0x39, - 0x99, 0xd3, 0xa8, 0x39, 0xaf, 0xe1, 0x20, 0x6d, 0x4e, 0x0a, 0x0e, 0xbb, 0x93, 0x97, 0xe8, 0xfd, - 0xa9, 0xfb, 0x3a, 0xf1, 0x86, 0xed, 0xb1, 0xe1, 0xe9, 0xb4, 0x3d, 0x33, 0x61, 0x91, 0x4a, 0xa3, - 0xe7, 0xe8, 0xc5, 0xb2, 0xe7, 0x28, 0xe9, 0x8e, 0x4c, 0x5b, 0x4d, 0x88, 0xb2, 0x07, 0x48, 0x61, - 0xcf, 0x49, 0xab, 0xb0, 0x82, 0xb4, 0xd6, 0xef, 0x91, 0x56, 0x07, 0x1e, 0xa7, 0xd2, 0xca, 0x04, - 0x71, 0x75, 0xe3, 0x03, 0x35, 0xb6, 0x37, 0xd5, 0x58, 0x7a, 0x0c, 0xd7, 0x06, 0xb0, 0xb7, 0xe8, - 0xe1, 0x45, 0x2f, 0xe1, 0x61, 0x3a, 0x50, 0x66, 0x0f, 0xf3, 0x5e, 0x3c, 0xf7, 0x5b, 0xd3, 0xa9, - 0x6a, 0x60, 0xde, 0x5b, 0x75, 0x6f, 0x51, 0xd8, 0x5f, 0xf8, 0x30, 0xff, 0xef, 0xf3, 0x8e, 0x60, - 0x27, 0x2b, 0x97, 0x8c, 0x08, 0xb6, 0x33, 0x92, 0x69, 0xd1, 0xae, 0xf6, 0x67, 0x1e, 0x0e, 0xd2, - 0x15, 0x99, 0x6c, 0xfe, 0x37, 0x23, 0xe2, 0x09, 0x54, 0xcf, 0xac, 0x49, 0x65, 0xb5, 0x35, 0xd9, - 0xc8, 0x25, 0x8b, 0xf2, 0xbb, 0xb9, 0x45, 0xa9, 0xac, 0xb6, 0x28, 0x1b, 0xb9, 0xec, 0xaa, 0x7c, - 0x3b, 0xbf, 0x2a, 0x95, 0x15, 0x57, 0x65, 0x23, 0x37, 0xb3, 0x2c, 0x7f, 0x78, 0x6f, 0x59, 0x2a, - 0xab, 0x2e, 0xcb, 0x46, 0x6e, 0x66, 0x5d, 0xd6, 0x1e, 0xc0, 0x3a, 0x09, 0xab, 0x57, 0xbb, 0xfc, - 0xe3, 0xb6, 0xa2, 0xbc, 0xbb, 0xad, 0x28, 0xff, 0xdc, 0x56, 0x94, 0x5f, 0xef, 0x2a, 0xb9, 0x77, - 0x77, 0x95, 0xdc, 0x5f, 0x77, 0x95, 0xdc, 0xcf, 0x27, 0x5d, 0x2a, 0x7a, 0x43, 0x4b, 0xb7, 0xd9, - 0xa0, 0x1a, 0x9f, 0x64, 0xf7, 0x30, 0xf5, 0x92, 0x3f, 0xd5, 0x71, 0xf6, 0x23, 0x4d, 0x4c, 0x7c, - 0xc2, 0xad, 0x0d, 0xf9, 0x75, 0xf6, 0xd5, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xed, 0xdc, 0x0b, - 0xbc, 0x6d, 0x0a, 0x00, 0x00, + 0x33, 0xbd, 0x68, 0x56, 0xd2, 0x02, 0x3b, 0x02, 0xad, 0x46, 0xbb, 0x60, 0xf8, 0x12, 0x9d, 0x1e, + 0xfa, 0x89, 0x7a, 0xea, 0x31, 0xb7, 0xf6, 0xd8, 0xb1, 0xbf, 0x45, 0x4f, 0x1d, 0xad, 0x24, 0x24, + 0x30, 0x78, 0x4a, 0x6f, 0xf0, 0xde, 0xef, 0xfd, 0xff, 0xbd, 0x7d, 0x02, 0xcd, 0xc2, 0xd6, 0xa4, + 0xcf, 0xbc, 0xaa, 0x25, 0x6c, 0x2e, 0xb0, 0x4b, 0xbd, 0x6e, 0x75, 0x74, 0x5c, 0xf5, 0xb1, 0xed, + 0x12, 0xa1, 0xfb, 0x01, 0x13, 0x0c, 0xed, 0xc7, 0x18, 0x3d, 0xc5, 0xe8, 0xa3, 0xe3, 0x67, 0x9a, + 0xcd, 0xf8, 0x80, 0xf1, 0xaa, 0x1d, 0x4c, 0x7c, 0xc1, 0xaa, 0x9c, 0xd8, 0xfe, 0xc9, 0x37, 0x6f, + 0xdd, 0xe3, 0xaa, 0x4b, 0x26, 0x3c, 0x32, 0x7d, 0xf6, 0x2a, 0xc6, 0xa4, 0xae, 0x2d, 0x22, 0xf0, + 0x71, 0xf2, 0x3f, 0x46, 0xbd, 0x58, 0x92, 0x04, 0xf3, 0x63, 0xc0, 0xeb, 0xc5, 0x80, 0x4c, 0x3e, + 0x12, 0xa7, 0x59, 0xf0, 0xa4, 0xce, 0x3c, 0x3e, 0x1c, 0x90, 0xe0, 0xa2, 0x56, 0x6f, 0xca, 0x22, + 0xd0, 0xf7, 0x00, 0xbc, 0x8f, 0x79, 0x8f, 0x38, 0x66, 0xc7, 0x57, 0x95, 0xc3, 0xb5, 0xa3, 0xd2, + 0x89, 0xae, 0x2f, 0xac, 0x49, 0x6f, 0x45, 0xc0, 0x73, 0xea, 0xe1, 0x3e, 0x15, 0x93, 0x66, 0xc0, + 0x46, 0xd4, 0x21, 0x81, 0x51, 0x8c, 0x3d, 0x9c, 0xfb, 0x5a, 0x07, 0x0e, 0x96, 0xa0, 0xd0, 0x47, + 0x00, 0x96, 0xb0, 0x4d, 0xdf, 0x35, 0x7b, 0x64, 0xac, 0x2a, 0x87, 0xca, 0x51, 0xd1, 0xd8, 0xb4, + 0x84, 0xdd, 0x74, 0x1b, 0x64, 0x8c, 0xbe, 0x80, 0xdd, 0x80, 0xd8, 0x6c, 0x44, 0x02, 0x99, 0x89, + 0x19, 0x42, 0xb9, 0xab, 0xe6, 0x25, 0x6c, 0x67, 0xaa, 0x3a, 0xf7, 0x6b, 0xc2, 0x6e, 0xb9, 0xda, + 0xef, 0x79, 0xd8, 0xad, 0xb5, 0xeb, 0xad, 0x28, 0xb9, 0xb4, 0x9c, 0x53, 0xd8, 0xf0, 0xc8, 0x4d, + 0x5a, 0xca, 0x67, 0x4b, 0x4a, 0x79, 0x4f, 0x6e, 0xee, 0x95, 0xb1, 0xee, 0x91, 0x9b, 0x73, 0x1f, + 0x5d, 0x00, 0x60, 0x5b, 0xd0, 0x11, 0x31, 0x1d, 0xd2, 0x57, 0xf3, 0x0f, 0xba, 0x39, 0x95, 0xc0, + 0x5a, 0xbb, 0x7e, 0x46, 0xfa, 0xa4, 0x8b, 0x05, 0x65, 0x9e, 0x51, 0x8c, 0xac, 0xcf, 0x48, 0x1f, + 0x5d, 0x42, 0x29, 0x69, 0x6e, 0xe8, 0x6b, 0x4d, 0xfa, 0xfa, 0xfc, 0xe1, 0xee, 0xce, 0x3a, 0x4b, + 0x86, 0x13, 0x7a, 0xbb, 0x82, 0xf2, 0xd0, 0xb3, 0x98, 0xe7, 0xc4, 0xee, 0x0a, 0xd2, 0xdd, 0x9b, + 0x25, 0xee, 0xae, 0x63, 0xe8, 0xac, 0xbf, 0x52, 0xe2, 0xe1, 0x8c, 0xf4, 0xb5, 0x5f, 0xf2, 0xb0, + 0xbb, 0xa0, 0x11, 0xe8, 0x1d, 0x94, 0x1c, 0xc2, 0xed, 0x80, 0xfa, 0xa1, 0x8d, 0x1c, 0x55, 0xe9, + 0xe4, 0xa5, 0x1e, 0xb1, 0x55, 0x4f, 0x63, 0x48, 0xb6, 0xea, 0x67, 0x29, 0xd4, 0xc8, 0xda, 0xa1, + 0x0a, 0x80, 0xcd, 0x06, 0x03, 0xca, 0x79, 0xe8, 0x25, 0x9a, 0x64, 0x46, 0x82, 0x10, 0x14, 0xb0, + 0xe3, 0x04, 0xea, 0x9a, 0xd4, 0xc8, 0xdf, 0x73, 0x24, 0x29, 0xcc, 0x91, 0xe4, 0x5b, 0x58, 0xf3, + 0x99, 0xaf, 0xae, 0xcb, 0x84, 0x96, 0xf5, 0xb1, 0x19, 0x30, 0xd6, 0xb9, 0xea, 0x34, 0x19, 0xe7, + 0x44, 0x06, 0xaa, 0xb5, 0xeb, 0x46, 0x68, 0x87, 0x5e, 0x40, 0xc9, 0x8e, 0x17, 0xc0, 0xa4, 0x8e, + 0xba, 0x99, 0x64, 0x14, 0xef, 0x84, 0xa3, 0xfd, 0x53, 0x80, 0xdd, 0x05, 0x23, 0x0d, 0x0d, 0xc3, + 0x00, 0x24, 0x30, 0x65, 0xc2, 0xa5, 0xc8, 0x30, 0x12, 0x9d, 0xde, 0x4f, 0x7b, 0x9e, 0xdb, 0x2f, + 0x61, 0x3b, 0x66, 0xb4, 0xef, 0x9a, 0x7d, 0xca, 0x85, 0x64, 0x55, 0xd1, 0x28, 0x75, 0x42, 0x36, + 0x37, 0xdd, 0x4b, 0xca, 0x05, 0xfa, 0x04, 0xca, 0x5c, 0xe0, 0x40, 0x98, 0x3d, 0x42, 0xbb, 0x3d, + 0x21, 0xbb, 0x52, 0x30, 0x4a, 0x52, 0xd6, 0x90, 0x22, 0xf4, 0x31, 0x00, 0xf1, 0x9c, 0x04, 0x50, + 0x90, 0x80, 0x22, 0xf1, 0x9c, 0x58, 0xfd, 0x1c, 0x8a, 0x82, 0x09, 0xdc, 0x37, 0x39, 0x16, 0xb2, + 0x47, 0x05, 0x63, 0x53, 0x0a, 0x5a, 0x58, 0xda, 0xc6, 0x3d, 0x32, 0xc5, 0x58, 0xdd, 0x38, 0x54, + 0x8e, 0xca, 0x46, 0x31, 0x96, 0xb4, 0xc7, 0xb2, 0xc2, 0x90, 0x69, 0xb1, 0xfe, 0x91, 0xd4, 0x43, + 0x22, 0x6a, 0x8f, 0xd1, 0xd7, 0xf0, 0xd4, 0x89, 0x1a, 0xc2, 0x02, 0x73, 0x0a, 0xe5, 0xb4, 0x2b, + 0xdb, 0x58, 0x36, 0xf6, 0xa6, 0xda, 0x56, 0xac, 0x6c, 0xd1, 0x2e, 0xba, 0x86, 0xad, 0x70, 0x71, + 0x3d, 0xec, 0x89, 0x10, 0xcb, 0xd5, 0xa2, 0xe4, 0xec, 0x97, 0x4b, 0x46, 0x57, 0x8f, 0xb1, 0xa7, + 0x0e, 0xf6, 0x43, 0x4f, 0xb4, 0xeb, 0x61, 0x31, 0x0c, 0x08, 0x37, 0xca, 0x89, 0x9b, 0x16, 0xed, + 0x72, 0xf4, 0x06, 0x50, 0x52, 0x0c, 0x1b, 0x0a, 0x7f, 0x28, 0x4c, 0xea, 0x8c, 0x55, 0x38, 0x54, + 0x8e, 0xb6, 0x8c, 0x9d, 0x58, 0x73, 0x25, 0x15, 0x17, 0xce, 0x18, 0x7d, 0x0a, 0xdb, 0x11, 0xeb, + 0x65, 0x71, 0x74, 0x40, 0xd4, 0x2d, 0x89, 0xdc, 0x9a, 0x4a, 0xdb, 0x74, 0x40, 0xd0, 0x4f, 0xf0, + 0x64, 0xe8, 0x39, 0xd3, 0xa1, 0x9b, 0xd4, 0xeb, 0x30, 0x75, 0x5b, 0x52, 0x6d, 0xd9, 0xfa, 0xd7, + 0xda, 0xf5, 0xeb, 0x8c, 0xc9, 0x85, 0xd7, 0x61, 0xc6, 0xce, 0x70, 0x4e, 0x12, 0xc6, 0xf7, 0x71, + 0x80, 0x07, 0xdc, 0x1c, 0x91, 0x40, 0xee, 0xc2, 0xe3, 0x28, 0x7e, 0x24, 0xfd, 0x31, 0x12, 0x6a, + 0xbf, 0xad, 0xc9, 0x27, 0x6d, 0xde, 0x61, 0x48, 0x8c, 0x4c, 0xfa, 0x11, 0xbb, 0xca, 0xc9, 0x22, + 0x47, 0xc3, 0x79, 0x0b, 0x07, 0xe9, 0x70, 0x52, 0x70, 0x38, 0x9d, 0xbc, 0x44, 0xef, 0x4f, 0xd5, + 0xd7, 0x89, 0x36, 0x1c, 0x8f, 0x0d, 0xcf, 0xa7, 0xe3, 0x99, 0x31, 0x8b, 0x58, 0x1a, 0xbd, 0x57, + 0xaf, 0x96, 0xbd, 0x57, 0xc9, 0x74, 0x64, 0xd9, 0x6a, 0xe2, 0x28, 0x1b, 0x40, 0x12, 0x7b, 0x8e, + 0x5a, 0x85, 0x15, 0xa8, 0xb5, 0xfe, 0x00, 0xb5, 0x3a, 0xf0, 0x34, 0xa5, 0x56, 0xc6, 0x88, 0xab, + 0x1b, 0xff, 0x93, 0x63, 0x7b, 0x53, 0x8e, 0xa5, 0x61, 0xb8, 0x36, 0x80, 0xbd, 0x45, 0x2f, 0x33, + 0x7a, 0x0d, 0x8f, 0xd3, 0x85, 0x32, 0x7b, 0x98, 0xf7, 0xe2, 0xbd, 0xdf, 0x9a, 0x6e, 0x55, 0x03, + 0xf3, 0xde, 0xaa, 0x87, 0x8d, 0xc2, 0xfe, 0xc2, 0x97, 0xfb, 0x3f, 0xc7, 0x3b, 0x82, 0x9d, 0x2c, + 0x5d, 0x32, 0x24, 0xd8, 0xce, 0x50, 0xa6, 0x45, 0xbb, 0xda, 0x9f, 0x79, 0x38, 0x48, 0x6f, 0x68, + 0xf2, 0x69, 0xf0, 0x6e, 0x44, 0x3c, 0x81, 0xea, 0x99, 0x3b, 0xaa, 0xac, 0x76, 0x47, 0x1b, 0xb9, + 0xe4, 0x92, 0x7e, 0x37, 0x77, 0x49, 0x95, 0xd5, 0x2e, 0x69, 0x23, 0x97, 0xbd, 0xa5, 0xef, 0xe7, + 0x6f, 0xa9, 0xb2, 0xe2, 0x2d, 0x6d, 0xe4, 0x66, 0xae, 0xe9, 0x0f, 0xf7, 0xae, 0xa9, 0xb2, 0xea, + 0x35, 0x6d, 0xe4, 0x66, 0xee, 0x69, 0xed, 0x11, 0xac, 0x93, 0xb0, 0x7b, 0xb5, 0xcb, 0x3f, 0x6e, + 0x2b, 0xca, 0x87, 0xdb, 0x8a, 0xf2, 0xf7, 0x6d, 0x45, 0xf9, 0xf5, 0xae, 0x92, 0xfb, 0x70, 0x57, + 0xc9, 0xfd, 0x75, 0x57, 0xc9, 0xfd, 0x7c, 0xd2, 0xa5, 0xa2, 0x37, 0xb4, 0x74, 0x9b, 0x0d, 0xaa, + 0x71, 0x24, 0xbb, 0x87, 0xa9, 0x97, 0xfc, 0xa9, 0x8e, 0xb3, 0x5f, 0x71, 0x62, 0xe2, 0x13, 0x6e, + 0x6d, 0xc8, 0xcf, 0xb7, 0xaf, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x8d, 0x19, 0x06, 0x0d, 0x8e, + 0x0a, 0x00, 0x00, } func (m *ConsumerIBCPacket) Marshal() (dAtA []byte, err error) { @@ -1149,6 +1159,13 @@ func (m *ActiveBTCDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x68 } + if len(m.StakerAddr) > 0 { + i -= len(m.StakerAddr) + copy(dAtA[i:], m.StakerAddr) + i = encodeVarintPacket(dAtA, i, uint64(len(m.StakerAddr))) + i-- + dAtA[i] = 0x5a + } if m.StakingOutputIdx != 0 { i = encodeVarintPacket(dAtA, i, uint64(m.StakingOutputIdx)) i-- @@ -1647,6 +1664,10 @@ func (m *ActiveBTCDelegation) Size() (n int) { if m.StakingOutputIdx != 0 { n += 1 + sovPacket(uint64(m.StakingOutputIdx)) } + l = len(m.StakerAddr) + if l > 0 { + n += 1 + l + sovPacket(uint64(l)) + } if m.UnbondingTime != 0 { n += 1 + sovPacket(uint64(m.UnbondingTime)) } @@ -2737,6 +2758,38 @@ func (m *ActiveBTCDelegation) Unmarshal(dAtA []byte) error { break } } + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StakerAddr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPacket + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPacket + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPacket + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StakerAddr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 13: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field UnbondingTime", wireType) From a6a6fc78efbe3694250d146b5e7db3f9625ec712 Mon Sep 17 00:00:00 2001 From: Mauro Lacy Date: Thu, 11 Jul 2024 08:05:06 +0200 Subject: [PATCH 36/85] Update contracts from rebase branch --- test/e2e/bytecode/babylon_contract.wasm | Bin 751073 -> 754477 bytes test/e2e/bytecode/btc_staking.wasm | Bin 631362 -> 633789 bytes test/e2e/bytecode/version.txt | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/bytecode/babylon_contract.wasm b/test/e2e/bytecode/babylon_contract.wasm index e010147446c63220262f684071d39cf1256b70a6..f8cc7d3df11e7e688cb0342f3a525e860a260fb4 100644 GIT binary patch delta 213448 zcmce9349bq_J6UcU>nat|*{r zD}@{y6ahID1Ox;zASjW;sHmtQpeP`yps47&>;L#;}Hh9dfe;KZj^#`Sq zW~Hg^@q4M-AfRzB*RbJ3?z~0Ot#N8fWWVb(SE85Ps+OpE6FsV;_&o_8{3ax*s!JtZ z)xD~!>u&t0imqlVs_scrRQx5lkX!y`DK7jWy9*U?5`GkwRK*ii6_=l~5wE&Xp~h7q zCH5zF-0G_z(f{-xDfov!ROI4@@TVwlm*U2wZZZOiiWm4&HO;Ge<)4N>70vUXY?eV# z)s&RfRB~b>PO66}!Gj-F^|@Rg{53>F+?Xs!qN@Fl0(Vf`?p*jFAYT2&2qJI@RUk^;9*D>M7*bRqh$L z754`a(IPOOfEMtd+vP&V+*%xFxf{Aph(U86JQ!r4UIzlXF(c#&xOJCD@g+ulJ_gC9 z)bZ7+BYP8V42ZJvj9w|ED?tvq01|hH(TD$l9gQ18bAS>J)z?T3aBB$^1zR=`K=4QI zFz|psiB`_1MNkY_(RgGv)a+(rQxeIe+c9pt0vg zYhG7f-FlJzd>KT6b@S%6&b+a10b;!_xLq`rC zGiLbcfwzwxK1SK1ro_h$y&XwICn#@Phg_-VRyCOu#||DkYWM`q@1etQ#T?$I)`^Qn zn(|hSd=qZHZTRhXPEg)f8(9O~+1{aG3~2o|>n3+oZG)C?t#@Zz&$&}+qqWxEHnK@e zxpmBh;p0aP9y)yB#Np%bxb^li1B;Ydx_9vC(YFufqEG9I!-mH~v-RNk;p6VSb^P!< z2Hr7Y@TgnI+=AS7cFHVkoF|?5H%;px zL#eKI1M}ruTBI$CB@P@oZ19A^1BZ_prjc*pz>&iTj~zH<@EyZ7HDNv`iAlbX)Ra$M z<3=uWeWE{0vuP&Hqi5(TdYZ~+|)w`aJyweW4y%q%YQA)R*W>^=0~U{T0e0S$&YU(+YL5xP7EcHY6Bd7j7AZ)JxYk+rDJ)#~{%e7~;XSMm-bK0xgN?N8pfhw11 zOSO~w$d$BS+oWyO<`G^amD)SnPHn4JPP?>S+FRP&+HUP#ZHKlE#opFNmeW4hM=nO+ zUhPxupteujuYIl^K;rw_A?*w8OYN}swRS{1sy$7|wI8%^wUP7ag!aBZRXwep(q__+ z+E1E|$)8c^U-+Lv`5ti(>L;~T5t^(Qy`ulBeXDkrvZs0*XkqJxJG`&ecG#ktbeHQ(ng-pPa(_aIyd^I zen3B@AJo6stALp^`UgPmKK(Of{7L^=|3d#!?{gZNKSgc7>A&Oc2@KG`^nd6xU4Q6h zu9ftF>wcHOC_LkO)-?;^r(NZ)NA>lt4X&lG4-x(pWj4BAcfI9GocDF}&s?iDYgxU9 z!Z<{3YgtaRH7Bt>9Tj!IpbKfPmE`MBRn}--q}C zObxa~LZZ(sw>Ag*Q@Pc!PA~e^8d;~)HD76p&(O^(r8HMDG+$%IKs~J##Z)JR6?0?R zW~DSwRSd;k;JgMaUB13V5%bq4-sFr8%yd%^Zdb!}v0iNIW_oar^;4azX`R(8sV|*c zH79AWnz3#Jpr{jUS)l5uiV9T4Pd>b@v!*3Cps%b&$(Pbm>xX2WyULls<$p_yud>cwLUGIP3Cq86$_L{wPIQ=7Cw zY;e8{UDV9HQuC}bE55B&My=P%h1lSHt3$mTfTBn1?XDiDd1)_K2d38_<^&Swx+LmV zzeoJ@3(ByrNxulAH!D2{zw6}hUio`Q{-$See3AU^Cx7qGxE8(Nox#1Y)8GcmwnjGS zfZury`r`Nd2KDK<<;lDzxXNWJA@n&eR3coe;NmQrp#cx}o{KOc6kDOFYi(ur@X9 z&@`6jL7D+f=OGOk{eA%kHo<)VeLP&jDk~$WX)7mg2giAWRhpsasd=D3)n~3)gt(Ad z^;(4zT!>)-;J4+(A$5Q;JW{3kHJ<^L7O3fl%SgH!l+q(K9_f+JW_!|Ur0su#iKy?s_#*a1*`iSDW>&s`wo<4_0289uhFO@MxY|M z9vv6sJ_U_uTjgs))(vl@xb;%Q6@14k?~tawsry9led=|hYcuaS+H09tG@v=6vY9tb zv&D&K-bw0S61O+^W+3+A=H9S6+hqkhny9~bM{Z^1PtEh)SLnsStP2>+W`ub|E?_zj z6zwVvlljQ>3MEfb3KYywQ!6#6TVHf+259^R&1siaSa2n(`Fnv=nRTqd*Z5qu-2Z4? zEqbZ>cPpdNt|e>@FHFjLM`zTk&9q?1!w+wWr`A@bH0(C?;4aH5?9}53>M*^AH<-hO z*xj5|R#tZRB>^(rfXqg*;i-|>13lBs{8G-})zDfg#lbCBa?zH+LtIq?rgVB~(69~_ zHKZ+1bed`{33o+r{>=b{eIAq1511--#(a@=x=}-GYNrcPZbv7^g5J4f{cIj)ZwM5N zr*3#k4b{+s$E`k{c^vQP+>zd~UhLeO_E>v6H*5W=i~EqLW`*#ut4GKPs~njdd{Z~* z;s8hmy`*5J)uzi$87Gzl{zBw_S1C0Yyo5m6%OLDmT~@GlF?XRggOb^VX{c`#(2zB# z88?0Nvapre#^-)hSBnj=RnaKZx};5^m7Lp+3!R_v!U-NTw-mjes#|4mq^1BS4`2(c zKrjJ~4A*6i`&rbED=Kcst=HYwJm1B%g=q-l&*nk!hIBAQ#);0fH94NPKowK0585$R z{IgvPS1urQNeFwkFU;ERiq4XQ%BZl$D~4Ib#G!&XhPCLD{M8H~!DUdMn#w=v!H~7G z1&`);E!yJOXxR~TsX7qgDIsvhL*N4H0l{BdG6V}+UWU;**|G_JYt?VnFpmd8P7^r> zAXRk2Ko2AhGMQm~Oa;_6pw-}XXLL04K+VyyK5Es~y06WD!nO5K{%e65tF|z|I=yBK z_?2~K+Yr5AjcuESk(}Okf;Bf!R&xGP_Ikl14R>&-wY*s`^#5N?n(7GVTH)p;GMM8t zyk-Z?3>o`a^Y&oaZ#I9>dcN_0t~txDd36)J=DcQ8byUXf8Qwg#C`|n5%7lw&hZ;oE zyJ>g3`L<5;pr{&UWtr--E{SxPB(TFx+X2Y>c@J7Ibjcyr+ScU-dd(WuwFOmLqHDIg zOjxgWjUZ5P!PQBX7$Y9B1ZURFx?mPnSZ%xAMeD5>yJg~iTelm0>v>r>N(~BDSj{f% zg4p2~_OWAw9J|@7xG)bTj$PQ1Hd{Hx?HjDuu@ZuhgM^9=H;=puP7WkyS)+@aqXJPp zfHqh^6;EnXsro_fN(s}*LH>ypLi*5RYf(9tDU9u0voT=aVs>{s5&n|a*-;Tk&Mk;I zu8RY5>A_?JAGvK|D^Ta0g-syqEGucOPS>qt3oo-8UeqYU{dR<^BwuhguXJ2y4!<~b zshh!?OhfUdDj;A?8~Fp?AFQh?zAMiqYpF3=i)9<|qykJhm6yz*p_Y_c6&DqwH`Kje zeTGEAObqid;3dl*2{B_9)ob7+=0kP^YeQ-WJ5}|G-Ir6b^|y;Ji!EmdRuPsn%hO{! zYOdl8bCXBE=eUNgK!=GcS1=az~GzeL*3!dR`w*)OzJ3u|uz0X`l5>uWOSI zJPa<8VV>a!)?-V(G(Q^mFOKsg&b;&vYGL$T zJQBv6mwgS8ms~#c?7l>OZwEMAPv}qjCR%ZmqGy1OadbfC_WygRCO!G=Ba-)WEtcX&*Zz) ztQnW<;;|Q~Lpwt;tEe>i0-7?nE2Y6Uz6S{uf>3^GuobtjM8O8Llr#3Jqf%rZP|=@0Okt2xBU-({-}A_**l9n|c_MNuPa zG5?d30xL1*h8_-F!r0|C#0x9}2O$s8xL7LfPljO)uaR!lUrT!XX_oaZu9k>nr6Zz&LK@JQx}Qhuw; zrTC2t97VM*L~KVm_X=o!_uZSJexr%^64gv=^}Xq|-`aJr zq5l4e_5HnF`uKu#UA2@d{o+8trgtoD&9rrD2S@rOis5GgY-cqv?;bw|bs3>S_b1V?m?A#25TdHk_ zFIWU26>M2wUIJ!XwnCj;s40f4r0St92o!2w$YpNU#9XG@*-E{yVI;f6m@>IULG~FN zUi)bI$v}w`JPi5VEaz@?gpI~PmcQ4|B8MKmo<$|fRmi`XN}Fj)IEyhcgYFGy8(G(k z2PfokIfV>lnIbW>4m0E%jVIp}3R^4hs|QTKeP77Nbmz!95gj0Z67-R%QX9b3v5}|8 zB7q!Nsrl2CIAooS1>%rZCmsdBse`&G+9Hg%DvHBf6#;LoxJ%CVUyt+_@cpA0bVDyt z5A)!wot1+GfX>;4;4P(Qd2Ec)BnV(ue0WAI5Z9*|0jTCdV7Dd_lxcCDDbpMxupTaJ znw`ai9|}3+jL_dFhr%U^p_~#5Wm&t*>PLW`ahahk0Fu;OFD^N(gmV0DW{_u;QX>m= zb6ANIOqnEr62_=HF6_$;HRPec+sHETo>ekqH_D=(#LEIqUPrmS(U7B~6`WLo{0lhj(09cYx@JD)62KDxdtXg`Xd)i(Y^+ zU@V+5DSO1)IVnS(@rZR~Qcm4kQ{Ae6e|7}(27`}2!8jPsF4U&5hKh-W@#SfS;kBm~ zXv)Pi-H+r{2z+c$fpzB~h%va9IW3tfwy;5FAo>Es43Yp5SSI7e$cgp{#vfoM)G)%> z>>0}9OzEXY2#5y$?YRoMvLV9ZXt=19-=pcsdKIT%HIAz=@G_oX^6eLhX0dsj&hdHo z-WzVnlNTx%{~@aA-mnq5E)0cWxsh!&M20LQ`x?NR-8VC!8d;%ihRVx)uX=WSk>WB8 zNpEJLGoyuB6EMdT9|E2%rt7WM*4aY|57$jCr7f@L6Mp6(z<(AofHjCB-5^vaoVg zJlt&y8`QWPQaD@}n}-NvlCFpkFOCIblhhhBIkSE>wZxb(>T_G=lhYzn{FD|t^js~r z|FJ@TR1K?UfW_!~ObAdCn`tLiU_djU#6svXyUG=i*SCE6#(F3gw*Z;U%kB=TY&XE- zt3s9G71mytpw?)4$_ceV*$PR=h#+tbfz2F{Efi|o`5mKFfoGojyBbR5XPL&LQJy+k z3;8+c6pdlxMLF1tTk=57;kA_k>LB0zDzD)!`8_O!V+tkmO0Jqp&w$&;bOgpqL`eK6 zUL1g3AQ999N#50ff!_<@(J$FQ%`8((L5!L?SK~TuQ{zcuT~{+ts5=Y>OM7; zi*!u68pVKo851jq)N;i5Vz|T7Z`6;4Rv?rf3xOXP8L?0WLJeY}?FeN$z(pk0aj!7V z<@*%8&yu5sY*4tIaV|p$Mjt!Gm^g#=d5Tl!DBkY|517P+&!T8zsE(nAk_>++Xk>>P zaaTPis(@HpGbz%@2pDOXu&{6A1w5*zZisGUg@WcTQ51!M7cvOH5=pU+<(GyrRTxXL zC`hxIEsm6AlU(trFbl`P7ji}HII#aPoArRUSW&D1VV0hOyjUF8J~;z`!YCw+3zk&| z+31^v*F2Om>}fHhIwR;J96$=tP+hhTCNfH-+lBA8avn~Ppu#~6mSQwwDpQOgQ<-8U zF_kGs9i}qO9V{8#l*07J3Np_}SRt_*IN&O5UrdYzusZo;0T>26u>dcA-dN~HbljOA zTp=&_Q8G}BTpnn}JdDUFHAqm>3)TLJ$4D80C@c)3w@@2txO@fb1oZr%wfN!Qq+4em zZdqSfY|TZp4Tzf5USO-Esj0}(=aK)EWAP&)*5+mI199(ZQ(;`O3a3`5j){AJA?|(O z)X@1X0ZzTmrv0ZJ6Q^-&Vw%wu{ehmTgVDljfEANNUe;BUVC|_6T4RQFgn?+muGKu#^m(%p2Z^x~%$c_%?zKVf8I9LH!>(vJ0#K zgxxLG*3Mw=xEwgf-o%=booVi>lOvOfibVf8lm|p*-I(r^mJPWwR$9GF(-Awe^m)3# z@{f9zx~+P1R1Tq)FGmk2-lrN9p>?Y&#~`rEYBRPOt+j3#8>Tg@?j5_3V1;ZnzB3zb z$Nx?KhOK{%A0giwS`XaOCia$Q9l0X|A)3%G_@M?CFh#B>pts-(>!Jy4_Z=}|a3+$} z66h{!A6Cm8&H3~vtPxvZOt=pk_~1M9)fu{F-FZcwm^R{vEnvI#-JRKuzuSyGF~&jy zn}GJ%TVzUzuuX;(FUuMSzqRrwX2N88`NU>4$C@~CQPdXdF|oMBTdJ*&cZJaD>+cGw zkLlK5?wag-oEJSzEIqh-Rl?mZN!|0aRd~;h4a$Grf?1bt5bv+$VwfRb1Yux!LbaCO z)3ojq`0ZfuSx00G)4pG=FYoCiMQo!GVxPW<-O_^7^gN|RZOP!`&DbG#CqlGpXefM@ij%D z&_max%Hb!Iu~zxYwe@x6PQT&P8WhqjjzUz>trG0Qzf9IJhS?;|K!PL(+?cLas!1X^ zhw6cl9=$QM+1~vXY-wRO1OXj^W-1o>o(Sv#S8z!Y8wU5_?biD@-T`xDkDCf$zx>-x z1?o35tTi{?t(LuLwdp_91G08Ovb3J=-;(W}F1CWIuy?_14n`c$cg5cRXtgge_TL-2!po^{FrnO3q zk{+mQyD}OQ4^N{m)5Dk+H&1^!+pcgJDgms6m=p(rj2$p6{n0AwVSV^$%hYNZrHMyE zY}I?LRWerqvs1i%{F=u$XWO*p=e187|9IWPJD^}JwVS~R9Wdi-HMT8i4Sc*2jH?ek ze$s8XW!>|{654L%TA$RH`0%n=p_p1{MVIDmpfvT#{Ps>7Mbr3+DX4&yc^+58&EkVo z^IcEo0XyYSJ_n9;(NoRnn04DzqdP$eW_Ii_q*=R}A<04EJ`f1YV~?>4n^qmU+s1IPD@owQe& zX)f%WTEk{BDyGc(8~X2lx*JuB@8?rJ>&B;3u*9(R@5Y31n)ut(m-dQPt^vC+*}z%_ ze1LX%v(Lqwynr4%=RM=iV7!-syq=2#&=Wm?+69AtaCQS~Yqgj?TWU&C(aa_F=8Y<; zaXt?e!rq-)Z1SRodh8~!b2a&+3Z;#rbWxZwlp&C3Z`!g&SUU>_2VU6c*rr_#FXdU? z=cH0waa%8HW%Zk#VLdx%m;@pUl7^5qcykuLZQZxI5L-E~Zf@;8`h10As=+s{6Pp_$ zD!8Quc80rdxdHDpw{*g9)fV1}bidgRzZbvRoOW7c-~1cmzr*`3D`RWVLW_6vS)~p@ zqGRC=f)ciJq4(xh@ACp%=2M)}16DHyj45o*+REEiA8+MW>TcsbJ}7TBb{Re98_&fs z<1w)cZMH^j<2}Boww0z{#$_X%gLMsL~9^Jl*wpk^WjFURQ#{s(Yu?UPNbb8U&-*Yps{=ceb~Qs(=y+qRYFCG#=$?S!6sJ!-I@9}-S4(0y_=QH z8XRv`l389|e{bu|?#v)>AlpUl`mN7CZ(&`y$7SiCx3bFKy&2dz@NO<;iFb!5G_g+Z z30s#}@%|_G!Qwu6(1$mwTFE{%vV!lWduK2)Gph67D@{IJjsW}w06PEpv8z1)^Jdn& z`~1xRVVh}W%|6o1s@k9EoyFx6Wx3wg?;mBJyKIpz3+?~Bz4y8J0_aTgGL8t;YHY&? zf#mhEBy6_XyW0%Mh7bH!(jGT8vJQS++877}k7COQ{AXZW$qyn145>y;O?(V4CKuD>7Oa6x zlh!4lzEG2@8d_I>7Hxl1wEcL>(yf1f*4TTLCq$IGPR3@(<&4%oG3p9fmw%qm~hpUhPv}6GCYw*J!fdp&Z{!DA^SKdT2KjEx?r?2}Cp9`q5U&RAe>;Q$>*MUk^xoX&;zgBwO&lLPzyYff28gAmPf^Sf z`q+)k{CvLnRE1q4+iLZFu2pfun*mWGPaOt}yEGx%0*?;2rES)s6Cv*;#u`uYfycA0 zcRotA)_&W}y7AkrICz49=Yele0Ftrav5(h#b32{`6qorZs&YVavD4t=&si<;eGd5enO-7sIiVadY9aiAq9u0qP# z9EXOSxVJeD`7HBHzb7heb{(oO6DeAW^eSYJN9*0HY(RsB*P317_q>TAjKxMpF}L+g z#c1pK)$BRBc|9YdN3n=^Esd??F#(g)yJDnzuk9|&fI96^9gon0)X9T+^P^SXvE2n3qXGS+5U_pFOx)PG&~_F4V$+D?!xqq7ra?XFd# zYtCFj1EuCJ>zdcj*R|V{KjLwaGK>6yM9qD*KHQK3dH#I8>XPmhBQt3C0G=i22^ZdI zpy0W?GR11Vu*IKtMSH8-6>aQIY=`*o-Ov`-RXw&Z^vRf)=T2+}xPx!AQ2{0@H{`d@ za|Zy&v*t3*oSOl;&3Ar{A=S+cXxFbX1{AU;&TH8H`xk&mk24o!)w=m}EROj*H>aEb zW429>fwJo2TgM5zF%&6LZ_=I;Go;OJ%;}u_5Nk05Sdk z=O)sYRlh#xBj}y31v!EDov$0`qFO1sf~Fmbm{_y!Z+TwK0l#SaVkhX%gJ0Z(nhKV%mb_+3PMtFh?PP2} z*x-J#WEYZGEM+uhHVIq4Whp>F&NAl2H!ov$HD%eoNOLV`GfCU!y`#ntXv3vpt=jkj zJ~S)}6T!SnQR4^BoJixx+U4xve0n)r5=oD_o9CS0%Yc3tBo)EjRI z@!E!vhhE~rS^3hfbeWa;aud{6@^Z6k+s7R*GtRz!C9}S?edxR+h21qWXTOLp2O%m{ zzHCxs%eNv6zj-Tiu;TSxk$=nO{yIGUi$?(%%{GVxYDQdX`y9y}E|^2$g&3c|51Ult zBl@yMMYfODW7d!ZD@La~nw(~4Nkb=3QJb?3UD-Km9?_(EWYv6#rAVh-}DSn_NK zd1s>v#yaUC|I`3#PzTJ+_JsjKFQhc8Onz z_=v^W@AAYLm4bMU3W1a@)~Iv^1`zUH0&lL$vl1d-BeUNtkD@AAPFXx&4ufQ#+OwLL z*u4GT8DywqQwRGr+Nww_6Am9B(*e#TNeDYGY?=v)N{w3gbca5xs6Lp+k zk98BI8gZ|icru~a;((i)(jHOwbv;8E9;(}FhK?;1^tLF(q}Ni)NN`5yUFL0iP#9vT$gsnX2vYkKXAlODPtZ;@AZ*-KM7{AN`gKv2!!fpU$PCOAFf zm8G#=*5)%eLH@}8HMd)cxk{fX*5M-ufac#16kyW=2VHFQW-J|>Hb`H@>A)dQr9^(s zHEUJ@n*_3K;w<&JiuALp!0;pe15U>zwY9Fpzvcp*gx^Ap>I7@>zj9Vx@!J4qv`haH z3cMkZw;kXw9u>TP)hGYZ$R^JC?qpi7f3}FcP=%cSa{*4W)s>ts*RHdnvOE4Zrzbm5 z)j*8h@lQBCi922+(dNZRt2)}LY}o?&u-+VxTN^RIa20hqy@-FhLb`GK?UDV?`&V|f z-!s{;*~00!^~pbuiB?|Bqzds@FOB!hQvoO0oExkVzj|r29dp!)c`HF?O--aCJAwCG zwcs0~Un2F)=95kkl#jSz^v6j7HtTBU4-X*H7d#?fN0!VQSy&d2%V78j+h?M$k0xht z(p8WuTuD{)Dfanbg-tapWNSmj4?Y^4qTZ= zYC@YuNnNnM_2Tim6hbXmBvX6wbzL%OnD8W1e%eq&3ncl2-0?lpjt6DFt7*8HpG;k7 zgxH@ZO^ z+&YyycpZ$75XB)%6J@EC8_hQ~7UdC@sW|YzNgPV0X6U)E9*uF3@6gbL^{59DcGjZ~ z)u?6~@~6?IUfa|Pa=AH;8st=}hEMvGVgE}r{3doPB1WPa%Ouj!$R@El4NVRgpQKSc zg#7iXn1+Ze>QiU5Go?OGhi??V^k{Q(p8@^6ES;`G`ZL(3tqI2$>C~l5vMlo5$iIkF>3lelL}Jgw3l<)+|DORwczWbX%;B4LR^_eBW?V^)kw~sEm?H8 zgE1$jM>buKtXB5fsQfq^3;Yq0)sPz2J0fufngy;1t|vCGdN-s38Y=$YklOr7>?8_3 z2Rsgwd~+tHdDvk&frm4P2HQ}bM2s7AY+Vi($o1l24z&tq|&y z%N`11L@pWhns^A2@~nxE#h*lM%rZr6#Y&`Zd|DjIrClxU9ewyS=3>h@dOCN8JQ0P> z+~{tw9U%@j#w4x~|7?uA4>pVPCe)7ki1Zf087;BD2_UKv=x9ef9!^+vfzODaP6lfq;E!WyyJKy`@|g`_jsY!ObDeREXZ|y!m!K7$5`q z2qJ*B4ePvvF=eyYYu<~a z8PA7DWNawrwxY)B&NoEocGO0FKozH3Q3&m&wWcBlj)hMN+zqX1KOGi@ZD^^wbGJC$ zhRkeujR1pu1O>}dOL^J|FZm7`m*h(}IU%3MqrxNkWZD%7ed$i5@V8_&v zns%s>Meewn(G0EtoFKr4Ow||i8hrQ)9h0=*za!mJJ+-09Rj=oJW&1r_5e zbT5GAc9XcR04NwP$_uEI*J)*_I8;DwkXE;laE?*5Dx{$e&ZdxRY=|X=5U4A}JB4(U zjR{`vy}(V|BFyv(ac2=-pL-r`>NYk(5iB3TK5N+{3i@>+;?Yi0VECjHb*tuuEHE_c z3|xLS1Gtou5aUvs+M}Djz~!XQz-5grjLYf_@wg1c`?-jHo$29!gG(0{5#X|!SlWe( zGMpBirN7LU6QDhB62EsLmJ|APrNS&{siCkhy3}BEjSWED%jdhscaIn8Z@XeX?-$K4 zpl<5P-J8y zMHGsX=m^pMBD&tLr=D1O5vAaL+eLJ-bBt94yHgmAw(m{@kz#e1s|F0Nym)-poi3^$ zKXuVjn`DC%YXqGK;GI_Y;aF~#A3>}rFRkkH5+@pCUSvKGo+D1Qk4&1`t{fU?D&NcC%F`i=CI#^cu%uL9(;1z|BT6FEw$|mBd$CjJOhu{6g{QmDI376vbvLcN6DG z*ez9uyTTmt)|GTsb(cNdWtbg-ix$1X&g9_)=_4!cYJ{Kxx^o67|S}gBN9U9&$w_o_!Lsz&X zz`2f(zNHkX-SGgi{?V7l!kbf!yNderMKCUycj3_~KE4V}xl)9$hU``)`d&>L?inv* z7&eQsc!#y)k*lc*+E{rt)lY))f)Asjei$W!H;9j~mJBIy4P^(Gv2g%rPhmv~Uca{R z8c-pSlREyp-rBT)W_BS|QAS zw1(FV-1CCvh-1_nz`!7C-$3o`1lGV=N}6^94UMotA2R_9v&&}DA*k0-uA>2TpRMey zWV-_3xV*9Jf;TXt((EX?3mG3fb(>fQ9SimFNiGDSF;S{WBbx zhx+Sr@&eRkCvOt3-$YZf$iFlIOmI+tasf3X`r8V$F0VAffbQ;ZE6_SC(Dm)2ECGoY z1Beyqs|J9aWgXclzHEgfjefxk(-xDKqKPNnS&(SKLgOv09E=`_!m) z>CLj%_iv_a3mqH{^(WWpSD0XUfYk!i;$)nZqqA&=!JH^=9!U4)@Gb#RI27t6`BQ3D zApS8>iY%Ffs3mJE5kAN=@Ihy0gTvOW zThzhU9`qZvI075PNHjq@g6;wRN7{_YB1)bCn`}n6wi08U`tPqnJ8O8f4xbMq#A=FbqbQ z*TfCOqmc~~aJU78%Q{%aa4J+$`LDz2Hn*c)jUIs|vQm6If{N5>Z-}P1Ku}pM`rksm zSms`I3mFZ0Ol@0KFkW=EH6>lp4z;mJ90`W=py)J`L;!=v;uB1w6ns$ZABm-SlQ=Vy zX1mu(9Y)N$l`d%FtO9lv*1Ao&WYM;<8jgt-#Vf==Zl%7-vPSG2k+~wOo8MeY-Q(g{ zal8(leRU~~6Hi?WYsf;e{90<8D;cSyj71S1ECf5%ZFZ_NJ5{f<+3AGqY<9{A9~tAH zUPl*+#-n6y7mT8Gw)eX2^Ey21!83=C0%xog^F~p_Iu6fto7lDl)2tjtotSBAx4{^) zNVK|*npQ7A8ZSR`jb3}pZB#^9cFV_5Y8Pg%?6u2BrJVJK_xppksvKKl9qi3r~yju zkEPa0ynsjDfmuiEJ(lk6^u!V%zm0ifsRNA0st<^BRG3;R3IvX%apvC7aitqVos}z) z2-ks$h!XlZ>eb^7L*>TjtE#u~kPsULb_g1tW zTp(QIsqxTNE*4HM4?q-zRrV>= z`k8yUOMHI=&SsfMIdFy>dR0sx4|1*$&EN2Lvk5)jCiFMNoo{&CsgLO5#W%d2)r#$6 z=pEFlrq0|wsx$XQ#XKRqR(P9d;oPIk1j8x2d%XSV0fxo zNTg204W^Z%)kJCg=|2%lW~F%cSxOf(CQ=gK%O_HZ?h~ixQ<_!LBhj5M#Xxa%B7~+& zaplvp+v4- zNf_W^tAaz0Oh~+AOuFBP<&|$w~cBT0Q_L5Hu%2FhY4M)DZ7>9jt>V{xbIC=_-=KDsLyZL zhgu%hePAEBVg=QQ6fyQ8Y7klMk_ra}4@6&HbNOZy&InZZ%gzrFamyB_VXzAJ8or_j zhcxYO*aD%9HA(heZp+Iq#;2*Z(jowNvt5ue%eoUrr$#|7xTQva&V%!G2j^$lvoz7P z?dk@mJ1}C#E@%UaerFU#aW4A(m9mQAA;C*MnXhnWC@1m|82T6+$ya594cJDm;9Zw5 zHfn~Le-Ab7{%I70hoUbBUA}B48b%;E6|SN*cm7c!FQSAli2En&I%9(j%r)P4i2;8l zBT@?t8>wW*gCP-H1C02wKB@m3im@*?w0pCcNw6lx^glnXRUvl`;;mUSj&^0w>`wXK zB+_b<-5Q_>1Xc!)uIC~vuoF@=OilxH_Ya8hm^b5~W#!}g1+$PTBC%H{AD94}8-;BP z9F7OWw@08i4k9BSssN_mB*NVrC|yS8&eK~I`#=^}4s#zu%)GgQvK&ZYsB4tX!KE6( zP&iXzpG$1GpB5Q73kZ3Q%=f-Ur!$!<nnM_68pgi;8WZN0bR--{a&d5HA(b~@ZERIg5Zd{tZA*0cYe~C6ytF*KdIXyo5 zi!9BR@7BV2bRd2V*ayWt!KrOI6#$Ys?>hvuI0(SVT+cy?Ub!#k8##d1SsV}B95MY~nwO89*lUT04HP4>n2X1g=x70t z5!VmTXVib=-$>REO`y69V$R>7kNCs}Bt}rBq_G8zr3~%?XpGF)IoOzkAggK|I^=Wz zDWn3Wl6=T~E*6xS+rq&rg_EOW&)}{2;cW1*l8FI-qt-m2QF7p%`+gAcMlu^CT4MJE zN}3(HJ~`|iN=;m$0BVIMZ~8?rLZRe?KXT;|(@QkIwHB9fh>Ie0aT=#t% zyUdfPYn6EqWjdma+?s}-mW;b~cvQH@!_sP>D?%BV}7B@S1Xm!V>X z`#W8dJnaBqj_b$Gd2-klbGgWRh}!WS0BEqVGj%BD>T_r7U_(RZMx>j~fdpR&3>_*n z7zUklvEJhnPnJ=W;4}!RrgU^k$624cns}#-T51)aW6NnA86sm6WoI(Lan)6?)i3E{ z)I*e$dam_Zri9PA+|&UVGxsd70Bpe}V!{+@Bz|#ASD)(XR7*~q# z=D0GQQ=aMU=p+RwOeN|31h$FU@Vs5%?T6`~D6s7jS^U@|*!HLtZKqO68Y>vERh9-9 za8GcwYXSLu4aCX{T;>n)ZYmjx(UgT`_3e=&_D{v#*0B9dqbt}l+cqgNMLhZ>1;wFh z)HMuwQqnPMT0-{h$LmsQgTZA`rNL$5!s(Qa3I_o}mV6@IEpBSxQSu4=XUoV6i}dY^!AS z)U?>}C^Vo-ar{wf!ano_)f4R=lU6Rgr;D=3sIChb@hudOFZHI0WsgyM^u~gqja_-C zs6_2&k5Lo2&d789B69|8UzMWs3~6tZmCc($K|Zl<4Z5*j+{tb6`3$L0WrZzA0~7WnGJch1?G?}?0XnrV-W8hR#V09 z$0d@3Pg2@>d+_oTQ8YA20?NPufHKzvxH(h`!=l_jQLw4pH2_3;d|(|YmtHv%KmWFd z1JBAm;&E0Kf^@OLqNHeT9b(7d;l3kl3Xwm&LB9-av=&fOebk9IV^qSR9S*ZWpm*FOSCdiN^Y-P*g#Q zrs;Otf4l>W??6d#;TjV^Y8%!-kpfvTYv@P-Iv2?uvhpBYQcS9dU9Wed;_ zFxFRK*r__K))UibQ!;LXD4$Jz8p^`FO4^q{@JlfZv;4AwtUjgnG0siqfKA0;E@HC~ z)4m76=j-Mm%X;2d&G_O?MBpF_n_CR7`}jPzP}wf37U3G1P`5?e3N zrFwGlV8apT@8>X~B%gTi^@LRM-CPO`u)7xABqu9h=Z%c1VXsu>;rDG;&}i%i0HOS)5Hz(OXQp z*bF-wZ%;C1*i09pxv}{28u5!`@yp`k&DGd9ejamE9Gpj4l59{%ZWQ3?WK4O6TFVuh zA>%`+O-0=(OnVz#E#6L&mA$%RZ_sKg!)yu_%TV|zxczPuV}zUCwNyx8~*HS_?J zlHp(_WH+6l&~gJYe+NH(0g6#m2U`SQSBnd)#bMmEJGWj7_5Su+#iM9JqR zduka4#J5`n%PD&#>@lqnhjUQeQ^~v7y2f2~)+eOG^`biU#M!A5G0+aL8juPZdg$U0AAYF21uX@V`hUm#-tq%y4{m zHNVy7l8~?M0q2pHJaaXRHZa}V(LH#rmn?L(nEfJMhel4l2)pEJk+_5!;n8}D+yNQ5 z1a2~CuZtmPD%#YGslbRq-C01R&AP?DCAK$)J!M*9l+nUvOC{~xxm4n|VkxEhvFHOX zmDzHU_+lvyYs6TD)Up~&yf#Qz0={jXZBM*0QfFvlX1r6He}m?T7}YyO)#cPp+_efmmC+A&*f*SuJ6}OU z@oMbbMH9Fb+#cW{Q6i47#Qu0R!6_jV^fk2;`n-xM{m3iug4(%;E{+v*>O<-Su{fuy zfYoX9zqcS8s_!{-du@g?p1fYi3JS7ZY-ciz(>bUsk zHEJ2*Oj%~xDK5=}x(?Yv5fxl&9Y>tBbIge4Sb;aQky##%i0)Q79yKfMW{-X!t)3QrW`!?6gb(u2`Dob5h7B_~oh zLd`rb+Hb`7xlW0#8!12A?r?Q+r$xH~9EJgh{7`g!ovx4YH+rJocl=SDeZ%rK(OKd| ztT;Pj#&#zMUy&E&nxflf<*^i(+#SPZiG1r2%y#UeQni`QL>+K5w<>&_sL;I*yC}i= zqUR~`hrv5kukBRT!fS`3; z_$pwb*dy{Qs9vVL$rZ~%XQhe&8GJhV(s(@4sX-Mqfj$!-R?yg_7;6Kk;>lFGm7W&g zZl=uo$6VO-N-t2ibNMPZcbk<88q3)N1@O4&yoKI?H|}p+s9`~MW3#xCa-8?DpK{X+ z8?Nhg-u5w1YNcGwc4;_2Ca!#w-a!=^TWM08ib){rkU8z|&Kxjsb*f@k+>an%rWNC7 zy#MOJ`9j@;abuDyqa)ksnuZ6kJh|~uc%+&Y@ex4w zy7+Jr?jVj2W8@ddhcWWy@!?s~fB~Q&k9vRxIdq@AC5P^(x1iA2L)WkxnaMu&MEbjQW~N}QDVQpH_;8q^I81pA?T zdS&8>tvmRoI8;gXQVz*2aKBVU*m;4CgbD9ZvrKtgmJU~Ch%xdO0+#`o4rD>aSG+?R zS4xqQ57X(mejlx{%VCXH5^?O{OVB+ZencWG5^`fVH5hHw0|Aen%(&6j??7D47ROOF z&ls$)_*wyuE%GJf2{K=T%$KtRqx7ZdvV&l46GL`T4|UI)nU!#j`%1ix$ZDLh=!FG4 ziW6KX1<(_BQf`{;TV7c9tz{T{l(;MpY29~95dOLoV|`rA-3i|MrP#2OLTG6JPBdF7 ze%%RA%r|#YMjbtrV0c1&@iLV9uSDNna1e$>hzrl5cw)@%+eNK2oUyk(8vsY75kT+UhN;!SBo{PrnC<~?iseg=gPbUtJsy^e>mpZdmV7KWGakAk$LMIy{an`U;IH3<0 z$Nd|2{4qPepA+wik9Rqh$m`1Owg!Dptx94a_NcXJIer>vCSgKJDZq)azx;t&^rR|3 z5G5Y}h|)k}7w(1p^ZG}WD6V}MPFLAt+FtxreM~N~#3Y1!Kz-#wV01&U`|xBhh8Z zCIWd11JnoR!TT=215ZephIxaCoUy`uu?O}j1~xi?d}E(YEcR&UhrN;tH0Dn{uuKI} z%HmVP4rO7q8|R;IkT*VX?m=F=_^(=h6?UZCi)*io=N#7?q{T zC@>(^o=&_Li)RvV*z#=hmSwoNx`P7yd@WB65^blcxxJ(EP>c$r5i_dJ-GyoqDwZQo zIuqMIr?0REEImMt=sWT50b8)(Jw0&NVbQzp!C;1=Lnp)^2k0F46LT6q&)N4Nboc4iS{thGL*mUM^a2(++X!&hLC)3+pGC7tBOWQdz z*{6%~ai&AQv}ltra6x>qY3;R#L7O((vcwZ#VU;*8UjB+Q)f4MQ=xa(92fw0b=}}a$ zJ};T{WL~y_C}g<+ir~Pn!R(HUyS|o|`FUT{B%^}|a1i5^=yViEE`Jacj>4F;PCS1U>f9-D#EuLf!!f)QqW3ZIq`Bh$ zV>Gw^NgNdc*Y~GGo5X6yf-`^nl0UE7vB}5GPWaQR@E*peRiXFv4%DgfY1LGGT2;*W zhGrI)ZvZ~h<@Z*310DrgWalk0`^6P~k$3n(LR{Vt{>{IN0mrE~*45?5>BjW3jTO-^ zCgII|6I+uUvv6(B321fb&eU(|jfkT#9F|Goy#@|S$URv@U5;;1z(pc@pzm~C7M#1l zwyl!|j@wQxlV9fsSPpU`o;*8Z!C4XM=IU6CvkYvN5o-^9M?=)~+Mj%t#;A4Trc>~w zJ1Sm2g>jlIzCQ&PyiTk<4gL6(==*~lwP`=lmEnWT>y+SWSTCHp*AjQD2l!0TGROkCU@zA2bp>9$qEuMjpA?b!6J*LC1Ul7T z4F3rRv#-QVTvv^1KK+SGfP?IxaY%ZdxZ!6Uv_2&k|BUUZAH-KbW1ag-wEhJ<#s|g3 zUl2Ma-uOl0=eJ)Z0XIDZDQd2``3#I0;8$m;J^d^WoS}M=DeQOUss3Ur&y_wQ1wIq( zza#lSOiw>bqE{Q(YfT?SvrgcYT>$+Ne)RU|Te&R0TEJy-U87Tw&Ry`aH!B9$ED2u> z&_C<*!IR|UJz}_AVXqoMU4x;GAsmh1i^UEB#=a2?PUOrTIWe!XC+41Cv9`_?{@>se z(oVGejmAN)d*(Mv43*kOyL3?r*yNIL|2y7c?EX!jps%DfVG-eW`2XpWEahX6BWYwrH~ex zD$o^PbNPq>$U+IH2J5NC{Et5+kRMR&*JfIzD4c7+WP=ZpaW-XnKM3H8k-I3Y^&SLOfFSdf=4CK_=!5@FT{p4G>_lq2Ldl8g5*q7{;d# zf<|u1ANWhU4qmTr1UwIf8}mmO8ke|l#6}Z9f(a0{gVGx>3TeP-xjrhah}OU3+>-Hi zf-V;SPD%L421FL~OC^}>Zx5ct%J?)GCHYf4C*ju1j{T-;+nZAz%uB{~0=;!me-y8b z`_mi+i*`YeAC2B$S_K@m4q-;k$N&&#vOv4(IYeZPK3S*^J zz}l}1;7~4OE}>Td)nI1>XXF+0v{H)GV~S~%;?p5Gz*P#pQNj5iRsoHKQBZf#4Dux5 zi9MYV``KV-;=6VVzAuOG+G)jT8Jd)Ag&p@$47Pe6>=E{8YyJ-0a|RZ0I#6Oe+kq1U zTc%@VodHLe5x{_h4rb{XdyIGjMj03Wd3%AL;yxmdYI8CA;_>8!)Cd$xZ6Y$!s5)Ln z(_Q5Cdf=G{oD?}52!PGYpC#lm7+a0Vk$8n$(I7m4{C?F5ee8sub^_2F9WFR$OIiXA zNm^nsBPHrpJYCE^+MlGPoy>uD6P#VF=gCL!e zkBxaJd(1t(0vF=VGb-f4^ptmPfhOeieJfx|-Ptf_d&k9uQ}(SHaMZLVB$T@?O#dgWM(URJE zN-m0TRJM7cEE&Op8mCb#V&`o1B`z9_Z?v1;Xi~H!RerkJntBQbtfbg~P>>~Nk* z?3AqFl6ri}h|_MJXwh1;*eSYc^4X07`Y7=2?Di9*mDHM*P9<-1`@Z=0i#jr5_#*f( zoM{O)u07N^o5~p-W*J0(-~v~*c)`{2P;dy*+9fi^gm3^#M&M#Tn!w+{!oP%GnaBpi z!xfp~1k*D?8eAa^cza<#7OWI&8XMX0{W%u$_{-Uz3H;p~SrZ>@=SUZ;*nE6VLWh01 z(xCl`3;A&gmVN#3rortqEI>jDW*Jk5NRZ2tqclfIczKT&0K*!DMoR5Y#rlItKH}hI z{V0mbd?vVmCv-*r@86&@V6u6+qRX|9NzJeR>i7n(yextwB>Mb%Aj#$Su$_P@7_3~1dQ$TF zKaljw;v~I@6#KTHSJaaW8HWB0ayTNWb`qa70z?oJ9WG_F`9090dG_rjKG_Ur6l~4G zJ>dT6NS<277A`-$?XVJJnT4Z2c4;Hb7%*6|uS=rGaxU*7KFf__CpGqM0qy6hr&(iX zcR7CzDcD}^a{ouGUF3f(1T)jFNhWct9VgnWU7=RQhd$&$#;wg!Xe0lB7H2;ehjT(3 zk&82@M!_w{=bz6D?*BQok#lPptTCS#xl)~$k{UiW#;4@Zhul8_Eu<#atp9iVP}_e8 zEhk0=pT)!{^y9&e@a&Ef!=Hfn{{q}Lap0o=thmRKE~iG}T}FJm2s!#xtFZ~eHukDe z&Z~jFc+9PSorPCkGiFprO{;#L;-r>EqaeE1P!PE2*jT-zV{fb|>xJ4NyYhZ`I4h^t zCmx|Nt}s6Tye`3u@c*6wTE$`1MrZ&Fouf;{7Q+^?#gO%3EN6AJ;t1|*urovz;yOJ7 zz8bnj>)MrLiH=rZQV`fObyQ?9_Z)+1C4T_O^f10!I3{{a^N}7a?wFvscfR#SN*z|S0|*hPVJ=fjCNk->gFuyYOymu4gw=ERmBFV zZES#g+5_a0@&eotq&#Db3$C-oh1#68roG}QB%r8$sY%@MU^R!i!niTel*h+kYkW{I z#zzzXNLDjpOqA;s)?2A9)zb2-rd8mUU2{J_)Of9+@IUEUPRRpYQj0HH!0Ln_>cl}M z7?El|^ob5qpTNCkVFM5y)Jo;|9)U~gs1h;)u`sTo35OA1RhZ zYDtocmAYW(g-h7EqSJ|+Q3#zV8mjzB*DN9M+zQN zEpgRUOSlt`Y;z4Da7}PT8+;j=MH{X=%-&%#fLjMcu>fvnG@JltmXvq;@ljsXcml^E zHGf-s*cwI$yp{sH^6wb06mu&-u zW32)sjk83tEubavc$OvPzgb`*5&o|Qf~ElByy6QdMi#O^x)*T8*Aw#6ahIolMn zl<}Qn*0visBj#8-Bxi7+r|?f)M-5AdGiGeAlqI7i24kiTyy>)Cd$^rJV|%46T8qY< zlC_7sjon#3;R`DT4|m{fDvLzhEoWj0#1l(vyEM!RHmYionbYnYT(Sm%@&fG`qH?1& z6K5uA9%m*=XTQssog@`p3T6ktZ70bgm-Vek?|~x{&|o$5h5tv~mw-oAEdS2w)00eA zCVR-nOcEf3eGhvMAge6yh^&H9!42@LSA_&cMF98`5eaKh^df>r zL;*ns<*x{+?^k`6nS^lF_rKqJ@O?RR`t(v=U0q#OU0wZTh3t!{IN%g8bRZ5g{-W?L zrV)hip@0#@@F2=Ac5EFh2)iUXRuJ=|&ti7l;)bxhuAW}hj*4tUhYgU$EE3s!!S0Zv zC)@I8F3;6=m;Q=W`QIS=x&X;KBh70uObhm&1zQyUv)KTcJbCfcJ;s)W?F;Us;#a0Z#QfSbbeq+O)Or6VJxensQSDLlAkvx{P{xUAFajUnJ}A zk*vQ9sP86)hT0x4AksCaWpgJ#;G?2gx4DCmX_jWULA8T$0VA}E9^j%0p)-TM0pLGW z&GwfDq6S6zObSkAr5rTtZK)C!nOW2Xuhe2bID)$|pq&GrMgjrAcwthyxmPXn>K%(1 zpU~z-Uby&_v`vF4`1v1=ZGU2GD?ZIk=WlLt^5_P4IFp$C09Q35mn8uvqH-89E>4og zFv6=1On_mD?bQhqal|cxYypDI{l6hdIL*`~NZ{IR4`OI_K^}&%zeBNjQ#?GL{Tm|?NL0c?Jj{JE+EJxM|fm|mXA-jv2ew*W3dvQEYecO zQkEZ?Z5Dzk_;zvF zLKT5SFoQvw!9vfYS@W`14MZnY^m&5m^u!w8&f;~F`JEzNIFi+3Lr|8str+FntsMDI zrEG>cv%R)jVe?`XsU6vqXc51a$xhjltiAr~6G2&>F_r!fs2Kl0fwh4H>wgi{`gWyC z4gYVUHQTP0$Lg4XjL}pzlqjA#VYu=A}g5T{xYn84ys!E{uZdkOjmzG0c?(C z7X4oZ)tXnu|A|^l!7k9W@^G=Hz)^O5QSLOD7`$Xvp8{-T`x8(Xnw6S^&OyykLLop| z+iP`uU{jb=>wk+_;r@k6VFvrJqLocHe+N{ae>MUx&aZgEcWV7>6AK0YWL~iY<2%Ix za*?f3Uv7rT2_bF%n_W&Z?Y>BD#g731i% z5YI7FcCOY)v3UretL5DW;DVcS8n3N|XSju+k`Zl+Kq2lPmNIgT0g4S3*5G_-yH;|C zp|Rx^tJMR0Bp~HH7)i{&`LNHGC)m!Frwm_tVxRS;X0I&``3S?59@>_|E)wC!sgPT( zCl-YJ9^&;sF0>d^Wo=ovUCVU*(+2ks81&VFGS_h|ST(yGJSRe_r+S~PQm=5SAZ?=ep^b4{+@&@_j9~mB zOdD389^*bKmsd4*QBZH$$&npNRZTTLQ?p$$ZnO~M3GQMA6&{{#;BE=TE7wtWDK)t! zyOct3VwX~Ns3Xi*?D&*=!Pwb@^kR;rSb(@9llxS!=+dAoYS2Fw4z9><`lE)iKPp3m z9cc8$6}2%8*Ql{mEPXy!6u=RALXm(o_MGM!KDzq`aU~p%cibQ@gHv%mwQgfT=x1q1~2ptqpay{-Uc$rtf=*=J1e?>nnQ0dpd43 z0^rrTn+2~2ldi3D5vHmE z9kzx$c8fvP8Z2gZsdi6Qd*y&;;>UgUY;5si&-?UMpNK^ltjIeWe6H0)>9Y1r>V@m!+Z)~kEI^Y~ca>k+`SS+2&oTIC+* z;@}`OdyGi5TBtFSR?gX+Q<>?ik0b`fY5^9IS|IzE0uU`|V@2W+(*+;;Wi2_YdEj#& zusVSw1^wv%8^cJ2m|1^wf~8Z3o){EsmOa!{&9c{eihysfR9{KV*ndaOfNOd zy7vC}o7FKg>#j2Ilo`L`6>42E) zSpyU%M-C8tsN=Z-Vsd(L#bN@iHj}91K#>VXJ7l0@v@Z`7*I*dLAkhPbdkqo~;@h@C z;J%wFbFdiD=fqz0Fx>cwANH|~QQ)ZvpUr##;qSfwqfluhXcYKI70z>51)YAsHdrLq zH?!JwS0k%==`N6YY%rX#_7QIn;ToGYmkGYc=HO-GQE>koFBk1?j;yQG94sQUgWk)&J89rZ|7r@Fn|Bbxb+ymsqE{lgb!|jD~53An$FX086cSu~#=o z#(*5co2XHIXr|hPtG%ER_78fW!l^U+?V$~jlqE6QE8ZKkh5h`q= z!llwWLpiA#h+!eEYQ{?`MK>3N(a7-TqAMC%*c^?Vpq>1NV^b}_tT)qjEkr)f!9UzW zG!zTprj;#3+pvY@0S*)LZ3}U&_B-`#DT;7e#w#tw>^gj~Dh!h?5|Sil8uf1_(h<)Q zB)}0YaU8{t$fw*RLB5f?!AB9HK;q+}z?+DW;XQKJwlSFlWDqsO}MzRi@hP?@)f_xzb)(!l- zrx)wC$QtAa2!)5uM~-QPOC#Ef^aO4xoXf}JSc_SnwgZIr%gizP?LmwQmKbcst1(gQ zv3ZuQmQ!nxk}}$1p6{o=?L^i!%KaF?nC`mJ8PqNVLL{ms9S2Z&2sz$}MF2}SqcP?G zZ4*GP`}i9M}mZ8qlQgtP=E1|q}; zd#Kcl^W)Z;T%J2^06W&5eceUdR{vS*wbvbJQWz>zlcLm{!1a&Ps@nzD{PM;8hN*Yt zW^o0kSEq5}yz`On8;_;^S6V+_)JK-D$BSE#sgme}QK=PhCpvW&k~SiV z^Ss-{liFwHb8ZtES}^BNx2ww9-=QiSeuua|`g>-eIi@~J+wTz1Te@g5mim{jGR2$k2cEb)+q>? zSw+};WwN@uSlmMI^K0%L91CcJIlMjeQfw{8kVNqZUcdlscWhkEB6Av@1 zy@tB@QYq)#1qESOcRrq=lMjl5V8MDJ-%zmIG|?g0Vphn`}n1|aj5+R%Y>A~hTG0O2aVY)f2*2fLgMM}GAECELwOZlNpgjj`mUh|lROiC-;0?r0oAjLi^ zQZuZ?PnkfKqGFZxLj0ockBYH9thv0M=W>#@pmOa>zXk5BDR0flk9hJa3!+sK+w|zz zqtKoZ$>%YVpJ7d&Lp*tGp^58L8A~1$DH&FaYq&*aoDHo?<*=Z(XNg)xxDG7szY^!D zW94{*JBvE#)5pY!?p9(cCo02ZNX69_j8#g1;LDC`2&Lq|5)1HAdgmI^*QT)xq|b^g zA)%fk?^WVb$a2H45(6MtzjBpQE+B+nMk9uZaAX*BwG#H8yIKi*y@rZBI(IeHlZ6y_ zjTjEzar-rjm2+cAltYv_T7L-S&{I^zk00s9A);9_&N5e%FcG_or^WFhN?>brtu0~p zwOjt=TGevWP`hOoGankN#LT@zm6-X*P*cpzyAERJ`L~srIp#X7acAkH>%@viEPw%h zsX@Um0)b0a+K`|W7w&zNULGbU=PFzPlUj;D-==N8|Ehemae9u*YzIj!AY$jmGjuW=55Z#e6 zVx?$d-T16(SWlO%6gL?29|ssoe7hwml?ge_c$JgXP0a$=V*>Or<8@9__if^qRC7mR z4JXCm>gMAs1;=HJUnNF6_b_h_x$RLH;5mTgdMaHd#w3?=IS(!{#zJHF<`F>=uZgRZ zEnw6&k|E#z@tU};g$30ZzNpgvW?t01Rl~KdAy;U_rG)#P@Ve-uO{Zb6iwS;<)SbHp zkzoxhu|Q^a7+$8+_pgJGucPQUM6rD<;p{g=|0JvDWB3pee6cO$pL#jsiBRtlc zO&}}PreU>FM7`e@h;U4Iye)3?SQsgyZ{8O5qsrM(z^L|?Q*yZ&hasO@E;3@Qu3NV| zzFaPrp!}fKu%uPcxYZ&{T{)4&EF;yIq_oiac4{1_rugDi>Xy~wVAfh74f~@Zqst@- zB?J*4!J;;-5&aV0*4X56k~bJK46E6!cSO_lld&S!q~~BRxFN|95EMMFTg3xC-_dn1~KDfbxpd!XEY-uuf-vqyy~*TN-ilZ z4q5wUh1IeYq*t`WS&b+TvQs5&3d3OuMPb@37y)qs`7ANfWP>NwTn^A{v&8de3btSs zjg5L7>T`fzcwDHvhlMd;)v=xqKaN2^#$f5_knx0Q=Xs3Zz!|Cd3B?9qctXsz+)oL!McZVn@-fkwoWpDv+;PNg zabxlcZc2i4!fPqy+h?=IRcNv0lTht&Ve*sWx^#7|Z*F&&Kbu2^S-eios13CFNzpA% zF+cFh%l|@;ORG;~;I-j2WU|`%2o7kn+TJmB@C_%36~;Eq z5jUDRth7?v%oVdjmzx0XoGS_eVC+*hv3luKqF1JQ;UBL<8iW|NjjLPt{sFlwpAz}$ z)w1xc4aso&DM*kNlr#@w+y&V0mt++k!)GgP)UBIGYROL{QNZ^KTj{}jg>N9pkO4xr zQD#rdtiFl);u$jqhn`jcm(5pwJ2t;&-x@wGZqSaPm3`GU?K?Qzw3zNCxVgEqY`o=@;iR$Hk1@L!^3t>{mFR%B~qsl&7AUw|e(D>~X!4>u`4D;8&*dir#xP&QIHKE+Jtq#U^|KDIl*u^h#JqLN^P+KUmg2men&9(ts)*_?{5}juCal8j z_8vaLaP{`NCt!t%M-mr2^t|Yyt$ne<5}|eE@)7u!=(BCgUc5P#`C{-E=Zi6`_Mv^@ zv_ER8XxFLQvd>!%)fQwVd?JM&3`l0K#%*{s*O9Rna({qEueAw}(}VNk^|g>e0`%Eh zSY_8x?0aHvh`hOhUVTqAbr_7>VKB$vgJQOU^4E#0;^JKFQU$9hEI()wH?FO3=}9kM zAHaY{7+d+l7W2LQTV35Jh5Ty^%3VXY(DeCIyF2RYHG zVnT`F-{wtj5Dictj;+VAp3u>SQ+7V6`^5+;$J=ivDWHAcwcNT9O}^W;Wg=x?=aN$JzqJsG37uxJ%! zi6iLVeB`r4D|2iPa6$WCRUG0etVXnq`11Y?0CChXa*l8@F*rj-GaTF7M27E8WR zDT?onfb~cHPT=2j-*@Wbid0&lS{l{gfW`KFK;#byEvvHQX!y$kgih~e#wv?`9% zAP635wt8SA^jJaOO=669Kj&5@t&0jD+$0*+2FtolqF(fJb8o$$64waJNUt84Pfcm%fAovA2z3qK(i~ z140-@DtNXlY9Qz($WXXOte9r2RZpPG1mhPr=Y`?JR`&jw#fcmT2%zjk0)VIDei6fp zE0A8tSk4oNGvo7IPFli$;19$JtMHpU%hErx*u4vI7H_qpl@}`tQ)_6^D$W;atbdMu zOm)=B2x1UwYnGREWU-t5mdnO)**`Ce%{4A+U*r4>7Y!L&u+?I9eYQ2W=nj0?zzP){ zA)Vi8-l>bKY$zVyhFq!#e-4FOnS(`3xoDKt0r0~A*m?L6gm!)bm-QGkH{${B^&g8` zQ^JP$d9&y%s&%I*@b6#}cTYHjP`&fk6tSy%o9l=+Hde3dFV&>1U_o5$EHo7VA6y3I|p2Y;B)X|*&PvYxr34qQ~*oUli9 zPFu~h3|c*Sr=@6aF)&)b!FnZK_(90@}R;_E*(j8%oP|%-4lGp`7Prs`!$9ck}{#06@+sI*u&C{w>S&qIVQ4t7QG|=wo_z! ztSyHll)Vd@!x0*~OQff~$faUcvoNn2kDNDOX(m2;{>N&SR^lz~1aDcGc2bMUKgGEt zfXlkWPbliyjdyB?vZ=l2!qG+eJnu!J{m-IM=Tkb9sEY&X+47<2i3X zRfv%h%baok;ayR?ouOKm0_?=?X`xw`kS289dd~$Tl%Ef2FN#mcX@-p3**#DxTF|#2igPLRccZGM{KsBL@Y}nc&VK~eGK2c= z#RgjjJ+N2s9R+X;SGRlMiR01`N#K2ZoObPnwv|bz_QFcFm%4lmpPjGi@sA_5jlZ zLdodzjr(zsAbqJKAderM1B3*jo+lyhfnnNjc|hDr8xM=t#V2`0aL=K2YrQEv@vGYI zIm2Hunr;?kHRDls(@f@9wY~E!zb5c2+R%*G`8APWtrgK0n78nUNTX6ce7ry#2lzJ@ z#Pr|;FyM%& zOJ95g3*&us{u}THm6VUSdya^5+&JChD56a=TXvfY8x1-tl2fheA&eg&Y=le?ntW8; z<$D8u|9l<;32XgXZdMEA;EjqlaBG=IXTQTdD51LFW6z_6x_vKJ);W(=&|;g>#_5mgx9>sglPKi} z@g;5*{q+azmZQ0zr@)=N(ViE>vYYy#s+`2eV^Eb12ve5@BKSTY)Z-qP9ScnlB>u%I zOoDFI=11`se5Str5yrv=y zpbGm4_^NI|E${F%{Bm;mOSG{J;Ul=sf^pteh+AZw#L5EaI1C5uU*#iyfkg=&nQ}&q z)l$22d(%A#*d2#pPON%LBY^wp%Fq5PMr-l4l)v?ysH17!%O{_Qzd(N3!4PE4$BT-3 zROvypY%z~EDxoT~XWrd(@;B^~b}Uc-UDOj=#Z#U1KeSEdoisf!X8SJMuusj5EIY5>2{X?Om)TLbKT)`u^dURH^H!gUyR0 zSpi0lQsl^Ux!S1`)1B-_v_C95FADo^u0An-XC&1=9Lh&1fdNapF9}0fAoZ*`;3moN z^;Uka^?=$VbfeUB!A)mM^rQc)QfCchP#&V{ZMQ+9hP1zyj|N(~ICe zIXw&+E-Bv;rfV8fcZKT>aktaY;d*XN>2|D+e%za>%m58N`eg8dr5=4y5|4BQ_Q%|Q z7}E?nQ7x<#5uvw2j?NK!1_YyPBlNOFWaLq`OpcXcn=mNEMCxs{t<*hIZ`b?i4kRt- z#kUUlA55GoLESZH87|9IAEODsn1rOtIRsrN9rkwRrW_;9c0~%CE5ENeH*D~ zf#4#d^zVcMT!Zn{<2{Nl@U;SQKxkB~eyHCXtk*`4v3wQ7$j!wV*cig5Fz4nDW7$V; zE{AIh%rtD!`jY!%>e)tC6PWgO^r0CaXgFcv^Rh2n0;Y=>(jKpX3Cxw~)jE3jViQ1a zD$?-Yb%cTMnXl3z3G0ti2Vz%>mEXpUF+gLK~V>U<}CT)fVAp~c4O zE%7Lf(;vrUcbuN>Q=Hcy0VWBbJy$jhN)Z@R?z0k??4nKM^<1!N=F8YtwMGd@fVdWE zY+fF4`QdDUeNSlNF}yAB-9l61^-bwpA3`h?2w-fkb#ZAX2WyOnCFoPSe4yC{@X_W_ z&V9zd2!Esx*N*d=9K+jH-jMvp1C)}ev-?)tM14s_Kr;#e#hD#+C{b^eSaOJsjX3Zg z!xHa#ZYG85CFzYIuJ%pRoB1S=3{fIG9DT;kb;^pQb^{P;7c8ZsoRaiGn)VVMN!ABy zuTr}d{VKf8Owq5zO8J!rhFkfVISDY`hsVl+o-Z_z{pOvxFtgdlg{doYfyRLp2+ViJjdaR_v zG`*hP#x%2yThjE)?WDP8()Kj{U6gqwUC$|=xf?JhUgmH`D}*lKAqsAyx*ti zU+-`a4WRfy?LHG6=s*oH$-qJuZp9s`=HkZJ)Ejd{-_iWc(D!N13r|h*K`gLsXWnr;4qI=$&j(_d@zKTfa=4|B9OAV8$(^sX2P<0Zx+3; z8N$|oKo^c?1uWCPaL^K%GJAe7C73#944dg8oI>$pojwL@I(pHJv|PO>%n!YC^`_1( zdPX`>o9CwObD!Y;6n%}WqZ9ZW60 zY1G?5za;3?#{*zyfxcsBnb<(Tr+4L7&RxD?Mk&Pit)U6ikq`(?SZ%+Q@NGlO@Y!X6 zfR0hihLBr6qJa&S6f?DK{zdXHR;ztsCUJ&!<9k&nV=?(fVI=aCY=jt$epTfI^ zez?LrFI@a&75D+JyGHZoy=FE6nqnpW59%v;$SDGO2=$eOzMnZ_SI&!Am=aIw_~L<> zkLZd<`Un93dLw-yOmBno^~P_Ig{s5dK3MMRIsW@qs@SruwV(^)80xCH_>x~CCs$)CVB^KtfRzM z*MOLaU=bUq_;LncB7URVyGt(9~)o*Qq%2YH0{B1JM`!Q~ybVJPu_OkJDl8zC=f&Gp>Qr-2wts8^$Q!Wk%x;$i2-Jc6R61e`^&FTWk# zTu+8mEg#3VQE1c3e1}#X=`RmGTjGpETfDvLylF6cTl3HQQQ<;{%}$12`E{@Jikq^n z{0JlfN$+fPeRI8!_^cu(I(iTDjdz^aOki6M^xco>U<xV2tStUW>-TkGxk z!pB&|Z;?tu#jgX*mznatZS)k>n%71j?2rf+AP>`E8$Cx`RQ_@sy^q#nCQszXSR)F@ z8wx7V)+SS@F0`P8gHPf6i20^SGk`iM005K}DztF?C#4J**Q z;waF90{tH`C%*t(8OHLjnb}Zg2mM-9ad!v3JB+yR;LXmk>afb->!`O$x5v>Z8|f`D zb72M$h1mGwNqBol{q;0;rEG>@$+xL)9|Uxm93jPHggbS@h%BJ7ouE@5E8pHpzfFrO zT?80bEkpySsb?4c#cByZchNsAE?aEp_(4FN_ZXoGIWExP_-u^@Dws@I8pGsM^&vO^ zul8mHmfDq_=5gmxBPat$ScU*4uwRamMkJI;{1=txmG|zZzp7UQ>yPgG3%x_3Kt0R{ zU`Ph@bgDxA)!wQ#j%{)c^3NGM(L;YaPnG#uB|-Od-(_eMY@mL@Xx}x-to2m+t3CBs zHOQdX_0qfHv7ndE66xE$fYDniv$wvn+c7Y1s6F0?^z2AXif|(UlJ@|TfQpi8gn@uO z-bZyP=DPYhL(S!IAeM7bRv#D$j!}<3`X*7ekUV|$QE1_2JldI6Yi8AKs|iG^PFq!@ zJCEv+U(o`aIMrwG44wYyt7jDQdJ=Aw!Ne4akuqUH0=)Hswn!(z{suP}z^&f!*ZYW0 z*Y(pcFJ=h5zDN@Sw!t$5(AezqkwFNQ%@v;k0SndWt7(R<3bR0n#FDR2f@&Bp)Ei7- zxI*f+K!jN((C<&T$&vU+<1bS${Pm@Ae0&AEU$l^@fbam`n9L!~;4N zU#ef(k5R$MW-TDLkzN+zZwXd37m{uQ+}za43y!nH=>F@#Q*Ddl}M@H>M5MOABPHob{%1#wq^6{ju=%Yx(hO^>Uquf5~wDTJacW z!f?H9*AiStY6M`$VqS(wN53g62RJAsS{TYeRKXmE3!gEYIX~u!=KZmJ;t0L2=9_Ce z2yq%_^AkGjQvwSyUc;~$&81gH>P6LZMTF*p?2O9hQp-{Lu+~2^lLR)5>CbH7SWft0 z9@;>SmAJ6_0hV*{9e>ZT&kq+2jM6jFv+^%S>F>sBPn0jXUC)Z`{3PFKWnwnN%P&SC zd|Y-4Kf#1j@nmC}#~IsH93rsZex?7Jtlw%5BG4MHhAaXIvA=T~#y%UwhhO$!;1|;B z;w*i5C|Q||B@ynB_yx|K8B(AWs7%9Y`*5WO1S?|3P>j*TYOWG79nc~YlY?mrvXkhO zCzuAZ#z@+5qErfKAV@qW(~AJqiDtdiIQkK9JXC_|1nHdn8gF-uZY@D0)YO`H|Gyl9+x$Hf|t0L(%3 zdXUrNIVcxGL>QcS{0A8VXEqNLpar1b0bLD*)5$Dfcq7_9RUhmi;llcYHNo2GeUK*s zhiFg;1pt`P)s#?-`E>zD4vh?u66bW&fSq4ypuoT`odNE+-DH89?Q16UMc-Vp;*!@IbKz7VH zYa}x%@G?>@nHjEX0L5Z>GbqwKi}6tw#n+3a0|BJtkdRv? z0UH=5=L$z=E^C%yHaV+&|EqdgOgOVgG{SE$#1zlbL3?pHjA8w#+z<~k};D{I3pG&q!8dyITJ(7IP(*uLm@wy8GKhY2^4`>TQBiO zY3LAe`_&S-eLEpqO(S5P+o#9YD$%6;jkS>X#OY)7>3g~XjU#=XJ}_|^^sRQHEW#Jd z#_Z*I8mTmSo!;o;iqX1tx-YBrO=xp|WBO5Rd&IC3=BorczfMm}Tz;7Au7ozmbsu1@ ztS;rRSBCN{*Xw*Z@V@nWdgA7cO_t6bhV;|081h8zuwuko+YcNjMHa<8?Px9AysC=V-d77=AnY|O)f<<5M z=>p2xgbjpDx_p!Vf!3DNHtWNkE`snF7Y}XL`6Bx5n=uA$>Br5`W-}@IeHcSCY5emOsVO+x9YKR1#C=a>!$`Kon1+2($;EOuq#R5 zZ-ssOMT)7=KaOPO0k;p0^R6vFQK3g@VTV6s1k<@~*gQH;{kQ9dbvcgthC*<>M&X`j)y z9oYY!NTYF?HihlP%&njnJN343^C;S>_r+tC`8c~%zdT4~aOVP*4c(=;Dm(^C3U??8 zHz=@i;wTb5Rw88NU}A)o$kCe2oU~(?o>gagC|FArSm|z%rFSCL-K{SIROP$%6?|Y4 z%AjO%57S9?3Ul@3{*XQ$-A|8I>etpP17O5 zpRB`i1*ZjY*aZ*XA;cZCro+>fAA(6vq(?r~+l*wYabsE;`^*|l&%H{s682ot*)EiV zJkx+~H-vH^OnPr;H>#N$?hnOtx`qqn-Ns?)0@C{dU&6wtyQD7#s80JxZx1^w8u1~> z?3-{L^o6UdOx+x^X*oL*BD3)=JITUF%UF&*+H1_U>q6P8VLq-fG7dUjrjvyB_hHemSz*WR^2 z;FMH}>_DrJpKGDC16T$QU2A=WUvQK|XtJBHk*9xm1Zx0%`U+>`T1v7x`dB`UU z6fd#%f@#x!y?)rj&(+laem{28k5lAlFexmf)}QHq^zp>I0{3~eN{-xfz ziv&OA?pzGHpaGn?0O7LtfZbkWyS<)=^bXo8nsP`_P2flkj^JPk0xuoX{lyPr>)mnC zfgo_M!rpYjG6m-HQ|LSJemwLYg1}dy?+^q&3w{5{d0{_7sMDY_mTi~eijF){rWqyF z_bYt>EUEMraPt~%`w9}kTjf7|rBBiDdfV4nF5aS9U+dSykbClLJ+bj&%p#^!?5KOQ z+jn>Q+VLq~PAnYHiK*Eg?L=z+jh@s`edD8^1$H`TW)51dG<0iUTjan69jacl&Jtwf za>(jET>khs`V0+#q#f0_#4Le}ui-a#%-rbmt}g%Xs6I?%?>}%&$`F)tKU{Bdd z1`Df}9j24^z7G7^XJ_XZZ#L2}b3*b)bO)&AZynd0zz|!0=mdrU&!q45lUhpIIhc`o zGt?+K4c#KcPzf(k#z}oh3k3oUAzUw{nsyAdrfTkBjs`rO@fAbk>&FSSoIQW0hXMbW?L1uuSdT6YpY{aJ4s^6}o7 zs-FOJU1R!rbm9e?^NU{5r&>3-U#osao*b)RNB~txV=fZSJz#*u-VNYEMkQmwZ)0G| z8U3!9X)`eTb&a*==r{aT|2F7XXEXsb-b(e(>Ha}0L#G#}(~Eewb(;KJp5&(xWV4lX7T*wAt^t+JBbd4@!%D)iu zl4_obZYJSYKb*016@<}X{cgM)> z{c3`66jqN~K>(B8#8>>G{W7RFn^@XVVHebLC%tc%&y1CES|WqRT@HeVRq(YsQqyc- zW9(g)ul35N8n)ZNjl<2Dmbm1vYg8Vjlz7=(yPbN+%Z7mQ_IO!8i^(#Kd6RE2yftBI z#YE;NeBHIl-tOhE$ICR-RlYMp2DAZ|BjHRXAMhl!F^q$uI3aCA3p_G37pTNuz(X?PUtN|ZlThc4S+YPpAZT%xtPdDI$dX0q zUbA{KReO_q*F!Jgr1AA+lXy&C)b0T0MVXiC$-dej48ETdeX^d}hlX^WPbS8#R-#Za z{~uK1lMOrn{y~6GIsWz_9x5U$Ktq&VwOfXtxOzR3+o=QFj|xo;txQG9jp7()U-={l zo%Q==Bc+Z)6mTgm7(aM(TH2dLkqEoYXP|+^+;NO2RGr~h4_|gPkcVa<>qmOG(QLoW zYYxO=6UED0c3|3AVYr+^EU=BTslIgP0Z~{5VTRjJM^Om;BQ9Gub=;$%C9+qv$VMdF zNVA&kI&eL*`HLtNg|>HWrG4zlnshEYSZYwfwBQG+%H!)Xl?_ptPWdTCLRFi1H65>lwhb|>9@ugofF(%rnO`*pe3tCZMHo>CzS$$~) z9i%wq1X@GPH^jw~Xs-@h>(D^<%65SFB8qUfb~p;s0*k&O@^z$cVo z*nW@G&SqF3KBsfdl-v`AZU#6N8&$g7Kw9n_YlB%x@2ql66#vfTDH=I1XNGe^?f_kwVMXDue~z3QreZ}7ND}-XmvEbSs?ppyUTwo zkpCmJJ@iv2IdF(MvwWGR!ASZ{KR#v8W2{yRe;t_IU_6L5_VTu(+SBGOC*|~#Y<|Hx zCi4Tky-8plR;Q;s%PvYlxKG|9E@>B*BGY4&M7dZ`%ZgsoLu`SL#!3PqD_%w*`Vk{VD-~mn;g_=;F5$q!aQ4MwQ}BR#mNim4d&&^YeRJ4 z!n}h+^Me07c~@VUccCF0axhy317^IFw^H??6-9NIQJ0w=Q9IgotTi`Og?5;XQ@Ui1 z-P_uSg>LLF15NF6&H%A*Z7TMOH1KbjViZ!r&9J55JxEvfkXK{aU+E$HM1_>3-+N%z z9;CWGWq*9Wp{Kn3Z&rM`r@UJElHsg#xG#1ce~({#T~pIrJ6HP5SCRbI3|`%t5K?E zPken8XutH9S=B(W(g*aBT?$WJY^FKW6q_Rs^-O= zAW*{B%gF_x{jsJ9Y0IqhSJTS=(wBg|u`JdGD>7hQLyZFz-FAmSJ%nBy%{Z{Zq zz_t#QK?_i%v6zba)S49lGv7Aqb*aq9_SA$+C7<=3aj7gUHg_=~jqne1lL?ZCxmK~W zjP>32E`@Anu4jnPZhf+LLU`{(B|&e>=nd5>2V#X_T>L-T!b&K zQyWrs6!Pl>G#{T*W3kj_oG#hmQeYw8m-Q2erlX#5Q%TPVAJHH=TE2{+FjO{JX3(h1 zWCZyK%SL{rakLkPk*~9#e}X}TFC5GNsYr;R(U-}V+RLaxBV zm*Fi-z4=g`VghBT$7pPw;#TgwT>FU=^!jDe7>!(NI-loU=?o{PjesE*b5@Jm)mvm2 zM{@YdlTw8v^Ztlk0%J3_MWTH!?<#(QD5E0Is+R*$&V-o`rw`EdXu9%pIaj-pj$JMv z!oiZ;uaJb@x47$N18RCD!f~&lj#tVSDFwWxb3n^>0qOWv1%xsg(9|oT>Q>M*SIR#1 z?Zb%(I$-jAoz1=3g5v<{23sBl4h)4~B|qkPg9xh)14S58j$Vb;G(c^xmMZ!svH~<0 zLaa`_THai|?N{_%MFI{t1BUox4Ht*HMQkws6vflY3df628V^#GaezN1^Cv3?AU;`) z=turkk3UJLLJnt&QnSzE69+Gev4T$eV|y8VCYjscszcl-<@aFvo-7`cEt7~;~ zOf;seZmi`EHAX9<=6yFrUZLGU#@w8$tJMeyt4FfZLt$s^>| z^{inTgT=~KqbY`yW{gmEy)xn=bsZgnx^AGlBjxa})&Lc846Q~l^3tLktDv-4Bv{1c z(_}C>zBGi{WBzJksfgYjDJOZXykn^OD4E&DqR=8%YV8+CX28*px%ATuc^K=+Q8^UPV^%DsYv!BdwjWz+Nm z#ZzN^e3pzCnhf;C3ui5!=%v@IiT={{a+GzN0Jbxw`u3T~eddEZoG*6_Y}FOidkkz% zYw4jevJh{p#!5cTyJM`(q(8<;4}N>b!c_JS-9ENPhWhyS<5<~VJTspf-ykQ2SZkP)+-UX5J|4vBwT9BQbo47r#^> z7}!RP<@;&#jj}~JWFWV9mZWnx%9afs5ufc|N^u9uu{mz8-EN=`2lpx;p(}2Zub}=v zZjv{J22hY3K;f>N(dY{>)L``kkH*7;!DHhy4z~=U6*ps+R?xAVW&JR=mqCV194C8@ zLThfQ^p5Ng5TVyj`y}9M?s9cdVS+n36%&vGEc`@^5m*<0iqm=NB)RsJG?=vQx(Z5YuKh%P^R8|17EQ$7OI zwthG+BS@iUcgSQ9j~h;QH=$EE%LE#Ehm5e33RDt*?Cevk4|3v|tV=CQ_#w?yIyC{y zFhXVAAsgbj7Ze>RdgeVZ_?2O0N}M1^t0OLHb`7XE*ZMef0$_#j#{`+9^886F%|cso zaeG!PX5)DZK%_RYs=sHVEY)F&rY}dsimz7NTpBq^dgNMxo8WjZvJ2BB`8Yo2-HD}Q z1zmTiY>`yp<0Jl=5Uk7z%0gBg`ODmVq`X_1JE;qsM&mHV?mO8P2<@|!6f&cEf8LtX z_^4Qj$rZ9S?@;poL$>g&l%QM9yNde!LtbBeeqn%5At`QZEL((^`Ivp`7?NQ{ThWal zK(b3#;F}YS=(i^|+~E+xqDiG5BAQ?(dBE+JFp`M<3G){iBE;&^%B)tbOlw#rRzVo* zO^xo7&w;D&xJzD}R*Qha(v8GA*6nWDLXZ>;99!@MCm zW;@G7Nj_5^s`{s#>Rd_?umlX|`VbgZo7dBndu0jM+CT1Oa=7fX_hHRnLj&)ZSvG8AXxPg#j~3o9qfqU#`z6QrK65|jz&gsG47*~0 z`b?JBnbDaGu^M#YKx;r6R1xf*$xe@_Mb2{AoXPLtW55^j=X{+*pBTlTiU zu}r9Lz-B&e9NxHRMp$n?s>&-5CWTdosYcldbr#~;l8^O4Et(S_l6L?h{r-hz^7?tD zvJvfi3~EQqhh_7YRvTm3rBfIs3bb_?I*3tjXfrB?UT+mB<|HI+?&0i*v9zwCGY^A} z2Poqad6U_#D(idcBeFX_eDsL4!i-}Qse;|6%csn&h=-w4s-|O)DnR*<%2qLoUd;B_ zOZsk}OrerTWe?AKMi5_ju>Dcl&2PUcO8`$1Tx)m< z*gVG*HRhWAqzR?6Ck>qeTDyUYX2`a7Yh&p786eGdv~vb<7NBD@{kSJgKC!^f_vu@_{)@rg~wH@9=3GfrK$5!ZVJ6IPqP2n z$MfVP!2}s`Z8QQFTkInlGr%$ zdG=HtLq9&PC?(?=G#j9<&&XR%O5xd2`HZ~X9C==Yc=q&Pporx01vZhCSs%_WkYr}% zm`|K_(Lyyljx4-jcFbOk+0kW@yu==)BlOrJY4~k|2%Q~aY_A0?NKv!n#G>jX(ukh; zmu#K1Vlie1Ut$Brx7zGra%uQ%D7lP%wg$P}PluijC71j%g}`BD7(T1sBAQyJsOIf5 zMKynv$?lmfJ|IFL+e)%I`a6fv#cv#H;AuQ!u^N=Ai-As@kzOowR5&&lOzNqAjaJQ( zS=8w{nE=Wf^qd;T$kSb1VUeXq?tmaUa#-DOE2c`L9|1(2<2CdpJz1FZb%QV0LOT~{M{Asfnk~WJ?W!^D`hOo$4D~P z$)9hDn*p9uac#fvUncbW0tarBV4R3Ui%unM-msZ zi&iV(Dsw>D5P5e4&n9KV9cg(F~iu!1+Xw9s}pzRAoaCRfsczyR9VOl`WgUfKj(} zZxw2Map*f73ZD*rpZy7qeHV*T1zphB%nne#(7N3iYm;qEmva0nV7OGD>no)ekl}}| z(>7l#lazzHIxTDZP-+G?*=fjH`KZ!3OIKn8P0g-6Q`zK+g;_fOJ#1C)rKojE+3dPb zwrE!1Yl`YyA*PerVl&2aYhN?#6&fLACEb8jsdUGMC==8j_pS@o9ogVz>W*a>=#ES9 zt-9{GYpW3Tio;oVEP?JAp6g<>HYgjL^U(2GWen$S2~&FvSKiIi(jE(y4q1o`V+#en zwH|H}0U90vcUnR(;9;wf!F$9MyNXh3fm-`utcC6MNP-v67;ny-+l7vS^Ky39#2Urj8tXJg54;IJCZ=sD!@C7DcCX8tYCrYEIIu9T49}ZV4ZE2a+TU%J~Khk%t5S1D(h9b9dtEUQ!#65u^-AyldRU%g^cznK1R2HDD#u7*3_km_NR5U;zK3zSAHn-%pCzWIzd@6>LZAS z0c!P;>~HqERP}lTJ^B&6z1GmKkKiQ)o6AR#VAfFAy|N(5f?eI~6>Mn6UaXe^dU3C8 zQENlr?geYPt32jotd7Xn;1js_1?Z+v;3lisM?kR;1k?LO4#9_(|NigK15j9teKG}9 z)n}h<9b3dE7MTC6h9BK02b!QPQz;wht9`OLU)QA@^O53r>`=L%Dx3`dR2C$z!OjN4 z%A0j4t}@+CrKcf5zy7JrG3#UToQdtrPbJ@I&|-frT`QoONWSPC4yPSoNe{eCS$YgJ z!kDO~vG@Uyh#AHoRAr7uP3DkFEk2X!`j}`*Ew{j$eCc7#tF<)Zuxu0qYaHNGP@j}0 zGu-_d=wS{0{F&SWP~SUX4^Neumzo{~Sp;a}LD|ggoITtBgzfuJ+RQMA%09k2k43~?55Z-$>`ejg`$Lvs+#C3tdf`bmR6$gxcs3eV+`=LaTsHuO2&HZ ztR{a9&0zA!YIM;g!^&=xM+lNufm7{+b!GmSGT$N<^>qX7`qCj4qy$N&&LKrAoes$Y z7>^XGSiLJbBnvI_uu^s$k^}3Tqj3h#BM{M>x_;G-Y?#r2kD6<20qr;@C_I;yX3rn|!Y({G9LYrmC!kR{udY)#r!*MN{A{VK^_tpsTT}6lOP9o|N%mHXBdM zkHG!roq``SWYJSHKirye&>F?`l^bQD=-r%zY*9 zX8h(yIapK(`tl_BYyY3X=mIqPC!5yFlxVVn{{53pYiwW*(pu_iMQc4zJ1l~g3P$~- zr)?I&ZX%rW@o9N!jtTG`7KfN{aR%}KW<`mQf%1qz(YQLz(gD=!k{5$W!Ok$;WRAkR zpK(THP5I%U4xqlkw} zN4s+oVyA#&&&lKj3{TJyVk$V){v2#=6?Ee{InpwO;P865We7RUKUbF@JO^V*e#p6A zfpfjqK{CY75Jn}AkRkjnI5qDJ-c7TA$L?rHdiFQ@66)^zyUYp=kPo}o-zZ)52TVrY z%OCy&yi!~J)EDldnn4{k_Zvw3UUN^-8d~Sf*~!ggA2n~UbJQmsxb(2w+Y37HT0gA2 z>tWaW1>L%ma3U9dp9m!Dic4JLunN-vb!`ZG?hz$c?2K~V{4f&(47S|IKtgO!*C;+_}mO zgO2ESN2pztyLk|ZVAa5fUG)P|?gkgD+5~fRl)HWo=CVSH>0)XkB`O3dE+8d3+TB~( z*Ko?glg+LG08k+`#APE9OnNKb6YXwtY3UXwNC|&XcJzRq3)flkrln2Mju&g9>73!< z8@K+jM~k`y2wUQ+#*@*ClD*h?1WRfeL9L=UB@xO?02ua74&RcJmRTVaaYB z5h^c9cK;JGA?R$1J16=B=F27U=yG{?QlnJ&kGOy-qpq9JtFEl;uA5)EA8tWrxE1X2 z<3$CWILf7_D{hVhtUlOW!OefH>(1A{qs%n-+bF#^&HYDPzCfmg@22GzL>o~S?!}f} zwxLD&xdyfkX=u4bv$DA1NLoUk4EOZhlfi~v#!?ZYHY64eg6h(1dF~YL4*H>#o^#|6-<*E38RZ=7v1c0Ujx`S_}uLP+Zi7-&GIb&{}Q%ExqERI*BUdIu>&t^ z%q~P-L0&hl~<&Mwb&kJYr-sl2{>DZm`wzGs%q}uV{HhkjRI?9q*qLH zP%8893fk4e{W~IJ>}=_tg#H+<+%56g)83t+4W~z1xj7cn>;iX+ss%W!3TN~+WAq&k zH>(iQ&2W34`N1#aXpdp0xg^Gqoi1L8D@b&58=)OQ6Jt7orJJb3BeS#n z|FHM&fmW5({`Z=5tvT1e!U8t1xw_U8b)z77;Uc0j$qS~Z^kix$v%DUI>STG+ZZ0fR zOfx!~ladk@l?oM;+-PLmvI6shg+*n$OHDjdQCWvyn!ca!c;=jIZP*}q^!L7hycv70 z`ON1!#(2gU&v?c&o=y{|6x%B+cI3>Ui)-LMI1`wUj+f31rtCdN=tU+wY$K2HfcXLb z+|E4`c!TpF{h#?X-C2;lVUc znV)}na2glI{p|2Sr#w5~6zn-*$(MR^(G-Rbt0X?qF>eZr9+jOiE7-(iMie~ly*J)t zw$bD#XA585Uz#0U=cQmK_zjdW${>_Xr0%yK5nSr++Yodr7cKjBGST6O7L0>^T?KZv z+0^~Ykpa7*_jh|o2WN`;pFM|uPLJ=O6HHQ+Hz`_DKnZG;i#ErFV}ipKUe7CWv9pY2 z^^Y9?{B7+N#1dc!HwDdw!v}R z@xfVf>+!({5MduXKKSIs`Jz-4bzS~43+}y~py^7){8>dfcKNF;d9`AxS5F9*H6i9u zR}pa!p8yK?h{yaZT1O>5%st-i9-sQxfJ^?mm;7r`P!F$vdr%$l(ltG~XfjnJ3_#wa zZx32M3y`3by%3McQX2JO1KegW{s*ht4e_I=1rtWD;g&Rx%iIdSr{O}=u#*@Me^2mv zvfcEaV1FEFH@qhpKYF_D#}CN%O7@Lp~udu6-{8&Ju^jkG(e-HTiPwO0qxbwk9dN%yV@t_jI8r2}`|3Ej=!u z4hKqVIPLV{)apIVSSwx4DW(}QX0hd1H%cnrQ93bx{PaKpCf+m`i_^vSj?2;^rzbLx#>JTv$pwxPLa1@G8%Tk8k4 zbivAzv8?m+GRB?FI+^nwX9rVcJ9Z7|n9y@)2XY!3c}{S7=Ng-H zEIr&_luW*;1f_f8@17IvJK7GQFcm&j|H}1STGf@#i1Yt$^&kH4!7WhDE8h=B$7AOP zEpgkqoWZ&+9&v84|FG$rA!muPa}89Ne{R_+3GY5P7+1}FWN@f&v-`V<$!PbUSXZMv zuZ?d!H~6rL&0O?~cV5)4?iKl`Sk8{_wR}m%=3(y(?r-SHFd2Qkc+9!Mz7wZ!TTFZN zNjVS-pJh-9Q2#Cd!rWkzw&q30E8`!{4Ngzpx?Rs~Ykv9HdiuI``_XmVk-(?l?;lVL zMFK0i%qZ`6=JOGI_(UL1+`8H9ueKwD%*T5TB%B;L+sZ1ZIiZL6=6S)5oH~2U`-6+Y z>4WbNbn0xy*Mf2J!Vd)I^D``d^15K6J9xH+=?Gx(`RUQAN9hz#e870`|9k-D;O2Pz z2ZOiFNvNv6x6g4GA{GyF+XpmHw+5ANW^X})jq5BD-&w9%A|0RFBt34Q4~PEw2T{{- zEd5~cPPbJ-q%9-NxBf@)DVMT7N%_Tp1actW>qEhG_d!GTq0IMvC^)h#{lvCAlU;0m z>?pTJi(VvMn>7!AD41Aj$mPK-IUUzewqd1KE-&Tu2Rzh~Og#I%;E<-I@R_P=M7-p@ zK)c7cod+B4i61yGI6HNFa9&%OwWwd9;b>lb%!gTCGP^z;n4>g%f+8K}+vX3WDD}h# zeI$7Ie%nphtUOSQ@QKZCc= z{??TVkT?pHtE6Z4EL1^z^ypST>T>V)eB?EJM4+}uPwFFk(D7R8DgU?LwC!y6DhI`O zK($5bA;3QMQ$c6^_K&g*SQmfrqX_PM<9qamefgt77dxJU4aex*00Ug(2VMZB-5qyb z5FC-6sq;y{-~twmcgNRV5WJa9;-@YM4jhqm^vt$#s%04qQLBanW$P~tjwqR@f$-{5 z&yGKRVK8MxGJrE}-+tRdI^Z|%V=R&GjoE8qPlI`ZnI ze8R`=?PDJg#&8fJq3PtvqIT0TR8vj{^*cYF)})wks%ge2tn3+|KvTXizLK{??{@ge z={R+PYu_D6Q|N5pK#m-#4S&lgg7cCIku>muPg(W3xe?1=fBwh;B(XAmnJR6KvUsgaXdtNCW=n+?;e#u%EUr z#wKN>gw)Q7XI&JW-jrlNGyeKT!PKUtr8DDaFA5H0-?$|{wiZ<4IW?1A-8Hno@5EPL z91M#`&JQL~`}GS=GrRb+P}L{q2d%QgTT5cV4$U0LoFDAplr(#0{K)*^9Tqxw$dN?P zeTDxO&pXo2&~@-G-ZtxE_{kczBZurY7YB04{^iBNDvUx`e%g#eU;ng>Lh(bN4n7O% zzWp;nS9(zH;?D%b+xyJd_@>VU7p3fV&Vpb-a^_F`_2B8{D!|*XTulVfp1e&c@0q;8 z5yg9tZ13p9eAg@p&UPK_2M~KI*cGZwdg3rY7h1dPvoc4-y`MF3z4X~YC)y`n!s07S z{LCc~1@@~;f?*KFk1j#Kx@SkQ9;bbmHU&IZoGRT8)vjY9c%!iZOt|4W@xn`klc@2@ zORdotFSXVVS{O_W6Zh3~79#TdAh8X@XjXCj+l9fw!!voZjg#qw%Yv%E;mh&ymj$1p zk`0#yvywd)u6jzHO*iQ0YR)_aFAQwhV!<)-H}U?L!&okekG?#pwmXoOHC z&)XhXLZ{vFaaYPX*!|>{kPS8G7X?dMmn~ZaK_43bc@gG})p78};3{@szWl{NvG?Bg zU%?RHJG}eMtC54=Vfgn4zb7i*yRSiT|GL|Yga7hdS6~KmN4<;j+pY{g8h3mp*dx!H zB0g?M(R+{1yt_;qPJFX4J_Q`cfyx`j4ee~;(*BYu?mIPHh zcsC4Vj){JLuokr0@#ZCn{B`kvE(!KIUdtEUBDXuSTdnn<*^)pkWS6)I)_^5=YH1E)5zS zHPDi9_ud$M ziW;7{G5E;#0S8>syjw>|sA=8s(PhEIl0wdirIh1u3UmPKs+)r3z}HGhAdkNG*iFH4 zV_yCy(#G7=bjBy|9Hl%mvMl3eF#m9kozKhIS%kMdkusK}%z)5u-%)!zu7Oj|lf zEp^6MeG|Tfi_$j(9TI0DG%o)46`9oN`C%|(WT9j$p#=oUmTaKXg^DIF;dSeZ;4GO@ zqKoZBgM$8MPS|OqlWq;(mddLIw+0)LCGWm17(ehXoPBgiS+TuU*OzV!?m8a5a`-J3 z)>{*Ev)sW6&{ew24q!zKtdT;}7#q1qwzCX!#eF+0Gcgw>j*t#ccgNS>9$f3)6;E3k zjFG6q5zbe{Rrk3kK4)cc^0+<%R0^{rtz?Osgjx9Q%HW*<>d-q3|u!coNTQAqU;XR6ASl4~@w}bC^;3(f691h@ScLzTj3|440*MN|C8WZ3B`1OVNLL#9&9qW7oFm+c+$NlGmgDCs1Q!`1NR0WPY=%g z;a--N9JKge@NgoTS3yRJ_rnVPTpiEt3H~tZdpPGO0X!P^C1n*_d(HQmv6tN!46OdB z?!g~KDly(&TFj=+akjL+E57HxV3ZxTM{hEjM8u8Ea;C*hebY0oeD7!n^-9_GA|lu; zegTm$T`ZgIhjz~zn>7)XHj5HoZx-&<S^}{#!!Nl4Nms<5zjKQ4dMKST7A>~ z!Co@4QEYJ@nZa{WUPPCtw-I& z)eo#=rra2}KhVGUT&QyrP6kp9;p9ClOCq7j);c*h5vcoO= z2|8j={O6yfoMa_Xl-cdN^)R{P9t@_vRwj4%gO17l_k+gd?tI9Y+zSt}5xpV)=EJ7^ zJn=B}IUWDBU>N%i_@BuIEhn}$KzO2$$P}>E6TkV9;H06(6}2v==fVI z77uvL*y4GQ8C(4PW5Lnl`agdxcodK?|9K-P{KwDXg#KM#-1`(9>A;Oa*RTeQqc+!5 zNPK8x@R9xmn2?+3MrEfO6@M9QbT(Ebi8Q1C{w0F9C!X-DM)*iG`rxm2MKc-`-}I|s z=)swI(JAR2t4G}3Y%|}~qxi622M-}30L9R_{CE%|CiZ!}Q44zXH^JC85uY0;aQgG( zjrtJZyQttFzcDT7+$Vysrn=HOar=`1@2+^_la0y_1v=viy=>+5#7FevdA2UTt{1L| zNV%0xJlY$~NR^a9zcnQVOn1aD|27yp08K?(N$J%fmEQ%chBqiGsa!My*!(*r)4F)T zQ?{_(>nYPd?t4nB`tB#5(uVv!@v+Y|%Cav$6IA>^Esj?`6MQTcW(WP=gxODip9!-C zbz%0Bc;f1K<+H&rY6=$j=5iEGe0hX@qSPralKPIcSavVMvT%I)=L@AtC1WYgQ)9=wPRvm!mRDFTwGB#SyAIOBBc>+4R-YOo|E~3DUW}y0ZK5Uz|94D%{Cmn<(@sC|_u$Y}<9#-6|DRy^=!}C((h*l|fRrfRLPiVSv;HUOmO75N_e_}8 zl>ZYvJ|dNN>}Nxm$0RErxP3e@4F4-$^N--Pw23q0>WjgfvIS^wp9LtlmC{*))V%0K z(T`sYeoCjm@=~KH+WeAJ%G+KJ_Uj{rX3c|cK^>$0mzRTg_a}rJ5X+iN3dX}PV}SDst(z+R2&AXe;GFKQO`%p?-JLDrHIhuXw;GjgZVhK+F`U#E)`n+#M`{sGyv={e z1tkc&cejTRq?XXSh}z)RTZaz_pD8CIs#hYaxikm2TW)Io2{~({izg+1(yfWtqt+&L7@_#9~6oO z52U)mZsQ-GiyN<4u=7V2NHjNL#Hi0=!N&{^8(8qggTpgEn6Y3w=veUD?OAY7Uy~Vj zgeBkf{exp)yi&92XTT)AYW$ zP#LP{l0s#e(w7!07AN7X$|xnDTNxeyW=Oct;L#QdH;>mZuv$-efS!0*N7#?0!@hE) z8^)TKg+aXQiyh(KgU0gCer|>6W0k^ezcM90y(b(VKiLt6vy0J$qk(7<64sMzTcXR% zG!weZQ08BBUZsVYS;X>S6WjHm+Tz+^f4_w`_8A)PRSU~4ng#7e_D7TQ6iK!ctk?8v zVy=mqnox2GB?qdPU+!X1W{P>lw1BVa?+&FN77U@ex^QUEH2 zc;qRCQN=O=nm>$@<)LBWC6cYCi!vmY20nv4LxeyQ^)u z4nY|;k5`Nrbc3UwClOq zuZ+=ii(eV8=L`(Pyq6S@`hz~ITjn8*Y^B3q7KNtJc{QLEL>a;xPgSf+(D`xcMZie-Gc1$G_A5UU$ zDwoZl1 z@tiU(zeU#4bZRo9)p?>&x`}s=z|fO-;8~M*;8~r=IAv_K^zHb7k>QAe293O+u?P|< z#P1v#?o+dgRA#pdk}3x?a*rp4$R(zuVL(ZF_MM&2h(p%aq_G$Bka%B#qT>lAoIKn@ zLwDwkaGSeK{&wERxF|}zDI`p_!>M+>vQWaAib1Mmvf(Wb7FR}vLx$3iXk$L3S=%Wo z#>b2b52)Sq2KTW~7xBVLyGWnqGqMM)Rdi;MRa}RRtfHm7730p);U2Z-TPueUeNe)q zEKbr?Y1Xs~K^Ch5kuMLuiWx!sU^n5lhTWA3z*mT6iRcA*W|-CIiTy#LPPhS$i8)Wa zoi!$5T#Q$?idlZzNr(8p(cvYi1#`xjTJVW6;r=xzIHl9u96PscD!pz~R`fla%5uO7 z=x!*ZXF`cO8l{NlIx^u9p5#boV{R9TW44y6+fauTlRD@b4A)b=;^D}#P0S;6>M1wJ zbH|3G{A<1(Uph8?^HgKRP^U5CEdmxmLva93T!Bm&bpg%=HyWKq{he~n9^q$eF2=41 zKe3l<>PD;C7PMKLz_}VEbDO8lX`VKf51E!<4T|JHzDiFV;a2Ji&seS}JY$)j@QkH; z!ZQ}>3D3Af&l*f)p?<(L7U&7nn6D>H<0X0`p0QO=c*YBQ!ZWt$3D4N9Cp=@5p71nd zO7OG?^$t&4t0%m~nAG%XXiU5hOL)yt$7^ckY12@#_%M#KF*&8X_ z!9OCBS4#XF$iJcd8^XVlEVFwDyBl{YrNz8l*P&M(ry?kBM2#;Y@~Mkc|J8jM5N~ql zUREmC?8nt55*GeKFkhsfd|RStenxJC?w;j7+x0wWm#6t__0AxBlILokq^xeA3xp}d z@2y3CFIM?YEzHko5fPCTofnzeqFJY3n_IL@@A7L~*mXt09wh4wq#Y*H9rca<^SMMr z(wP%B)p=!lE96lkybDo}C1ldPPqG3GP!Y_^|(QgKcYe9=t{Acs(X_qOochyavEJrpZluQ|_fwiajSKPBbrMA%lYT&M}t z6rn4ni_yl!OD!9D@>1_;wuCtbm?HLpH!s0#QxOW$a$cHeOTzXfDN9N5XE(XLi+L#~ zd9z$}OZCuQYxSJDCH8_i!VvYe!}&A1Sj(HAy{+f1IeXj4Tadl=^2W8gCQU>I3><#q zDB7raQ+v57K4#CbS}V>ieP8?SEK}~+-y}B!!zm_d-CpRNHEu5~YpiX1VMSz3+lvmV zsbyXYv-2W4L!%}V4G5IfY{Rrs)|w<4Ag?v;PG|v67LCerb*5VuqNTQN#gkd#grp7Y ziY8-+`ki0Q@5MG7Ib%rUTt6*t!E+%}QaP44p_CdTk)BXL4xCLjeyr3Dx4KkrBs3hH zfFBfd9s3y;qeQi1#`DhRdPC#zVbm!Rz8dFuFTXWR+!d1A3i2$MaSIX^g4goqHCD03 zuQ893I(oS-zQ?ayezll(hj0fQE~3RSvc$OTMT_b$oV%P$gm4;wdBgiK0XUwecjI^d zjGRbcz-W`m5fjr(Q?*7`X3Lb>g%gahiA_K~OQ2Gnqse-%06RwLjlEwkq5|Rxe_Ct6 zUsMvXqqPCvN<1;J%CQVcBv=JN)dm37Ao^-Mo1U;XYXgXF(<)GFY;`?gQd0tZ55MU_ zHZ3;*eFJ({g=T^QKC6Q3O~vcQS6~-JQU*C<`jTjFif}hDD*A&qU0fR*^&8g4w1Iz8 zCAW(?f&qwYwD-?*wX`KZxAZwSr`YzOO>=Qm3y#tzJgQ?^rM8wn;?IKqSS^)~7w{+M zdP=O#R8=GQl(0?kTwbaSMl7!9vJ!usHd<%RYrIh0uLmB$ylQ%*d1k1s z3w*3y6LU*F5Nm$(kmWM3I!+r4BGKg@gEE~NE?{L#)A^ymh2Ax94?AizlkctK#Rx3j z_ew?YkiI@EG!Z{nXisKZ=eV%89aQ4&)*eCj zx=0?jb#;E4-$n|%E`GEmT>!|Eu+tIXdnX8J1T}#hO}zghtl5LI!u@4DM7M%}s4^vTtfZ0?>Oh{BxF8QTeI$s4`@N(?bcr`c z^g{imD99G2kiaMef1Q>AyZl8FVM<94P}){4QKZQzjftW(n9u!+kg1B@4pnsv&@N;~AwO2)z+@y252dJ;St8Z#}Wzw-()BIKZtjVvxG`#_|U4D;O@gjvLUF)Z? zbr1%|c8Z^_05-I;=<3INa$ULHR0z@_eg*Ft#23_Gw53=FdIs~`{F*4QI5BspC!#Kj z{LwU1m^;WWB~AWf4mU21nPgaCvCa{bRQeP(!%{4;1aMfGl)J+_)LVhWsl&*${6c=) zfzfg;!v=5$H|63aavqv%2J(aeNp~V08uWQQg~6Lc8#iT`GGdtHlI7$Dl=c2l=ab*ZfhSP|k$vZ^Qa=!+KI{U{Et7J{FJL@>H zDfZ3A_Z#akI%U`o!d~7MVN&_(Gt9;hGwTOqEU67+h^jtQjPw*?Y#uZsjA+W)6x(PB zBjk5~2zx0*SgqeFws9vI+X2FM8(K~}VUSP8nPD&)Un2%FbBbBIDQ2=px}MYmg2}KB zEU?u8i}s@5J-l(qu^a;QqJ!UG9i$7HIV2oiZCM*Go5t;p_$#{Nr-oZ=6N~1#Y|AuB zB2`B7T#hlJllJsJl;<*x3PZ}x=>1+LmzN3A?z|7X{Bm`8p~gW$)Xf2?4D^U=7K_nR zB=LY~g8uZm*uFfR9D@Smv}73))iQ0km{`{rS?uVgd7MC7F_F8vcl|A(+RmSPjhCm3|Fsrew;Z?5SJTO_6gGssO%3jp8 zNr$V}`Q^O;PU-v)Q|ADgN}8c{0|Z@x%MVPXo=yCv+?jg{FzThZ1Iy*~Q?$`~KRkO! zk~6{~yeIqz6$>yJM&ZX!H5*zUlofzx0B0$E7f#PL`fzcY0e<7BQ>NwFJdQ>|mQm@W zGf*tr%Hg3oOzq{$R9s!#%GIfU7mq!s*8Fii$0;ILn>fH|9?dgy+&Qk*CMU0CdPLgG zz$oaIGe@eLfZ$jf@GPew zYO~XLDFE9`BKnyF2N7CY>W7s5Nbed=ZYgt7oC+LdwVSoFNJNuO=2V+&Qsvw> z2R1FR9F&_O?dYkxU};7zjegzu-Z?k=S>roW>L-owsNO$leE&}UrATEarMOiKVk@%O zSB7KdAgrJg0Cowu)!Gbsb##g|wc zsZ@w`bWgji!qq`)t#R5bs=KV3f$?vne$9C1rf8a(hqhnmSEqbJPln3QE zOM#w9!Kj_3!0$;x_NOW8)>2fV<4H!wxlljY7;+A2xoANi1bU^-9vM*68o^D6e#Kf$ z1{$eiWY`F}HFPBRLbfdRydqz^P!PkY$ia8*DQWr(+DhAqg5uT;A5NAIWFY-Uf(Q+e<#!mI)f!BLeQ1_z8HOwymMEyBMe~wRPBe81S zr?ZsGE?bxX-s}_i7AoO<{kc$oKIA@WFBB9oHoz|20X#QJdAHO}q-vq2d4jnETv&3i zXhF#~RSbT7lcZ`>Dl>$wg5oIdT-iM(xAk*+JqT0h(Af;NnYSssR3GiPjWr^0w-jcW{P^_V2R;KIuLUp zp?xzv>;Ss8?ZGR+{9l9aDcghh|I^SFonqjUffM&EKN{=ohsH_61m18Y)DGDQYte(f zJqUW424z3o%rjyalHE%E!V8$4OnymeVdv71R-kJ8;sVZm=)^4izih@gT~)H3`EW&} z?QK_a?mo>=5xQ*3EA#cC8~ z(Tfr)?VYY;#Li){Zae^?IH~x>)opfMYSLh{lUW;^-Hwb>z7%WI4cWU;E4)0xZXnNz zxkGC+a!OcBf?RI3;B+ewev>9;NDIz14LjCxB=u-FF|)7wGIt#z24qI=S^708cgUe0 zH!bsXe0~<2O?LV(SMlmQ6|l5IxyFvgBr+bF(-$C_+E%rbL8(+DHMp3TDxEYns+wAw z8dU*aVh!IJG|+AxK-^G{5J=`QBsT<^ci2r*+xQa9BwebdBGuw^AV9(YqAgGKF4qrfWA5#_`@7wlbcl;^@ia zL@Z`Jj;{=g237_DZ%F18QS9`8<;;D$;8p4zwv4b+MUSRPus2Qtt`r(6jK)CrHY`JN>vCr1!Ta*Y|nGE}O6jl;RT zj&^5r`Pk;lW{ZHZJc=}1li{RCbu+16ul7RSA;r;oU0PJqI$vvxw1HQtzlPgQ)`02+ z`MD@j$F=gc4JKAJ9Q?=V*>M#4>BR9e--#To7pGL19ikBf$a}G(@^%*9y0*kl&T3iB z#c8=o)`n=kiv>_^fGC3Xk=$EzvW^J4<8zaySu!hnENEp^u`&+`Wi*c#t^EUemv!)9 zW|f@g{DPQ+L!FfB{)6Str;nn1h9t_bRog`TMzQMkg$}8oEPdFYr9n@3i)2h%u3|RJ z`;QSkona+V&jo2M9dBZWh- zdddWdI1>qVDI@kpg3#xfiY;k#GLRu5!WFH)+QX)j@YsfxUQP?W=`}FUXv{*RTmPJ0BvAitsc7_I%fo=x zT^{p|*q$jJ6LY<6^0VZH6ZYm3PDraTo{SN}ROeKtM((_2#dG`(%uW$|!)<|Z>2gtu zHo_R)(MR6bi%X_E*={Q}hZzY;4grE8vn7g%wgbduOES|A=V)a8bnuX1O_#nTkAqeK zI|8c={Dq3L0HYX$B;zevz%XEvq}dsdnlpGbXE16`;U?s0D6cjWC!y1RX)ImkTut4i zKWYwPpuQlXVe+(ttZ5cLn&?ftrfIX(1ze;ELne^Rh-P6CvICm#hvaPCyo8>D#%7`q z^KGXsjo8v{XPrgOwRWr8c~Pv!1=B;m)hQd<-<6v=HTMIFS$-a3ZtbQ>9FIwwR98I@ z@J!uyl$FNVST9V4pR_Bo5Cwn0n*=k%p>5F{COJyisKk0DXeK+`0;mgAgEI^}CvM85 zHb1N%S&9tKcE~eJG4mnXOPXL3AFI-Ih;$a(p;^WNy+A(yw>>#blI3zvYfjM$mTuG* zs)Rwo*ThpqXND=+E^_ozD^ATOsav8JEQX?`iX5L&qd3c88Am6|FS8nJNQYckJUQZ` zUlKGO3iFJ@YB09%kOkHtMV-LvT~TkCrBAxx=Mls-Y!;HTt@xIA*{xF-yDN zrP(A9qHt!vB0+_{fR|)8nu)Xr=OgAW zsvv3$XucnU>GIby1ZScW>Q=Z<%k0x~`@0k&ZiZ??24P{2$kjFmBNkoIuFXnimw1&E?Q*@~Yb!Tw)nRq< z4f)I5bB>Mj;$`o-R2~Z^{`!laTr{+F3>#0lk+up7uH(Qov=e4&DQiD?VdLK3bI8O zx^h>S#IodLnfoF?EBeU}0}hk;`RS*8Cvkdoz|zi`{aj2c?%d*pWr2nNT_}ZVFtcV@ zd2pgTb|h+MEm2hwA0v~9%;Lq3KyA;4j;Ih&rFpH;6BZ@7imjN-D161-+>6d-R3gTC zQD=}vusIKEtq;Kg`bV>j*3NOcx%7lVab*dh03BQw4N8!NL2X&dK@rk0s4givC_8^q zPE*Kbg>sM#iUKTwsHpG92UouOS2NE=6^nQpRRAVb_nNQCHlIYvgfb5pS0`C;#^o5d zK1ys9qE&4A`>@>%7|x3te|VNNb1OL=1uST@2?t|SepE0+2$&F>R@adyJc2y)-4r6h zUWTjI@|bpuwS)iocHXG+($2h5Me71-4_y>G(SeT0+}5TR0Fax6l@?A?+dKf^Qoh4NFN~>fK^vqRP26>0w-e1@%8^2&K|WfFQp7gKED75AkRyAHLa}?yECT7Pj*89 zx2=BYp?tJ?v}v;}dLchoZu?@>ijtT7d^-DChK`%$xV#?gi(Wdah}+)er3?%;PKud% zh3^xp&^4}5{HL8GcCR`3rk5TMiM+}E?hW|e>we>WJk{UGZ_$~|#X1{8kAdFC9+KGA zu%yH*6_`1Tv-~3fVPZ_~@+U+63`2KL7xh35(=qE>^C0*^3ov4x;eg(o^H%7o9~_F&nsp zhTp5?9rxS@K+mnu>LXouozArLXfz2p=3rhDTG{AcMHjnriH9Q_-79#{G;zFVqGgQ< zOX@G0na=)%&%kDNSt!sDcz@c4G9%}P0==Xd6G5~X!aX6o_*@{en z*JLtE*DVl>f$v2US4GTsZ3`zj|wEe2D~H^&qp&7 zIUiNh>5{x3P@1&Govx1B-YM>4jU+Y#h`o)=l&P0PkjxmHIa4XgFF1;tAbS@NV{L8a z@ow)NT35x1WXP4<;#*JT;2lRDRhv*PD-(tME*{XzI87G|TqtGTrUYyDsCYgEe7`0T z!0ypAAq`yXjh^|7(?9EpSt8>H2}&$sB!2H}ifkmCv0{nf^)-2Q)oEkCZi0e1FlJ~+ z)#_uxj;)7DZ^W(QYI%cNgMu}$6`PE|oE%8_G<_OR-#A&JuZ~SIXG_zpM+wX2;`wNP zO;N4AikG*}QkmyE%B-%mz!}T7!t`e`7!T!H`<%y8t{@JSt76SLzuL+Qskz*G%qU#= znxn$MjHj!OBul45XeG?Bd@U*BU}R>KJ%{gpcMeJ z<&5xR1p#oj0}HWP@X=rFv*ck73GAF&(2P^<`SBcu8v!z~n z6bK#_edDoj1jn`y;a89Me#+yXH$-$)s!YtVtZ@p-`x1Raa2KB~Pb}|+PZM&xRf@a< zA30)bm0Jd{H~{YF&*EG!D*!-Wb9?E{YVfh#vF$^Fc3aZmP;#xcT$QHAM$I2^KcZYB z^>9w81T>EQ!|f4@NLVUa%U*duOus?~@JaU*fI2g5qq(_xQLRk};2<3ip&7u4z@)j- z>Q<&arlZL6m|U3#eHo3}t#;MXz-hGLGPK^ege9_`$C=rqQ=>)k`>Q~QDpeGYv6LH| zm8;3LKavFFrHBL0LJ6T`RdA9@jH~1XFUgQSmBTXqd+KKaF< zx%Cy44$w1;P|_D<&J-(#2Fdp_`a9h!MumCGKY<=$MbA|g(Gz$LQja>-qY?F*oF{R$ zMsP(8B7@2k%AM+x91)=xT-ekvmc-_p5V!a*@jQxR9_PYEz3Fk!& z^L7?dXS~Xu{HyBq-0CpEX7CXGf(%Bu;yM=JmM0G!8#)u9v{8r6VGL%E?2 zPkSEOKCrdCC*_6$l#%L&?303N=!mF8FvU|WK^8sN?v9|}u#u2ptK-P_gW(k@tRNQc zh{Ne%3roj5R`9tB%$E%b`A&IJiKJXrLG7A^ug?026yna@fZGQfXC&G_=o&y7hxDSX z{kdvDQP^;wqVm9@D3~51OoKob9S9@nz=DiZu@J&}2z*G~FIJ?cfEML`lB7WtNj`{z zt&bcnm&H3;G%!>?=MF2L3wRfJhNW=~i~Byc&0t$1oNDd^Zk&p(YwWKuD)vT_?GQ>_ zO${o!*sG3YOe41`Ins@3oQ-K51xE@|U;&pQ!C|07lO3rRss<+WeJHu+|A{ z2i75-V2yx2>3lyBY-~T@li6kS-DX$Ad{1T<^POOmn(sEb4ubn^Gu>;i!+by3Pv-mZ zhWS2R0Be}1OB2X6d!nkMy9j)$MYDcEo;5i*yn}nv{h|8dXl8P$&Q(r zFga<$?A6<39_-~{>ckru?b6;vdvLTe4?KmX5Ah~jG}=Uo2RdvM59c{1eP@Bk>wbg+ z(6gCk$rbv6qR-ksSKc3^L-M{@PrTul=s5}FMDo5&&pj|+=!rw=isXHzo)uP7dJ-K0 zdzrnj;TdUnNen`O2GmXgc)u(d{O-Y+eIc39rp&clnf4Nc-m5%H2$SM7q0-dq!w$%u%VR@^XNWIIX@q?9p|(O*+?s-|3;?z}NC^DawQ^dyYZB6a&1YJC7wqwz8~ zYrMKJxQyvXzu0A9z0j|d z)aFOy;zhSKjX1)9ru?Qhg+0v*|1d;~rkL@h56 z{QSr9nP-F(Yi>zFLiEVxJycVAm`w?`rtZiaT(KBw!4LT((MI$GIiz$ZDUZz_37#4la@3S>T8kNVRxOFF8ebof3 z=ha~6_6@#nuu_BD!pebazleoS^qDK@fbA1OWGG0biW_PpjuL?{hOF*e^r-gXBsY=<7hk2Q z5~glf(GhPTrqo`7sToG`BI^dKu4C#fjrrVH!&F26g{kX5P5+@|)?cp%?`=x1)yTE0 zhNE;}pt&jB7ie`h1QR7r0lrP}V|Z87#GE3^;ndPZbS3G$W{1=xCksP}GCA6P#)Qn9 z#0Im*4t^EN3}FHcLb8IXZ%4x5POhM*f*k6gVyl+5!Q7}Sb`qjnHdI52dDtVYH7^SA zhH>4=O5uC{&(CDGH>okv#gKTyoK%}aFQ`+7nu?y&#o0scV5xR5t=(^|or2=h$yn&! z4KL&lrGGj0IM80g(nAG#Sxj*5Bwdvjf0p}Cc8+n?=7jIiamJ(#4NM-=5yYoQOB_9R zQw=O30kN}zUzJLxaJxsYF#4zPZ{M4?`7V(bM!&j=?;KA+c!A``@&ruc`&0T(d3=EM zXIyEYhD<_(yxbKMlVOxg-#4?pS#NTjr^(a>Oy%R)5O9~p>Zo%xDdqeWpOl*@Q=kn| zst!X0EE185fJ|nDZok#ZVW+mkuMou!i?;fJlu`MR#ToPW(c@sw`QP);)|XaA|!uJEj(|wJJ)v zWnss-55Cu6xDmch9(qt|QWR<=ovD*ZH9m=K(rPF$FKQ9K^`RAfTZ8pdbo`r_W;;j( zn1sx}MM8pqE458^CdTwZVl1mp?*_cIJBb);E)QhAjTML9Cnh#}V+sJ^=e`up59u;h zh^bZwGAOmBL6Z^2tPIc{4YW~aQ%JFCv_x7Qlyg+HSVA~jEZw;Xfw;rwIvh>&+o(lI zKbnlLQ{E=>a#~%2I^g7WKbcX$$b3s$@l53*@2q+K^QLafTZ3C8AJ4B;7thaj!yJil@YFDT7c`2dAC$h%vQRV7vequNgMWatN8eEm zquvynM62!xRSvE9qR6Q>>9G#>Tl&pSe~B8E@S};jH8O;vA~1tZA%K3Gs%%J6h46%d zglTHuF+B37nF*<)zi7%1-gbhkT)D}W6mPJS3fQ9Dume+D$r^d8Xtx z#h4EF1B?V8QZ}O>@jfvJB63!WxtI3JsNLT#+VpM{Jnc?0!KD^fxfETq8&{!Z z?-KnUCdKqNx)ko1ZS~pBRCTl4A+I{vVftvI8G?~Mvl>QVvpN^uybvrY2D>@#m2Pds zJcx&7A5zXm-%_q(xnmohXIJJ;HJLY5Jl=mg;H0Do6kZB};#m%xa`US-Pl8RABw>~k zm?}G)aEz+Ygu{5oWNDl|Hl3I~Svzx8trDbZY&RRo$6Sbh3^F6E^*Z+JXqTg@{OFHw zDE6CCu=vIr;~S3srgo2{z3s@T<&i-=6E0?ry3spDEf*0lB!L17H&2286Hi{tA_K5IDkFi)K|kX-YF1G$l=sL_12= zCTwh4e*yDUQL;PZP^wC!uNt*?^=MO`iu0morwbLM7HHjcG3j2eM#R>lOETFg6Lz$i z_e>R{&{hAj_egKdRi~|})|`GK#YRI}o+t$7F2VM2P?17ll&sGy0=7hQ=rGKRNH%5; zjRZ$(gwZqt2qjh!=DgM53K}#?rVTXcE-F@^ zdd9=Bxg~;Cy+MCzX<)UAERDWlVs*6>t75v`Ciht*H6;9pB>2y7B(d83g!cwf!cEEX zNo8YGy`r&8*K@7a+v4*Twkf6En@Wp5_s3q%5-d(sHQt$U*FHS5=J+BD!i2qUr$14i z1*2oH%_)0TyktSFIb*NQVy|g66qpyaJNDYl-QEd5td}Cl;#!2q_*^ZgB~cUFarCey z*gNH;0ozoUuvgsI8>=H@1AC=A343+IK9}grVgz;QF^M+?gf0YXPjmls4)~g{lXl}7 zEGCGSWOuh2$3^BPc6DRu1Va%t94rQ=uwXZm4UL433@QWbB1%SFMuXBSM{}c@#Pk5? zMa`~p&?Le=fTcN`d^F7l?)#&*d6j|Ca8t5>NF;6btHpJqxuFw%5CSY5F{h{zF*7Ax zAJ~cRrw@~;TU*9WjG%2^b)an-<3lSswG{5pmX_3au1sg&A%mW>byu_dFkwTNu&K0eMLoCd_+rjyXfb{Mut&z z`A&<@?5D#^RkU4Pg^efvuJKC5(c2NQ`s??ts)0zaoZBniwtGb%P*FC+aSzy8(VFWw z*3R_EjZ<2U^d$unb0?;)%=#zq>>ROzHl%$+J$ zZq;1oz!wE;R+24p%iWqVHoi4hLy37&NsLV&2EmE8DFtKO$au%Q6An!%dC?}`6SYy+ zt*E#D-6}~si6mq`z?NLc61%5zh~Z_;=-nh%+D*ssfDaMqV3~}nzFy3s>7z^ntDJ7f zMhpa!XmsaP3@We*&eu^gCmB<-6$EJ~R+HO(9iKz0je{4oXde|B!IBh_cK;>dln_hK zuz6ygw~B$S*T>;-BX+*3Y9;xO_9K7OGK`GJXuQ|>RyGMwk80xt)xO9jj8%r*0V#6v z8sV5_BUTFK0V#5GQeMU-Fsvgt1D`0Nf81&j3vx%M$Q{)Pbyp1JKFioLT?xn?obWkVFW{RA3nvjnnc>ln z1ZqRrKw34bHo-+>DIi7b^vTJL0BgU2#%VygXdS`qkay8MK<87EnvwkzIm3|AJDF6+ld6MD3AUrhKGoQHm452s+!Z6FR}*u`V=-ve z+pKhopr<0lr7)NbAB^RsGC*!O?~gj?*=D*ZZ&$$2A~*v-{nl&+J=tuvxpGQnSbdU? ztxr1E$TM;RAMOpuv6`}Bvp7tEHvq}r7k=#?xdx|z8DJl4=`^)zuV__`!*;s`I+bRT zf0&hhLB)D#XLzT7!aMyF-f^5rkkn9Nt#6In!r5oav(<0FomXu!Jw<0HAz>K0t(#Cv z*bO;COUz_bj96{EroU08EZ$X;s0z*6 zuit*+^j}GhO{BiHeEQNJDID8dR&vRxHMU@Lp}SZzU}%?x#NJ6pkP z*;FwjyK0n?-3$p?bBZY)eWflxEojR1yeIP3N+tcEB*05_CVi03lvSs9)0xt7WQ#W5_fmNaqKk%urCBEvr;oyB`;4?yYD>jvWT&3|Y z!_8WMI+D`yeV+=4SfSLYotfR${6soqLX`1go2x?{DH>}1s+DjP``heAaUk8KsCJ@W z1HcvDgzgGWbr56SG6O2i$N?D`C#s7OiR~r<7i^#Y3SbNty)OY4UYFXrU{9c}za0#` z_36C>&7ov6_g^zU^#!iAC1(zGrvWZ*H*}L*v(6IK;U_yoJl)+S?9yFBJQ`Jss-za7 z!I(`WxSG_EfcdfCSjeQTqtcTO|xCY^F z;8$TNF0|th;#>$m<5*B5)reVY4Z;W%~F_ysf2 zCOm6D3x$zzhMLX!Z5Mwk_nJ0=Tb<$4!yT`I!DtG>5}Tr%U{B-IwIAyLt(V|L(!j6U zGQO#`-T>?W?(;4AxFmbQsXmzarWiMp*Nf9TfL*Hy9j8pRjU%u61V?pT11zV>uOKA6qI@42(0JoigOP@n zQKrA6(}gTSvwaUMey~DHKujnYVi7t8$)D|fp4=8+;#`EjRDNf|$rFWA>a-PRu1i~S zoy#{#pX_8cLEDx(Ak!x~M$(@?xiH=4Nmy1i-!X2vrc7j~L~bl59h3B4OE>qHR^LSV z{8Z3M#zehIB#ec9SSNm&cte|!_=Q5%Q%+9#!&mUDR!k;BNp9hI2Q**{CFyl!=TZ`i zNYF)pSk#k?#`CfXAL5hM4lz4&JPAC88m&{~d{Z0`o?Gi_RK&SbVxCZ?O7TS;tlM74 z=Qr_5=ZhzfUJ(r&O{}g zm^T!cj;7vFY2-5VhDxhfAS>dCr;yOH=DVKLwZ8)oB7BCO#+sUAhzzI3rGe&K4roAb z?oNR(`i?lXo}6HCZaT`#M=}5sMM}}pWW{i>qt@&3xOXaqr)UsM&|@R)R3a({u|ftVNLt!1Uv6Ch6Hr1YZ|i zASXxlaZCh@QI*qaFO*ER*NOi*fg(yg46TfsaRAvazH{=rreg}qsACJ(F%Io6)NdD& zz`numvLmw0X|ao@1TM}=s_F(v-Skx8TyGuS$R3!|p3YaM>bW`3P1QU(cTcP}bIwQg zQhZ$<09SBbJ2g#cfT#8D_9z4si32+k&n~)wh2;z&0luKri&k?6I~qcm3}%xeBx@Eo z^oaY0U5|9`#Py`tcRkru^XUp*+TvFZ5rHv}IB#C&CxM>ux>M*Q1%v0{M{<-|bV&0A zkyos8*Nmewl^*B9n6QusPHr}qp~&&&a`HBYQ>Lc7Szc~~03&^JOa7+W3Bh2rOCh*M zS9wfE)>{JcpLX3uhYD4{MsV}pJ#eQDj^)~W;@08 zDRIbCOT>DuTYu7DtxpplgG_cIp~ZgS#xm8~OSIlmS*{2FgY&3gEA{9_+#5L_5i$?)E%ifW63iXk_Bclq4G52ohOXqC9m+&#O z;hWssmc{qjsIM(j9jia78KEi|uWolYV|u4R2~%$2kfWPeX``+K+)`0mk6$F2NLGRhd);1%{x*+#91uuHxyjwOB<+w^hTdynh=; zxLQY4lH1jgj`D*U5f#o)E+)Y2Wxr^1D~zuYaS3O}>)aiU#*f?ujdYACSWcR2o)BP2 zjBtx?X%s{3b6X>o)z%Zy6Ga^zp9?$vxvij~pj`xQMbV5zuqYJb&q9@EQ2X$vhK*7!sC}#x#o7 zwiEw5O|-jbiG-KF>y}!27;y<^nnrYqcC8caxH`lwA;3aFsye8KKq+ep2KR+og1hAw z4xUz|nX$T^JDzJL$AwXr6P61LHjjJi86k_aUH)b-RN9hdqe+XKt1qG$?x^KwsB0_s z!I8(r20zXR_-=yltpEx+W&}T^r@7Q)dFx7(CuGTtdN8scF^_M5-ucc$sV<-?4w%Ug z4xJ}{_t;0Tjpr^6zc3LzqHm%naW%G{&>|`){}Hy!DV2Gx&(K)8COh8y`tTr*HU8W6 zb`ARHuMa1VpKftsM`r5uP))R9oVRy9=I(1*cS}DmTy^~?hs1xsKHSqA9gn;rJg{lg zjXjWF=?C$NH-vkW_=y|B@f=dI60))7C+3J3!bopj{L4{YT)g;pFj~ZES-MUqyIG|?!6^k==H?!TOPh+ua&pZL?v4EQ^0X^fbX9l z;n`fxm+n>#xQtV(Cw^*qcx#)bDEzEamV7;Y8+B~{dU&||Knr~MUOe?1;hcjU)s~(O z*c3p+DQI)C5WQ@)Oe#FvBhhsE&wqgq6id&>cYGt9ykEUwyRTc;`xMc_wh(0n+P)cf zf``4n8D2Ez-hw|%ON-Th^doTM>S2+|D6_T}Q)zZbkTJ3QW8;Jh1QZ=iM574((%ZuQsqT^6D7+><u z-)^8^e|tE!-gXn9AG|XB58D3p%J3~sOFs`-3#BvT4|a#0@#dA`u${oD$-!uRJm(IA zUvJxOmfr@hBHjMX9pPbg^u9a7gPIcDoYVc%9pMbGDZ$G*@!@xJ{OjBCX?KR@PDX*R zx|L5@S?L^b-x5=1M11?5VMki-OeJ;3Pu&@I7QkjL{_|>Hhp%G3pB*2xDtz}h8x^5IQ!W1fUE$&m z`o~ms{YyZ0jzIRd(9MYW2i**KUF@w6$Ij3kZ-cK5VKwX~t8VccfhUK18^~LyJRXf3 z5FaF09*#XtjlFYqcsSK8UL8im8|PX^hNU&}met|Jlhj5#^$a5*rmJT+TBKakAhob7 z=dljNu0Z=AxjQ`4yC=T;?$^5s;!z|`%)BS8_z!+1e$PGOb+*tP@9ssBZm(Mu-DqB? zu~BEzE+bV`rwVbMTnmbYRV)((OXFVfo$$9w^n&=)Yr0Jf9?C>DNRXd&WvCFK3h|l`El0|!oSv82C1F#q4y&P?u}2pA55Oz zed+ySrGXi({GlX5AF~9Q8;mqrkKK3l`y$GlF<|!luc@p=-_Pn>2`r3ZWdFH zC}E~m*&x34qwowU>Gi18R5`2kb3YD0o(}t*xNU8C0H`{AZFn=p`jdykadGpyZ~)A$ zb6vRqFk^0KiMN@9!np}+J9S++32t-6x^T?NyE$5se0{jum(Js8fsWc5ZNZF707=Kb zu6ZD=`s)_Q;~oglr>QSL5MDNXA+%2D7p%w8<6qNHmZ*?>_aQ$CFZ0e+M~VQmT{}ij zU*fF|a&d3Xyx{!I)?-t+O79|CFy zt_g)Te!Cx!UKj2QruKf==KQxFwmJXI!{Nk<)60sf)tPDe!vug4#O87h+lByxnCzzf zn;vPL@)tZ3o^gCO<)x$9l;5=dlxI>lPI=hDsGJ4DZ+;uCi-A1nyirS=;_>Ul!^b_V z(=O4i4}3ot?H@hP!<4gVvrAa=6D7o#uSeg0E`DZx_`ZQ_uK9u1pGTq97o*kJ#P5ET z5kDO-e3YsFO#H~B;Y@$!HF5h-!v$@t$!a@15h-8&X?W=9X9{i2tG^o(&%#N^Jd3|q6Pn(ubX&aeRR*@| zXJOZDb;os6W7D!OS9a#F*4F(z54T)8w22)dVN4OlCgw2mpXc7lT6!)XyCMAWn1(oX zW-=%+g`q6W=Y+P5Z`}}%s%P;*J0^nsk?rDovaplonGNCb19c=kJ=5*8iTD3axQK7x`%U;Qf1?-w$G%M?yldmnKf%)XEAbsqgdgDJ9#4kvAn`w+ z4EIRZPir|Oh~-2`Ug42i(NA8cwvLkNGYH(b)09PkH`4QLfGF8ghG zaJ>SIIRYRQL*G#5@jHD!{?%_ADMlR1Q4HPC=1qYtgMSyET(3n8&W#W>;FF{g#+Upq zoLbF*fFIWRRYIyN9~Xnt-4H%0;(OwE;YapNx|>8eVA3`8n{MeXo_DFY$B^H#YSh#$ zJ(>QvC;r}3;lTs4mN+^CUcINo8AoMl^DCou=ez4!w&D4 z-5-56Jjp{UJhUmCHhhDVD#nO5aMUBx-K{XjQP071Hgr#YF8rrIcK!nDu0#tzcV8l9 zl7y|7DWUs>&EbPy`_hZaG&)-FS*6AM{xLk;`&sv*KZd9HLw*KpmgOERukq)w^t1TI zE#cAQB=I4hTs05z@B<4(-Mr7K3;?h$KIhNjLA4&$UWt~`lf(*fE5`YJ#g{lqKCbHf zvB1Yd_VNDoW14%zwh2#foA5%K0A@P>68`%!&qJMIv|;moHVWf64YuWk-!MD_GCEpz=J;gECfGx)2>@Uyc8U{ zrehJlT+}wlS-nprK^RwvHa=nb`&E4CU&Ap|h$>Fe&b~!odbOgT|7$oRDcaPx=&CDT zrPW{mH9V@e=JPwx zY<$7#U8hY-&k-Y3M#)OSFG&u*>0d-R=w6Z!FaJFpG2v(I-RM1TuKvv!2VL=&HuxEel9L;4fh%MGgC8@`M#FM-R!gc@D?A*^|Sb0Tf@_s?DuR9 zFYwxvysIs5eE2`Yk#AiJPsm0{rWrc&%}RtF+3F|`7JMnr={a_8RKui6uxzE&y^zo$xKbQ5oXe_7vrJ-4EGLy z3bTgqM*j>y;EjoI|7Uojdkl+5z8uaOHAee;$+a0BiU`9l61_KC{M5_g_`xYH5?~cq zHYo}5>X*aGBds9Ezf^uSgJ$GuIscXLt$QrZ`oqqR`r}vyeg*Q(_?0>|EdJ~(VaG1z z+`o|OwXkDTG}3;7DN|e!H)7;T*I#-i?CMg!y%1@(=Ox`G7hQ4neJ)@CS0rEMewNmK z`?%t7eShsW-IMagv%LXpuYt|;|0`mlq5FnHamX;wi|-m){H?bsUOcM!3GWwi$LQjw z$-iDqHpD~FE-qi@)E1qo5cZdY^^XSaVcBjsY>KuhUlB1fVNCH|e(&P=vN6T!@BIeH zmO(lNRJbXs*M{^|lvl1m;>O5%)L$)@TR#jdfk;}TMXGIdwAH%D5P^VmeJi#OkV>$E z@8J9!ab;|=!z;v7#}@bS{O*&+7XRdVTjHb2#V2^|RVn_{+tR&fwb)5&_sl(u1B(9o z>*M40EiUpG-O&BSzQy+yrvFvS4f8fyx#Yea^Yu^3ZVnX5Pi+NBvr{TqMYiyV*)!Rt8)EIfbqh4oN<_x$Ddb+^3#M+I$M@OjeeW zG)_BI@z(E?ru`;pqi-7ZwP81EEZbwtWg=Op4Kq)gpt*+eFQxjy;?VUhk=z6akhMN8 zO|bTQ4&D;jT&rcpZok!tJocIjzJ_w8e!5+IBb#sSr@?L7tL?(*Uq^6n2eq05e)#G= z-Gz?sIwd%M0^g9Y;cgSncB62EXdv8Isk2Vbwb!rtzN2s2HHg~yUDn+O@Gds7Q&?#H zJ83?@Yopk%i8_E^1-{~c#tL_P^nJ^{R#v-*yi}-5W)Q!oC3B1@5sc@~>~DyZ*K-gGl7x&MJL9!JU$N)?R<|FB6WhBUxq*Zd2#0 z%D>_+Q^GFu{KnbzYVz-mR!p{&e{ZC+)sLcEWAT&KFIMo-(wza5du_MO?4 z$<@zz8*#4z_mzLUPHem0(Vf@XNB-@4rMsT-X!0w0`B^8_$w581^UsvX90Q`vqGg z3H`4K*yP{tO_|p+V|KVSeKq;l7Z!crc37$4w*6G=7f##Bzt^KuOiR1UgcyIHp1zT^ z-k&(yM*h9=l+bs$Y!AQw(tmeQxXbcycPedMQTHA1c9Z$F$-mc6E8Io-_xg;!FDy)h zLjJw3%g^2I=q|~>-K}(2gi}&y?f=!$m#*zs{`JMv8#wy^t^ISC+3Yr4wm!gDUH`p4 z9I?Kt!po|mGr4{614_1Nkm>y1<}Eczb)R!$aX`!H#dcIG*`lZx{vYDr1Wu~rY9H=< zdwTj-&kWN81Iz~W4BN0NAiHcA6*VqMj3&lCYD_?1m+bLP1|w0TL@}a86cr*WBAQW& zgNp1bC@KmnD(I*vC`3U~fuMZPbE@v`+ryx!dH)~t`_Z+YI(6!tQ>RYVtunGByHMD2 znsP?+ws;>ZpPKyi4sOljJS6wgc%ujS4Er4j{0A8TfUG1AV56Wu^CwANj(mKhhFuqK z*l>#nJ55qerza(UsgE8TFVa)aNtTddc~AtO*2$hv%I+7{q}W70{^GdICTI=89oUr& z3iHMu!7m;Z&XX;cB(_@x0d58H`wQ$;B}^J0j>c!XNH+;Xxv|Ao(!2QlHFk7NIl1j9 z0K;u7yupCnI0?Z#26r`_c5ZTs+4I7;Gi(uCN7z3!_%dRHJccL1d=xP_T70;NkKJ+B zAcc4kPJ-A6Mi4lW1T1TVwg6MH$Awfs)-e62$w%Wd^Ozk)87S_5VNh65HWUF4f8jPG z_rTE=GyY*Jk3OOy;ec$A)oiz2jyFD2!k<(khcSDXn^2L2 zYPL492T%5t*2qv69E02d1r9Puoni%V6*?7l_~2<<(fFD?9IpVgrN0EvgJ)PDL6R`$ z&$tVQ5e9NUT(5hPR!tJs7_ zJo$+46Xmd?RH?^aHQ%PU`4c1xQL;$jKtvI@LQQmrL~)OwiPqz7ohp3IIc4^e<0yE% z!zA113CJzx1|$;0ew(dOJW`ItY|pTP$w!tUm_Q!D^$QmyOM93uVgIug@*o*mEV+5g z3%nt9205L+Fj;D7z}?_B$b%}tHyjpI>IXg^4e_iD(x?W?$nik}_e|x$4?hMpiR4e5 z&?iChrPjG3FM3&zQ^Uob+Jxmu$%)M3C) z!5CR?vZG^1jN=jx6qO>!r5TdvP#ovp&>1^E|8Gbhv?dhClx*}_h{RWtoMjD}<91fc z;Pdhr&imEZV;~TLL{s7rFs95nHitQ8e2wd$z?&*5@*oaHKju%Uewfv4QKO1b9C_Q4 zR7cueI>k663LL6m^lQxk5KNlw}@?{n9k-qlgWSh!*f!Qo7deOznaAjp+5b&YJ^^KP#Ypw1UQ^U;IIOO6_xSP~$C8mS{A!j`>W*h~!#USP$ z+^>P+jj&#Llba;)D#}LIhnAA!>=VCYN6nZRDJhg#eHW_$4$>P&T$+5|F&Ye$DYZOp z9%%_eW=l!}zF`MoV{=IYfwM50jv?~;c&?cbe+lVBz3t+Y>Zj#dJ4;tNMN)BkSR z`}^c2Zc1{&{pqdx_kT!sFJ#$W??e33OjngG+0Cv#ys>a%`= zmB-K*k}Y)cq@*@F61;7+HFUm6Fy+mtTISGP5v;kd&a!COtT`km3klw$1`8%y4blu0 znHns(>~bjtjdO84LT6fPIQTEg1y0=+&=aCqp+j+2^>SsOU}T0#g*~G3@B;#9E6bE6d|>Q!AP2{!;Mt69ubTR z5v>ooUB)r)H%1czHbp}b1~Ev{=)k&^F#3g9fkim}7EzENy$M>B5ybK*V8c28NDj-( zq2@F^~oY# z|3I?J-S)VC?t$cZQx>pTHW<)I+3gRa?COQO_@SUIx)Le7i)EL(^^5fP=OxciO3M@D zdhxvEgx(T?2_oVJ9R+$A)Fn-FVXI)2OzP(i7ym2S#t}=Tgyu|iCN?F};?PL|mr z02*SZ2GFx(3WblAYJsq0G?i?Ni^{-|HWj@#mM2z2K^lnMf`6t(X@rJfFTgD=~M*3a(a6eDg`0^oy<0LI1jBdVHSsd z&lm4DeY#m;B%fN*0tvWQ3}*}Uh^{fNWo^$vO|qdKS{oCCHE5%bjABJXR7sElAW;zj zDNw2<((Ifd^rr~W5Wxso3Sk#JcE>HwSk%WsmCou!*6wX$4A%)Q9Lsk5DX1K9D|s!3^gac z6xpp5N>Y~5C`nm_*!k?V%92^eCVc}PIh@=`eZ&eD7@A`ds||n{{{l%cbPXg(w|pu& z$8DUh7e1BzWF$LcOn-g^N6VhWAhxGiQpUcgy@IF8ske+pg{ub9I93FD`wHWS7auO> z4o=G!2>Cc}6Cex*DFMRDcIm*i2A2*3nsUdFCYd03fLCOp!lvvzV9TODKI3L8UW4b7 z$*xH_XcCM7j)3IigwUJf6M=@WnNh$}l)Xlfqrv{#RNF-vO{8)kBGNl5Gugy2M1#1~ zsblHK_uDN{S;yez1c?J7sy&N5AF#CDqwQh$E0}Fblaq=I;DTg3>zdh@)0xl$TO0I) z$*?*Bt%x1$I!=(_q+sWS)*pe%CJI#)cT4OpO3WHVhQ^=;VWF>Ogu$>S5s?!T>B?u4 zuNbWbUk^y+PkB68cacd29<6DsCs;`IBGXnc%qfZtp?buzK^B-3y#eWe6!JSVvh znB}JDWbZGx*(%K@0*&Tc56adV9E0fp^BDHazk44o_FvQ0X8YzhoBB->8xDRhxg|fG z{itZOdJpp@)GRmHY+4{mMoB|7U73zJ(`6Sipoxe|I9sqBg*=?nP!^LI?ID{+7p;hB z1Td#i?juD3(*+#N4-}ECQg-dCH70hbMHg}a1R-efa7cRAG^0+*!op=V5UT)mL+6*1 zmpIhp(_Tsb(7igYx4)9?)m6f8Z19)^vbLKcxk7Vnvt zxR4oBQivV(A&hypZB!X&P;&t&t00*rEdI>1IF|uqqF9JV_~oXctJ}V2Fk(TN9mIfB zrVx^Nrf}6>h@vHCDbTjGiwXa+j-?$LFvN~Tb^y)d#XL(jrdoQrnI5z;r4c3*U0}f* zBnXH>5CjAig6KZ4Cwn^A>N8$XR&=?R6QN-Z+GMoX3e!lW;x@_{R>3ZP+v~})I+9EN z!YP&$gfwLIJc49ZJHr{W(>4mG17RK7D(n?##5f=TE~{B!BqJ+WV0Pw0TH7pOavKpB zJ4GM6K3RU^R|4U@33vo-CstXP0~4}6?LS}wjHDEKO=f02e|_>-qu4)dQWItFP>0Ah zkFsrotqDkd(FS81;k1nC2{Z@(CN#vqDKw(PVM6~!jU;697Ay&s+gcQ*e3BQIc7SWw zfWA$J(2|;|g17GRMzXW0Sa@Us)eIJ(VI1XTh@lm@LlU41DZUVHQ<(GwmjRZzXaUj) zBOC{&0EdqE?l1vkCg(>$C5Z!=u`oxQ!hm9rwV=xYOw$y+LO@1tiGzhq1q~6BJR97l zTfdpSkjlb(ipix?g2!CwDMpsL^+9l<-NIC$K`F8Y$TAiSjwr5^Bi_s=Fa((jV=_o3 z64EgkvDmuWqMgQMr88N#YfM(uO(vVek`nEWLr_3~dKF_O|B<M1cvmiUSBM3+L%?VlL&3vkEKnz8 zWDJ{;U}0km8m+@rcLf*J%hn)s>i%yf#Y%RBx}XLFDFC%}#AJbDR@qSy<3877RvnT# zaA5)xtZp_l2OUjRynsQyjcG=_Ns>VLR$+3SP}@C^j3k++0rZM0fYnU{rf-s98epF= zXxRqX7w|3z!IMbzXABSR|_C&}c1;<4o*$|2+}12&gK zN52@N`kl9vUFxnE1|nT$TqsS(G5|A~c^o+@3_5!S-x+F3GNU+!AsPdl)j={B&Ml~W zG4hxprB#p|>;XR-Xlc8+mK*MPcqYGL(mTmh9kC4T&=Y^L1x)3bR2Fk5NT4?2+>*=T zhPOD$kjJHmlv6|deK;IsLkDo^MEDBpoPc^52jD zE+fw7rD=|av}1Li)izAVZO#F;nPQnTOKnThm|#asiCwkT zElbO~7oe%(4H5I}xnL@p4EfD{1XK}-HwtAlQN5*S_#DNVY{lxzuFLuN>s(#Dhq)lr9l zaM6dEODN~`eK7$96S+o5B@UFxl3bB);LG=*iPAZ3!UOP{tS`75$F(U&pO z8@42WA>sk!E4^KxvNd_Lvt94ln!N3Jo?x-{Wm9%3&-J)?7YAp#8e=aaX|`pa>)zWB1+k6g~KpWS_blK@^Ov*iv|nBPXhIqnX@jTB0)BU_2vqF~&^O zG|ENOwEFmfeG@s)G%ZNo479^WbcY?ui$XVqlDR3BX`ks}x(p^%_Qszu4P@Y^gxxyA zVB&@&Of)S)8taf1Lb(y2GB{TTv2&)qfeQ}e;90M89imF6`PKlEbr{2MjxJOo4|5&T zF%;JCEO;3e-Wr#g2W$oWVOtkt)o9ZU{+PA#G)a&K?Aq`zTdPiJ-xjiA-P0&ih(&GN zY!OjSt#Yb~#tTcd!qn3$j1dL<%>w%730fuSu-Q>5#WhlbGSKs2eBhC4>@vw3$85@U z3A1xIy+mz>jqnV1wh<5ub9n}O&yIqO3}^iEY#JIY%Er)5ZUq+E-9uE!&t!0RHsE$j zan@naqCgU&R2HJg64~7iQv#zDIOdHa$Ssh~<5q?c0-qm&N^-(4gxm!Jn+moWfOaYV z>~@-zEsbDCsm$WUl3A>C^Ev`*d)!|gFia;9zC)%i%R!ke7lRz-*%(mZQS>Z_=Z-}| z4&m6SM%l3=>mhCgGGs_AdXn_%K7-r@ zR559y=fgCRF==g(WUZ@D`%m)H2oh8pP*+*%052$sG%Uv~9{>};Y>5HSvVsC-vKpWe zN4PD$fdg4LnZ}|o3F@?Fpf!Tl&58WFD#}&Z(Y87IvJ6dI?m*G5G`qr*wK)Tcw{ioZ z=wwIuDBA~65$^=a?hxUuF8BflbBpasJm3PgDXp)%YBpH;}@q%50Pf?k0L=-FQ+YdG6dG_%tuwQx2@h89L_XRre6 zQTb(KAtQd79BT|)@p_n(5SU?LSXp-kxd`^4Bmj(TnIaFwhL;RHSc<`+uSN8qnVDLH z!N>wQ<4H35kpLBX3d1JwU|xyk+ZMlM>aqYHC#!tW zk_iG2QyNxYCIN`Z{9y_cSm<=(@q++$uq~A$66y>Lu1C4VViCZQ6E>zaAy`)r+)3hs@R0R>E6iD z*dTD_Iew-BOB(*RfS1LRYZ$Vklr_VGAXDMB2vS>_AXPm48{EgN;Jb|5=u7iL$Z)!T6B|Kw1_XmL!Nm;^DS{L-M&i+$jzK zPWrDXB!TNBVB=q%d_cLmkir-?AkkhJ{i@b;3;ma3b*97rC1~FiSjMSKH%I9IGjy7) zjcS}9nuCnge_$Km0Sm~wm20D%1ZwS^1nU2s1WpzhO9MmSm*@S#OfK??jVr5?1US=v z+2x9MH{Li~0t$p06>=w%BDjL3kz^By15f|K4P;8trr~Bqb z7_A7g3V^U9RNvVIOb@(pHB4a7c;+HVfKbB8Vv!V`3ULb(I5EHtLagnlcU0G=G?Ll7 z;JTCl>mVlA=9}a9h@mq2FX98u8HF3(hVykD{jbso-cgGLZ)5o{_RfCaNTMDX+~78X zED`~i>=#79>-#NmU@aTD;@PL@czid$`{uypHk|#?3SRyLM(x`Y1qb!NTGqaKmt=0dQs5h)mZN{0BhY~=QZwWcBqG7D zV1#}3Z=~M04BD^Q_dhZbWrgwoR&14>!N6nR3WBM&kN*9y&a)BJn($qq!oF7jMnFV@ zUooOz#Rw4ymPZdv|3>OXf?qq%k+RJP3o_8Z|26&6d>daaRA&6Y6$9DZ8TQZS&Eu1s z`ZfADQuw>ifz453zxp>KqY)(jt3mdNr$P^ig8xVO)L|v`f6jstsx=+O@1}phI}1kj z@7G%1k$yBE{N@n$(ZAmugz!&uyiLApPO_t{^ey#o^ME6%2Rbs}SpR-Y`b1F6f$(+q zZ=_x%m;<6Y5=Y8Lf=!tpQ`G_K-~ZNR-&E6}8{&UBAO#fZM?jOpl=7_J3+Ae_nWAX2*S+=4^;Nac9jtj*7T$!oT(o*v@7@C zi1P+OVG`M@3hsMg5xB)QZUEfg;I;RXNypXc&fX~php&X;bO)a;O&(E%x3=gJnKO1kT6^O?ubvk0yVq^@cZntdOrP;*cRfK;b#Br(NKe;q#$<;4T~v zc#iqNYd3GMdq-T4{g=ZRdslYzYVcz3)^6VA&K>%Hx_cE!{7ZL9oZHDgFSH8eTEv!+x2<^m}@8Pw!CYJ-wo*w*zmIKiQr+0gyKThe=ka|QKQy0)_p$dphsea$V1kGFyjoGO*ug~(9Mu!>@3%NR z8SRNbKzj1{L0)y;O)K%lU@SH;#?IsUz$wu* z4kLW3KBPo{Ht&)VTz&e%US-`gQJ_HL$!Hu%ER4p1#KX}zkhnh@2NHKhZ0`UkzeU*j3N-kaUhT5@ilJSr<3jmyU% zFn->U7>O!eJmXmkpHBAi`uCW?f#Cak!b99DzsrfVaMIoL|oh&+GI1cmvQ1 z#jt>|W2P1TcptA_*TpE~D}N<_n6;LHjgn}9Y(qG`N;`eM)0}(s8GXG<{QSPJ_dERT z=<6MXpN@xkKf}-DLnQXtA>R2+?B^}V&*pyKG5G1%-y4me%ldmK;Ad5TuP1(X$xlO< z0RUFC_-Qm;)dWJt5MbXJLWRmRWdOL=J(vIeEd4~HunphU4Dl zeto3Z#wpsm9;vF9PyyzSPrm1M8om0CB{6(h_%F7)o41;``Pi}Z`fc<0qFehsmKnY{6M%oVbk zUc|{c;X`Y94C9&v?2Lh>b>jqFn03{$-k%(I@vFMvc(3b_se}|uFN_zsBi)g}ZLb3u zN9NV}f^Ued!L=G?tJwqKtS>m;JNnGce_LkWbFFtk+igK?He-#i+P7Y75y2fTn}awN z^B^eJXnf>&e`hp~hm8FRuj$e;-UEH=UjdR;{&f5ZfBLJK&;uuNilMFa~*kBKIYGsK#8jlIsqg7zCPjvFH^S?6bIou#h^hgSSJKKEdYB) z3|H~sszwJlJE8yS$K#>_`SLc_>U^IVcY6A(P<()kT{_Ah?yEwJ1KggdzP;u`2}sk)dJw?~p;K^RtxiLYZ_?@vwm?O&Ww<-K&iNyE^1H?L z-DADp&X$ICW4-Pj@I-t35~!Lj4FfOn26iZ#@VX4ZJje$0<>N~pS0o_hCc{7P15}ttb&KT1q#)S6wJ8e(~EVt>%B3~;)dT{@BQ9!mgpUS z^X@MI1Q&#Z?p&hpyTLn2mrV7lhE97MP>RyeamN|`#(^W0!UQxM>FGrYe?IfKy(N+K z;zTu+fQ)Y@R`6qe=4DRnI+#Vqh!_n?bNpqEs1TXn%-r^rq#Dqx5KcdzD2T#(JI}!> zAX=H#P?lk%xhHohj-DTX(891^6oW>DOp_%WIU7v$^W#He$KuE16Xvl|nStP-*eF_c2o6F9 zo`~-)6?&sWMnXn>FdKv97|k>v?Tyn`5%B%+GfUb-J@fE#%wK8{$p9J}m1+YB9w9>G zIe`Sicm-Kr0H$pd0-Lg5VCNnXG?<1CsfKs%$6+0jJ(Jrqo9k&sJ3}8CJNry*Ufd>)cI52N1aybr-kQ%GFde4-_2AG4Q`u``|}V> z&r1NLl?%sT&H^}Q;ctE?l854k#h+s~mn^y2Wj6c8pmtqu{??c+Fo6a5!P!Iv!lwOB zHhVp@$xXI;dSQ+*u67)FT10^2Mt~qCAO{X@P$f_KfVJ7>7!F&Bocp&h4JS_7VSE;c z7+Xbm(TM4k>;HpgsFQQEO{ZLcjsej$+u-c_4=|f=_C{;h#VyHQe@T<->=Vb369^vP z{sp>Z`ob#!jdH;Fpi5AO{==IAyfhfaw2&$8Kh0Dgo0L&phge8TGfbO1uml#%{yH;^ zO$hk|(Q3y*VPGAGX1-pZt#3plP4rm{;O{pe!!LxTug{#{YV4Wt}Ny_w~b zEQh0MpnqgSkVOpP!GVBre!EG*Nl3snf|82SW(HyL1_Jbb2GEL! zk1g34=P7(>lwPlw-Q=B^BoB6kS=ml|CzT^Y%fcPy4s<)AnMEM|Q2y#`wAa^}qZewg zebvfDHI%*Uj~tKQB=|tN<4@WGI5bapYOL)y>B?ykn@xJ?G_OmGaA8}>CBD9Rn%B<% za7nB>PU_`xy}x!VqkgQ~0IH^g!EgLG6VZ-y2~c*c9YbvAQj}W#Z~fdfuNJ<9&!>6q zovpgf-@Tf4K||o~a0M;&f+uN<#{2PQMa7{5C=Sc+_kZ^~I$n83KyX6Y?@ z?JZval$fG|sBSggtL}U=7ZyCzdJ6+nfH7>|d>W?<7+%jVJgiTdj@8#n{Xe&PhtQa{ z3vLKQT(nXa^9f;>E#}z-3p*adUL~+2&1SPqv&cGytP1{*)#RD+j_K?E?&b5ibvzx8 z(5<&()$|SMn7Pe6?*EtWWY8VosfIQe=|h)v=63JsHlPGps30AqI3r8C_qwjT-5c90 zhu+~b!ctR~5z&$Q;&!jE+xW5WGsEkbzv2^&-b_7yhBpjf9^Ny<>%EUGz{Y_!#yOuX z^4Scpueem;X(Kc1LuPtoTN_V~Bw)x*+0FXzGrh`GmVNZXnce{Fjxlxj&h)N#UeVY8 z!}|?HUfls({}uf}r&LFM)*aqC`LnNpa-XGF-r-$&Tsw4IXaX}7O3a^j?^01=_{MK# zqM#6DAyJ(4`b2>e8l{&f3d&8gs7g~k4`yzOqfficsUB260rN`4;tm~3^CScM1NQv1 zJs?o-B&B~n%gY=zZ!ef%`H%C5HromY)=8qNxe?*?szfy>m9(zB%Nsa))(o`RiY_b& z9p*Vk%NPaG9RGPn2QUhm6(f*#>(rS`G4h4RqAWwgOSED3*aXm}j&8Wq zt7%!klU#zer&;;A{>ysHonCFx9D{|KMD+LW^g6WMbGHF2MWML;SM+6fdIvWty6!IT z(7Ffb0553hL}5PBe4NoDMxo0cKiem8NwiPW#iv=g{2O->vj?qZ+AITf?Nv^f{<+;X zQ^(fX0NxtF8HFG3vnAvJlmrJj2<_Bw-0cl<*M6oeW_yE6cWy^jZp z7KRGvq>7dO;rDp8Kg!mLVOE9-KnBHsIR4AE5auZ?t%BJQ&E<1G3nwD5b17{~Y${aC z^jlbMT%{}Y@_W24L#X4S*6~d=W-R04_hQ0asR!Q+FW^dj z_Prq3O8w`1F+r`o;q)JuA+q6KuMd8T=VA)qqkGTwIv{q!T(32Lemd7X2YLeS)Y1;6 zaHVfR`+nwznJZfBPv&~<-5c_BtNSoHuhc{D^Eybk;`G4bcr|;e$KU6TI%&sk?AXDs^cKke`rDy1=vF`!TtvHXGURIi6{aE=U3KsGeozkd%v>qX{n2p2+AS7+ z(f!_``(*Q&wn1#!{a&AerX8%giC8HH#vq2fAYkYDrX3(AR?p{9D}I8kdzQYnm(!`` z>MxDx#*OI4{a5wb|AZ|&Ax~fNPw$8_!m2iFU{Hk9D!#>a($jV0KfPXAoed`tcK}?O z*3J3JExLQXH!RS@+`YP_-m7i7WB(04Tkj2OH4EyCx+Fo9t_qI4R~>!f`A%m&>;bPO z(Hi>zMtPyW^Z~CXxflZp#jHQ-?R3zOKH#Mb9^uf!h3vpR_|gO3@O@Ckz=Hef4Ab*U7gXTE8W5( z(mBI4bTHlvOXAxWx*7dgS7(Iti2hGkhrnxUo#R=Xu1=QJm(@BW+$;0+1rK|Fbsp2Z zANG2XK&W49>L1(S4J&;l4@@Q6Zv=lNx(>a7jlIKtvGTwtBu-5H8D#?1G6oAlmH zU!<=_0>tF8`QF(WgLaR2kA(7?s69BvwJ#|+OG!R_|^X0iJ+9Yh$k?i z$|mUEk9no~*+;!2f`ZeV7BmSg*bkt`KJN9^fBB_TL~Pt(fM@>FX{X0L>!$R}k9p;7 zX5NEwN~bp^pr9Q80UOha1zvA&31fxnO?ub@uhM&#u_R(=Ay)A>#)?so8<{eFtYu0o zmxRT8LNZUaMtz$roCw+OH;gGRZa zk?*&_^cVMA2r9{Jc7@F@mh9qewti{3H(Q#T@PuvZ_8_n@2y6%fdxAjalL1~q;FKr5 z*=L357^>v^<*j^QlMblhIsC^7xi3h(lLM-(Caw(#LkdwokS`z+7mk}1(2KIL7lOP}$oPqEokgKRu*Ah>S~5}@yuKZ`LU?%VS7 z!fcu|YZ;r%e&I$K6Pu;4ea3rxNY0piA9g_;GhzyM6#nKdM6Ekm3l}|%F2dm>+vkLE z@tjp&C*h43R(Tydhk)A3@KE389alt$Tb|I#)M@>!*FowG3<9SFfy#scOc5@aFoL!`l8JA}@ zFBe(l7Z_NlyyWewwD_4M4k(9kJqz5SFMQb>5VXI_)Tw{jyApHgz*oFOxK6s@74H|V z_B_c}F{#q>blX-a(afWZjC{suahIAlN-Pg_Utd9oL7h^Ln;gi`4zqgv}~7 zx3VU#1qf>{L(Q!7tV}$8U##0 zRd1T}j6Ui$Z%o_GPoV2jWwVY6cj^0I!*`y~V}5)g2<&(bDuOAMuY0xa5QtG1;4lg( z5a;os+DUhFYnw&RdfgjUm0JYowTk@ouY(c`U-v2m+Uu`-)e_kIx`p3mz1L4tPG9e} zt;mH^h^x&;)u17^a_xHWunxKTEpQ3c-MD_IP1w-3^x0vo?6OO`5FSZ$? zJ4~AF{iavmgti^VWeOs+J?~AgYyJuuSpBy*y`BM2PclRM%$r`P@6T^K?z1J65`jKNpC85uXhjeUs;&#GVnvvhN<1Fit>d4fcgznzJ>Eny?b8&u8PBKE32^$dK7&Jfh;a}f@OU2Rmz2kMP3u|>WYkr*iiyYH& z{0`&%nUj~sYGbhhqQlC@`8OlpEjW`1?fJK896pMxqwzn5kpM4v73kUTNP@=nn2laB zb@W*qy_@svcf(vFRnrsA&|CV2zHHg#4Q(a+99WW@4G#(EA)CExTZR;OsufHj z9$I~Evo|B0yg(bKO?uxuW$?RXjFIDUbS!>C4L2ikWUN~p{hqpIecW`J?1XDM;C$;A zANdE9lYUoMeBiY&2SsH4S&Rb6&SbO4et^S&8})@B;5=cKzWD>3!K>0|Z}lqlhabQr zSEXOu;{{|9Gh=0q6Ugt`Bt9)$nVWIm3ea}iHLZQH${4YNbL`8uczLBl4j{UX52 za@x9}M4+0uPj}eI-W5fG4`d2K=rtdEJ<5Zj1eL{MmIv8!CLNzarN9JR9x8Yjxcx-mync1y~wA3FG!lgl<1M`!=18(jO^U)q8FN zXPuz!8jZF?`#55Tt9GB#H9KU;j{el^mcng3^h@NYm+8w)^2{Ax*MqL1&t)ynDoQQd zP`k`kiI<(9Ec7}E_YGJ?iIRDk_L-oS52>#k=95h@N zjW54m|KT(EOJH?A@EMr$NxkkfuO{RRqjR+PxpyS&(-S`T22s~s{khk9)O0czY)`+Q zx^?m2Kwvp@=lJc6$XWwYdeyvzxczhQaDW}K)9cV3qULmqdnce5_>F;E%@$gQ&UDLL z%eAmh-A=Dpr;S&e@pjF42mWV>G5KWiUpd}-^-k~FurEA$10KI%mv<_-`mEhvYrSEY z*T1}72B)q{xe0*ZbPZmp8;7fR$XGpg!`miB%OMWG-|clg-Ln0HzY`PilW!AN1qlJ$ zC(X10ZxN@tgg*-fI9CaOc0z)2OJ@+mlrWdoXX@R%y{?@?p%6VLUgXFzec8NTp^x~F zmuY1;^`H-kiP={8?SH(3x%KM`2U4!cJ`Vh++?L?vXbzGX|2>x%;wE=OdEueNi2pvU z5ct)buMqmx*EmkRl7>V^4oF5=)ne}N@xCv6(;3`(jHMJgnlI2KFulUrU^nMOj7_(~ z8JH){4-k`84rX2@nekr(<2d#t_&=*-4=48hOUwYL| zNpZ`UUVo4R$JeN=EIqI>3aJ!^i+1h!{Uhn+An92oeJt##$Stm$b8!v94c@oY`+?^) zfu|?!^^R|WktFss&Z&?$?)84?th{lk>fR|}CD;O7WXHo%$%bRtT1Ay zg6Xbm&pBWLezUttVm`PvIL87tiaAgYDSYm#E>Q37`E`6|=0@f(d8PipQnVu7}Ae#90> zCpHq^@jK-XqRe{H1sXZ&z=pA9!OeM2UalCOo>U#375eg|stjjg|F!HmWfyjKo>-iO zF}+f|o*EHQWfsVP;C#&e)TUI)nFROcs;H><63%8A+M$e^jJS=(JG? zw?BhqD{^5VJ(yCxPlYbQzBA7Z;d00z5Lh@6mIy_{IqLE}*D)slK6Xh?XNMK2%BEA` zPYcx1`(O__p&uB7x1vBDlMhsIvQTd?Ql+|Ap(^>B?(8w$`AMPbLOUbbv=<@X(Lj{Z zX$SpxOt}7{l(W+v1Z_=Iw)nr`iX-IKNoo&ipCgrJOwQong zkn_8y)d?q=j_z;XSzz(DwmUVP>FE9{tda_PRod`Y#PWd|g0t~PaA=)ygWIeRLV2Q# z09WXS%Lb!=_9IkZYs%_NN)!(tU0BX5tCs1s43sHOUzyEsqJY^kdBuUe{0 z+(~(Qb4&GuVmXE}30pfrHjTt%T7l9F^#!fe1=#+7wUrv}UX`b-OLL2=G!ju1wnuuQ zzOz*Q4uw0kRzEEic<=(jLRqY@Z>?@JDeweJ${}skVJP~WHfn&$Sb+mRahxi6q>UQY zJ~+pafS)2(El2MX{xlx0!|92Hezc!zKP(<|9S|DnazqB{EX<<}k)lPIROp9v>4)S9 z(N#>_w6ecyr>}3TPD39*Y^y4Hp2Y90y6M;Zt4cklOqD7N_wqblH$au?iDfG7UXiDV z4N!xX#l_@R>QBm42>{I z)<3FHKL8Q#t59umz~;h1>JYuNLczywdbC$pSE^%B;KE8Z0Y4vBstXLUrodtEg04TU zQYRpzp-T1R;fy?g9jNH07v<^O+o?9XMLWe)%4fGzLy0-k`U1-r+o_T4ZfSdUFe)G3 zUY%i}?&K>)fO>y>^j6_;15o}R5C#46V%H9&NwKD-9g{bD__ zMvXIg;C@o+_U;;WjY(NyQNF&TIvPb^@2CdZ3_}Rrp%buMsZZ>rE(6NXcT&UK?#9M- zVH?i=Q(e`tL+=e3+m9UyW``B(;1DEs zibsQCT|YM)3q*LnVFVaH9#N~hD_a8ezO)wIU8s-iqssH#GzNKGAD9K7*Q#=)mUL6? zfW^Vx)R_jooeo}(!ojecyQ$+!>6Pvl-{w^FEFWo-L?8dtP1WKkS*Pw8iAVIg-Bnir znA}~RZN|S;yFFAJaB_JMF!W-5SP#_$I(rtWy?S~Nbvg3d_YAmq1)3%I-qcgL zcT>-RdpRD$z0dao_YUtR+_#H11h=qje~@H2Ok`8 zZ=hNJe6Vourw2#5_nO|qy^DGa_crzh_ukFn5bkZ;N4OW%6#W2N3ikq&8vRlq;ocp6 zz`eG{UR~Q4^14$0vac}iyuRvZhR~BNZncM~X(k0<_6WAC4pB#dI4%1%qX!4;zxGq9 zKpSk*xA#+rWn&-oQ#=y~MfN+8CBnR-!wzn$zIqIZsIS}EMUMgs)z%Z$b2OLDHJYnX zaT2vtmA+_TRDbOqs7@+3B69H&I6Vjnxg;VWP-s60@D*KFqqhuF-O=4PgYmOl`-8z< zEA_a+suDj}4#oiQ){hJZMq#2mL@g{aP4oua=lMJ1U+_sCgB)AVBfzr)lJuz$laRasm~lu!EJuc15wVssy&UUeSTc_Y<8&~)fX^|N8Sanuku(GPIviJNPHThHI*0C#RY zyF8u*W6z$fg|6`zOaZ@4;>p#wMk;Y)xAq}^^YszF>XbF(&1r_;`06M$w%AuyT+hCN z&j#wmacUja(7W;Gk1}xWX?HIcOoSCFj$fOwpOc!b68MUPDsVtLy<%yIK4Sa{gE#CGY9r*gP!_}CUbN@kW8+&SW*kmvmZ|L=h ztAnd?Jf%?FUGgQGzp81mH^XAMX9Qj`Q*2|?Vy}h8Qjua4?`YDfDK-F&Di*`Gb|WCt z4@p0)e1*Y%V}4puAJ)Zz8Y0}N`;1nDi7+<(Lrm6&#caQ_nBcSNu-L>|&0<1m@;QNR zbXxPph_HNv2ZUb>5#~lXH!y77=>O#(3f6|>z z(0@yR|0p$p`LI-7e@4^%w^B27)2lPZ7idujG{{c!*F5!3NupvTk-=&!lxKp8Q#PHur(y7C%~}yuBbrQJ>i~O z_bACx?62ex-Deoq)eJXNL!?81nvIx7mP_YU-L}7~l$c1>3AATZ{?&KY;g{dGqS?*Z z`D(UViczHQUs<;Zbq}B_MGIAfZ^3V7onrqU{?G^FjjQwLF|wThvHSEYGtBNs$n~s| zvRXnA2Nqo3GlRbeYeubXQMR~EKpbdHU7C@f)grHyte zOf&kCjn)=o&)4nWMtu&M3TVa$^)yLmsUgzrG7phXX{$73dSS&W?=)a9sU5mCoh_S2kSIwh^*6`$5^@7tr zCyh2)PJ;f|iE3SwdN=<7wsLNoe(NOlPv;?h{mJUE(5RGk?uv%DPgdtU&Mf`CAHi~) zr5B$D|L?Uw!m@UjKI;^O7evAzM8ajKWXp_}a0AL8?mBl8M(ZS0D9(Xw(MwKMBk~*3 zGaMYwKTSPi^2gTDaFwG5@Ej%mt?aWL)@N+J#PlJjtHXiyZ%>CEzf#XT9m|iEddKPN zq)w|JB3*e;05-ZhVVLTL)o2qzd96b(T7!Bk{TO;Cqn{bk!q%ihZkD`s|;oLHN1( zr|P8i9#F~0>j~ir=)FHxt=kw%z$~FvORI4TjImn1`f{hW9&x@Z?`^(-wHA-lm=pa-N_PO<>^VRLZt@dZC3b-BdGxZo^&d(**{^zQ?XbR}<_5Cc3@R{zc_zh#9t=2b>Qw3^S9!!25V9C4T z`PJ=EVAVL)2R~nqQ#*?$G)N1ZO$+f0)P@u4kwn$g-3Z=mHag4*o}O=VpAx?%O#5t{ zQ-FWxBPRd(m@)sZw-PzK!AfMqZ!T0d$CN_r@r!Ysh{D^!1cYqHS4(i13xedKgp;_oCIqy-`sf(0!3$SO8tD$fh1%#L^Pzw=iA;)0+nJe^{kE)I( zd!7Q`D1qZ-*zk;{Ki7R9Qx|u1Vg<8#cEcQKiSs~9M%Zi}`w4W@YxNV4!Q1|-e)lm| z(`&6k&Ua{^gR=a>9_K6JDBK%QzrbLeI)>*Qa6d!81sIccp8--LeWx|?H!zxqXo2~# zdn+2k$%Q$3(gM}qU-A4>o}>i;I>-1uwH$zZD1oURpI75J1CPb!;fpIN$|%0ctpxV~ z#s(Z<(Puv{d&%l?Rh!8JWR~Zy1kbo2;>p1!nkKy8VC>^y=au@3$KmN~=0?e<0VIJ_ zDg~?bW#^<8VS*icZtAp(c0$H#Ozk|MoS}CbwjL1JqI)e;E8QtK=$(sHzvSGTmf>o+ zoAe=zRiET+MrPln$1heB-T61^?Tb|#xBe!rmZ)BbZp@Rr@j!g`xhC$ra?1-`5vT<| zA1ySVA4IrE8ux#DNsXJ{s4rQf+7;QXBe5v}n71rZ{SSICPY!1N_7Z=_)MYVT6o$js zL;~Q@fCC#Q{_9`XIBbY`eYr#pC}DHF@eH3_A%y?*^-ERxA$|^cWJnPvN(hH`7&aB_ znF<_G@sg4$H?UUoYO#(|LnM`=S+P{zTQ z<7%)Ca;ZI?gsUGZc1~^=^w#Atl-{HN3Ae@&WBv!q@HmZBz&HHk!B44U zDJEAvrEYS;d>vM(p@qVxH8`~A&z`E!Ux7&qIoBYk8>^#}#}&ohk&qElP!uj1964F? zGhQ14fZJB6RRp|nWkmjVtyHHs5B8MxAQl$_WUN@9b4-2zz(y zDm6}Y$Fu4|#vgw+(%YTSs_K%UapxGQz61ri`*Z5&qZfl{8Qh71uPc0pK|sTn{&K|R zKhhKnIsCatlcP!TEaQPu!D6pIr)uj~1p~loCF2}dNkzg$eyTy&CL!+aK$1*{Akhbl z3r`rr3`kD3CH=Vw3C)>2kCEBkAw>mucrGi$!h;%``P6(fsn4u8X9 zYZ+N#bNCw;ThGX9o5SC**hWUynVdQagyps}tI=f1Z&1$P9L?Fm2vgX-ZPCacMwr5! zozcj|8>)5vDL_ z9wW2sY;1NkYXKwmHiy4Hvsr05BlB&9zhSXej4ZY}{0)n(Wn_iT;cr-M{f*1&Fh(|u zzhSwJjI6Uc{0)n3Wu(#O@HZ^BgOSZPhreO5J&bI#Is6Ta)lDRS@3dL`4a-et&IJ6& zj`KGxHkFY{Hiy4qvFVIVu{rz=i_KzWn$6*_DV6~21vlxs7gg)x8POt;^*dfvJ>3;I z=@(v9eUlVP$fZuLQ57zPx62wen7?PQQN7E}WW_tVU`@c+gDXa5h;Pz!))*M;)~N0x ztleB}(qO9vUbtysMnnff+2>_axQg^^Bz)Rbeb`!c#=-C9aXBBEQ=%G>RzmKaqF1j~ zzbm$r9xrT(Lv`vOy#xbqqyGI%YGhjggf}LURjvl0e&Hn;SC~ECe@P8&LsJGCDuI*Z z>>J^ca@$`~J-T|vbb->VhNjEl9tIqz^^1>#Dx*d>h7L6Eq?c9KLMl~r+!AO!_Ocq; z#lo^PktL%;GSb)&3;EX(mnK95zQw3dwEt{3WVT zFMLI{=*;fO#Ft4NSA=y0k!rSgw~^j(I7Q~Ps0~PZH<`&6u2VB`k=mKBs(R;LoqkRI z8b4RPrUtaV@0q3W>(bpN9;`>v=-WO=Xa8`ylhnU`U3ISBjoY4k#b~85R9?3c%D~NOh{1{kl%js);oh6GRZh?UI+#6W;oD}aU3nvE) zC&!k7`w`hmI3hh{Zo_9hW?8j9SXQAV_kZZ0Hfi`+4wrJm{O2AE5Ly>8pu<;+^gYfu3_go}As~=gfP97W-TNSCo>d#qF5KLBI6;{U`z^3|9 z8`SVYli6>68<6d0{W|Gpvy{Mz?9CWNcw`oCfJ0}cj=uq)$9z5F4b|G6_r5;)4RzuV z8sAt7a^vnOd;%%E86@CHq|AGtkcWcASS25Yg!w=+gOM>8O&u;F(uC_*C=3f|C;;g% z-cXfYRs#U;v2y)4(Zfj}ATkaA$)`Rb@dD;z3q=oq6K921>XYA8y+=Kipee!|zIZt# zf3fo8lF&)7#bGFV9Izu_R1Gt>SFEra&upLsww7N2Vf;8t=@oCPQTg*;L_`13=|JuL(Q&J0$uEZnb8^f$v zrodk=v4#sas^c7Y;_Ldcch$)JS)f9CjdtEsT~pKE#7HRIhqp=heNX)+e=Fk1`{#S= zu(DMWW-AKn8RupF^^($%+N54|3GR*e)%c;?-ewh3EQVs3d)~1rejIDGiLWok;WI2N z$lP(PIQ@Fmu#Nut19ebIV+aAaRTZFuUjBjlrSpXzyhZ&PKZ~}gYx1WE(1sJX;shSs zzVqK|Y|T{Z3flH(Aln}XQx{*l`HhThV}*ws%05)zb3oj4K2k&TCqIj{f9N|uQZ;$p z>DR-z!TFY_w|}H^-+V}KlQR{Ax51CtO!gJq)NKXJG2lEqjne~q(Z{NTK4!bB>?a@f zdfYg7uxh4J9II9+Q;JX9;G#ejdK&S~Qag>%&91(AyE?*M_o9AlyBgGy5GWN2bx_>j zijvr`Q1EslYHm&#`mw60&Vjchgm(*MrVw!JpVhzlSPgUW3%DKis~^LQH%EW=vHD+U zy8gu{>M&-_{{)Bk=jhKrQD>G+w>2S+Jq>{Kcc>9V0)*HXTwZLjqDKYJ6DNWd@28Uv z`*W$sd8VRqhw7V)XSUzX;Cbn%Y6RR*0i3Y0og@K1#)vegU-=XVB;q>r8IBcAUZaP7 zhGU>}blqpF8>4eRQ$r7u8~1Py3{r?mNzivK`UXQNiU?6lKgTj?#q;=ZP_^zVt|3xe zoG~@=&^3fK+yW7}hVvTCuN3x}KhY-Rkr5_CQlRf{&?9!MHYem^ z$`&^p+$eM(F&6j*?J)wWK{x6~ASCm>F($BPSjhy=^&t497X;lqcdH{kab(6Z!R^?s zP9GU~q5(fKFmAplz|jS9T?C&G(b&MpsWhW$R?wMA+yQ#_3;O#1sFSlWKl+dA+io^m z%YJlc30*LTHZM*`4Bw;52WFcHK8B;gO2-%%-GDql2S!0FlculTqpFf5xIg&@{Qw|U zt^=`QdBGvXkXT+a0QgV8yGM1e+a{3GQ00asg~6b}fW~#iBsa}vc+Cv$0mKeUULC$q zmN7_|0IB>;ez!PGwZb4DAhC6B2Nv9qLIG^}=iu=x07P6>4kzOmszdAbui|nKkdD2B z#lv8FWy2F+s3CFZp@*H+XvcXE7G86u0~P8}VaKZ0%sEA)$Mm=yVP)D&$;>lcx5f!d>xH zht{iM-&iac*dVa%m6!UtlRv!?#n&`UPoyq(+OFP!26zcG_-hJgTz>|q-G>`GCR2wy z`E#YHzR*im^jalh&ggP~9M(a50#m>pnZZd$7#se26yk=3p68`*&0qf(Thc#Nsa^R~ zO!(wfYGCO~-g)XfxO^L1x8Qpm99*eqrcx8#KPPn8g4D&GrtEGa2&+Gg2*M1)nyDWv zNS$8xI>NY?n}-Pwj^UAn8RFl3?JeEAFje~FS95b$&6eDCxv5W?)K_v-R~bkz=cc|m z0~0uI&cy}rg{j*1Yb951tn`<~jx0*>d~qCoGKzC!Vd_sE_n-{bXo8;#^^D=WzN3r* z86nqSic*6{Zbd<3GhwCc^FZc=zy>l<{SXxBC!5pIwOm&%mzoVui`3(8-Nb8_Sv%12 zGe-lHy|M9r_0gBYtDnNlWG{pG;5Jept1GPK00H+?g`?X_@COFK7|me&Jl`CRigWdg zbc}zVU*7~*obIzJz9|I5*q@M72*d1e3!8ytU=xGeB>sXR(VxsvgZ^VlsuwK0xh1I| zrj~C4^~%MdE^3)7Pi69i^kdC$vhvj)nherK#RQGL8D1N>k_dvN&P8 zDuG8kFhS5)L2#TofgKFnd4vnw1Xa4WPK^bcziXWu7W9T2U5i_%+C}4=TBlAxu|aK8 zy;4Sur1nK^&@1%r+BT_5_U_&`snK=Wd<+p-0ApDNvJ(T?2$g=8NO*{_5LSuJ!nB4n zut;c90tY2yVF%m_|9xUFtC&zy%PkP}u&uthZK{wY{$tzJp##ZKZXxoqQ6N(7Z)J5@ z7oZOrwM?=|m$?54vtS2-0NdK8I#z$qIM{%sY!jl;8e=tbJo=9|`jw@+M(K23S*p5o zbOcIyh$EnWew6a}mZjEU4C~5MC;lWmAiycX^Cv--Vym@CZsZm7FiMbzS4fDU3?%a6 zJed;YxzeF*zV26%>iokmWW5-pTbe$AG^`VHh+T=m+hZ3ZvjA6CpaDRP4GBcu1cDHk zq83J*#L|CF==zFOX|G*|dXg#oC9(7uc_E>+}6NoT?1s zh>CWiFhtvf{wTK%LiK=MqS^X|%2cORw)=W-W$L7gcZm$QTRAjt3U9VTRPgS@0XM(s_n_&AMLSTa#LnzmpKw=u11M{)mh4w|7ka7T4mB>jd*euEoDPe-bC}S@IdxoK-OCB=Lz)FlwTqcPZ+uN5<`I%1=}*8p z5gI1E9S@(gB07apIwQbR7;=9GxkFJ8$1=szL{X-gQ3sj#2X~}p+1T(v zuhbO|Gy#5FH5_$ts#Y8om-a~wqSIh*pVaC36Df~tbaCI*zsjacn0>)w29_Icpfupt z_f3uNVmaEdq)X8ejljiOM6K$h4oN+bdIR;0Q0RES)J~wVr(f=bGN6C+6G~RJ002^% zZB;+jKQ-2!oX`~mQX_gB+F1c9<+oQJzVwHLOiFNVTU+CR+8(HiNYC_D3H_G=sovjP zKt~ehUJrg2yz>=mgg^FK4yB!Z&TPdo8Lsw{so%vhW*yAI(%;{kX5z@Su3bne(NC{=mL6YLunL)5T1q$nN7 zO*7K3*NpbGc}xN&r^4JGoa$2-tr*N7K}8yx0Z`;A|3w_5uww{C2X7Fl`X!Z_On&H9 z67viR0X{b$(l%K5l$3w5ZL*Wu=D9$EWB_oXVoV;@Q`QFrEF;G z!c?}e`nsX1e?vI`Ff4U^z&|YZ(y&yg3X2O#QshzG}hvU~U*qz7?CeP+M5v!3S5Ed5{~=O_lLR%P74`{KFCuW5okXMkKSAgTQhU)m#>c&J73TMm0Sq2`<3O8V>Fux9( zMDi`xR1QU~%;kEXOr5wt+~tOaX#j%5`nXm(80E=gb2x!u0J~(a-H?bz7|ko7D-HO&1>LcimuI;OIkL8nKh+SUDugMp`kWavEVT_b=(qj-*-wjlwq_XIPp zs5MmH68X&4j1P)WGQ%q5q@oqJDGC6BMx}v78+BaDlh$p+>YN;`P*CM98l?;MtT z6(aQb;o13(qtfD-)S)enws8W^V*07aq{{KKZtD9L*Al3RCD;YXn$>(PJtd)69)ZQs zo13IjED>%Rooe0XTG$MuoazFY0B|0R{r`&l^0=z1?(cICpt85<6%`c(F9<5gj3XFw zQE^68G*goCf(UZ)0?vWvn3`#7%hXa!Gc8R^L$eecZP2X8Ci5{XD|^yXGqZZK-*=sJ z4;*=V-}m|b_40AK_IK@l_PF-i<2?t1h?YfkD%Jiq2i1BZC8c3K=kDQLFO$aX&m zWocq^Yg3Z^)_X0j-_k@mw|2>35zy8hK&v3G1e>(t*-eAR7bxP~AtJV=$tobjP3YeP zMMwI0h#2s9t3&Jn^V&?C@uGa@dPo~8hNx(l)k8&02b8VBmbJA1$;Ht|D*AM&_yb9w z8P-s{o_g&LFbo!B)M|9FyTX8Bi;#DujSXb1^UXsz8fGp==8!qTD>UBd%`=k+Gxp2ZVXyz0;Hp5w8ZPD&TS(G8fZ zAH4-TvM@iq<%%^EW;lr0oi0DKJROtQkEu3Y9By5QArvp7M@94Nno!#qV-}9W`qv$v zJI;YoBEGY`7TEguG||4yrt6jwF$eU{5D{VxcP?!yPIqO9c47l#yzU16lQYCP-f%mZ zA?|6i6>{vnv>7cDEN5uQXfd6=j*J$|gnNd`c^x@M1ouahnDkqsl##3-?q&Zzj#nT5 zFuK7sXxgGFJvW^FdG^=G-aTVPPJ4IHMjum0*S}!^`R!k0auN(FFEF4>XXKP4`vNJ_nu>zBNEN_ravX2w-T`+!Q zu&(c)hwF0+Iomj_hBGev)MAL%qswC4?(zT-q?wA098DYI;QBJJ7d*`C zg@fZnNT|78^+Ry2cJ4G8e<0V!!k72KdXE={0S%^3uTY*_xyO>)L*qqDUjCf8TMRZ- ziJP;-1ko*gmA-(DQWX2U*ujLkz#5dT1)t0+n8E1%{z0$WsS~iWLNv4P5nH(8VY2)v zW}@)5HK-?yGg}N)K3?$8eFfh*M@qR9MZX^0p)Gb5mIOUOwIe0O|0k|jv$Ciu^*tDe z0QyvtyXglL#njgB!XeL^?(y=!Hhq$~%VPPBR%VGF#vBc`!G;RQ#agr3v3{VlS)vPq zS?(2)Dpn6M_looyeYwC3JQe3hxKoYNYq{W4uh3waT!^i_#y}s})*zZ8w7Yl9*%u#F zN9iu|);qs46lLM{3ks;E%?3%e{^p6<#sX~Xqgv5X6wVLlFNyaKSm7|u;~lg50f7q$ zk!Ew<{xEQN_*3u6qPwxYoibT`&1YJMO9O2*OG$M!5$juS$j2u>A$eWkKAw%>hh}!>JvXd(SGxG0FZY<=t_?0F!&PC9cN$cU4Qnq@(PmLhKlw_ zM6izk#;G1Uafo7n3`1N14s8_qr)p_hqfbV1a>dsTKXXzsr8+^Q^F*ik`YiB3u^Ext z6JVRMDR-LPw>TAUPU8)z{OR>4^2Dfyw*;cS+&|uDHP_alKTwN&5n#N@6raUH1OxC= zGJK$ZL4j!NkL@T7BYZzZZ+GnyKM(6aP)R=aC$>{kfw(u|ZvvTb`nRKZ3PjK5%dYFS zf>WX&NjgMOlMOf;Lo38M#7Onix2f7864i4b&=rU1*zQ+PR!u&R!#YvBO@?MTp?j*o zdeWDLB2GQ@E7_c)mt`AWC=~JPd)FBT(>sOOL37JKHGxQgySXS;ZsHDz8?JQR@4FxdHFER_{owY2i3p7%>yU7 z9(;O=8sZaBexD>txp=Aw>CJ5)#*y?*14shG^qs!1!?c8}6$|c!vmdYk@`oBKUkP8g8JLpZLE& zOChD=1wVX|kAIfQJ7^x*%+pSP@uA2cN^#!iL0Qv85xyw#`ZSRa*1Aljpn@{X#31-> zEEC7Rz&Z9k%H8|2>bHuD{JARlCHiWmJj>+h6z# ztr}@RG#^LQufvcn0DslP`Z@hlDZ<(xT@2XGzG?~B7S+CI8TfN5eB-M`&xs9f*aCg% zKU>yElQwQyTtY&`!YSG#*XWZf5!|Jr0#tm6$cDavj@Zzk_{9)6 zXl>9846W*h-)qxmiV14X7IYE&X8dRK4zR0se4r`7)}%ps@sk6i_y32~ei;`Hq3d^e z;H_fXox4^RCAcZiLcDo%nj^7qF2q_cE`uK_8f;I9_L^hu_1oM4Pq9BNtkD4EtPvwe zY8tQ$UN$e*0G#XLl)?yti(vjp1=D!Wghl)19UqV&7{au%@79y74^Q6ng^k;@`+PAe zz@p$&>pXFF6h2><{awC~@p0Yq>ShbvEC@?Zh zTNemF>mEJM2I-p%L}$*@4-3RS-H|2ic>8M@qSUL zp1(ms3q>d9{TGTL=Gksu)rF!9^M5TAW0)r|(!)<)gtfzY#6Hz+a{2WA zqEcECjJFY?2lMuqrP7Wkwl5OH`N?aGP!Mpx#bO}yti@0o@Fj~yw9ixgtI3Y|bSs9u zr|9@%k?D^&m?=C}_QZEJKKyd`*(*EWUV2kW#RoSiW{K#a`=^xH)c^F)TO!tl^7G*y z_<-p=#Pbb)2gLiMD`8lgT3_Qk0Qh0tkL15pgjv3)l%=8vf5-z5p!w#(3Lp?I(mi)C z6`d?^&^t>p4S9=tF2knN32ONOCL<>(=>d@nR{ekogT5Fu6T2nYf)fz_Nv5~nF^)bU zmPRxRfZLb29)Ss+^#ofEzUP47q3hwD%aJb&tzRxWSv|DRuHuRiYMbY>wXZK1g&y$j zzDoFe!q<;ltro4@!xe=9&^V6N)KMx|iN5HSdso4B9-xm_iJlSe&Q`A%TG!yIlF`lT zeW=GnA{tNUKP0*|KY$FPVBR)iJwWRp621R75#7`y3R^9@v@=KKWs|tT+1%!XIP+Hj z?=p9MwFpJ#zFm!#nFocg0XjxQ*NBnb|D$ti%XqGx|Ll*)*NFDk{f&F+_iNC^7Ha#j zhzA?;usCViLw;+;Dx|bytym3VuXSQF*!p!My~!DU#QlDqu=m4+Ou^1{h>fjIu(lVh zT^iJWa)?gKbEJ!`>)L%~G#VsL>^C$C6|NWaq8|A3ReWKYmu1jZ-baISVrc@M)#RF; zv0y=q@d`JqT0VkFb@EB=`j;2F;Z(cfJ_q;vZaH5`KJ9kn-NQXFysW#;<3%in7ca6r zDuQV92GKvzc$gnB+?dew17~j2tqmg0#}IS;Cu#VjqJunuEbDRMotYfhgO7@?J(pqf z;r=3`{<8(Wv@le9;l21nGM?H(OQP@b0Abxh-#;oMt!#i!XTD>1%R=89j3*T73 zRgdoU;}q)s9`v*{tFck=lVVic4Y-QNvuV3p(!xWrsLiE)*`KudN!U;D-A}@9f}eR( zY+zot9YzFv^>$qj97LaPhhm0B;Iv2yZypA{kJ|)8ZHd^%8 z8teo4>ZMSzKm_2WIraFe-K{enHDs%ZnA&y;xC!{(i9nlV&V*6kg~A zL%@%6^t9nA!Cys++9?LNg6VC7meXv#NM#ehc&E6{qr>8-^>JwD(;|zp*DifLirOW* zw&l)%K7b$3^NtGCzyqmJ@h(yI-_2yy-J&|-Z|6Lio;1$6hmmu+g<9E$WRpw_`6c=Sz&MtSj-Sk(jm{dFIkchL?K73esTLKhi ze-o?H5=qs8`+yJ4%g@NoFL6}TGcSpICE%d4f^uhZStT_)BJTEH*VL+bBiv&&<%sBH zKLjWMUj@J8@iC5kNAV2D$ciFoxuYx_QEEKjSyou=nx_1W@XhetA9Ub|xW}WaR}cE@ z6%kHf9K*5g>7$~Umc9blj-w)%mK+l;>ODf}^_N9|>U12wkG~??(*C1jBu(lmTh_~B zX~xSUoksPP&FRW9;f8;61O zp9Rzf)D^^W;hMe@0qPE_4@1`1L_keEL)c3<}PHGO~Hsdypa9Sgr(+ID> z6ZlSZ{p_W-R;Y~3%_$Obh(iHwT z-TY7RCcqx8b@^3#?@i&f_5;j;cnHW3M9*Cp1?2yh@TYg*5@Os3Zhx+-AdrD0;SL7% z1hFD|f_j1QLkFb~s4s}SPNFTzhF+Oy11@i)XJH0KoDfIwTaa&0h|aCBy+;o- zxXW$a)Tm*;WDL3ee55(A-8;F)mF%IO#VmHofgr_vZWsUH>Mwok#Ilg6$ z@FT!&6vekb!J8iL2WZKMqJJwRAEjtDv?H?n@rR<5_rOlNF&;~|KNK;;3f!;)oOL@V z(gvI1$ggx1*bKkT@M8@ss46cl&d;rM*b0jsr3JPe$PU4;75Lar6cs7kaj2j+tR1XO4wuX6$}V+q`OSU$BU2R)W{N;GVEysZ@7Hbf~!i$PJ$aUE$K0 zwR#}%AP`$Z6jn(C4F++aV;TZ7r!*9JXjz%VHLAR#s<5zl7O*)!jwi3UvZBIS<;r)Y zJIfqn$2q4t?u=wuqe!{Gm=obH$eG~CI1?j5X8&|x3iwFaYDU3jbkGdA&3H60%OXRp z${28tfn(!ha>p{`Ot)-;J1i@t6~tl3gUpz#l4XlRtToC6I5;9B6ZbU26M z8Rd>O1(cg#S(RIQ=kvw1{A1B6gR{y(nWloql~q)g^DyTq80#pSSzMV`n#<9d!%yF<3m9`3C#oW&Di4-_kjqtJdbX0D_yqHmYyD*){r-tafI@J2 zxN4ZHKm&_s6c;#BXHRsvoMFKH$9^+F1Ds`AB|FQwvI|R{Gxg++tj)wXt;JaNpJDX= zr=m<%x={bm#9rThU94KG?LrUZ^6%?He|?7gh<&>16)>bLbw7)H7+JvFn4l_R&b!T~w8JST!I{V4jJ=$glM zWhnV@SR#BQ;F~w2f zM(81!{AL$8O4+ZfEYDe108b60{v!2saj^et}aP&nO!F1vc(_L{SlVa%PksDla#0cB!*0+fnY!pThc!2rA*n$r*n6Qylpv z+SFbPFn@Ivz4iqT{PsoBUtfsF)skr1azXedu8h{__`HfJ&Cj0V$Sr`K(Bs?=KP^tf zuefMRrQ5GAntr+71oIBH)5JL;U6l1(r z!M{5te^}ARK_*(Q5 z&El-u)Hx=OCVh>24tyew>9);&G(zoB>rrH_6c)*?@?lNZ*DB)Xiw$<}J z^x^yjcy}#$(08J%3z=6+&p679JHbvcwo z-&_&N>eVC)`%$Dt#A8j`6yZkq)AcYLoadBXEtu_qKOL;|sr_jEk7Dnzci_+AKX8XT z2kr-a9h{d^t?ttMVrTHyz`ej*f`9I1)h3UtBlP%R>qig%Bvwtl4BQ0%8{FY`f^*+G z2+lQe44f^1@!SV){I#2pMLyY*|Ki3?llAA@CR5c_5$(Skn9H*X+zWgwIOjjC8@+N> zB!~aE<+(ti*Tj>4k75AX4B7&E0<;74bT|6vH4zfHxjo#V!=Tfk??AUfEjsWtzvFdW zi&ShVEeM~QR)Rs@K?yYCy6D_3w!c*w3Az_l3aSRJ1?>bK2HCeRIIhSKRmup$Y6lCx zMe3I+)bnTYeAD@h;Ip_5?LR3(^T@8xiFoeA1vc=MM!2jIp4SN9-v}?O$5eSkEU9@m zRbPYhpu|)SGUjVFjqrS6mUSFpRThAA+-w|J!4@{ci`=pyrm#l5i``*?3$=%rK)}LE z1YQcxnKWh<4>ZEdfmyZ{VOM~!1U(2^1$qdy8ng!VFla4k9caBa-w(ctlj<7-sNYR7 z)i-OPRhbAcUbXfDWeuc5H$`;4oU_1-Kge(06i3w!gXqw&u$!j`(dA!7FX@?PRifcP z)8(Ywzlu-~rC%Cl-hu@$O{4kDH>Aj=rJpO;%;n}UJX<}6n(q|rI}`QLya z+aSaEVf9i}IR%9uOxE8pG-UFQ-YNaoK5h=Cz{u{@(YV0tY_otZJcJpvu>En>3H(t550UhEJ?e8c9 zlL;b2B{snQC}<-nas*2;5w!_1Ah)Ul%gemkiNc1zdcP4PYRBKk(TKWlGhO-%M~z#z z9n6sJRkdzM?Nn8MBAe8`f|O#(yOoUfL>E0;JGX^gYH4!%IK(-$uZ7Hk_`<7HYL$ge zw!RMOeyV99A?FLZ5Te#t!>?>QUk@+;rS4Owmp0AH* zY*29mec>%y9II)R-{=$i;^R;16+OYxuu^c2X*&Q6N+lXKNAMYPvX&dF;t#i}j0 z_G9v%fM5pR2OMj{&jH7n@Lph66eGNfyt9QdurIK;hG}^_Im72F(kTS~4CJF3gi-Bf zxH_en=CqghkLfd2?}{V9Ij0wj^)B%tvd_^N_&jjiMwq*d;a`Mo>6p?x$cXWVe3Lu7 z27VNnM?5a#7SvV&I2$6aEu#p3dgyox^5TGeE}mh3cW| zgZh_X00N(f=TkLIulmb)(XCY1Fg$nLU#9vO0CN=@;m;#H4>s_h7$B>yb!VYwmigH4 z{~V6v7F`EDJIZCj$EWEH9D?9HaWF7v(+h6|IY)as%Khr2Wt0;rQ++!+_4!3SIP3Ra zPC5`M6V)kBx*90EsOy~6K1jwlz4`?bI@p{O8XKYQknjcxnut*JB)xph5xz*%JIQ?Ce$($9aQaQx1{|9?Xf5J0<3qr7?FG@Ay4qxz zdTTnR+wdBW6c;VA$wX1^(r4R{zhje=178Mam3kYTo1LRFI^AJS}61Lwib+F@YsJW(b*1@3Mdrt85nXY&8+Bag609ScA>N!lI&T8V;R` z3lwLiRjC5a1;OBH#CrY;$k3~!a8u@C(T6faWO%D8w!n%~0?xgvw2D@R$fcoxJW>A_ zI6t@+{BH0-gn?P!cNy9nN2A{o!5oSw(l*d*px5!vE%yDU3F~$ct?4W~kDj4-$HuW4 zdy#M8xi>*?flh$l2EF6P?}8htUx1$TD89Ceyh3GS>U(hWA7}g|$OzXRS&ld1zQ99) zPl4VCod$gXLOcsXWr=;JKBTNim2qvYbmJ#gobH+MDPS(D;s1U;rl>I4F4z6o8i;$F zf=vbHQPX(reqfskFKmQo0kh#X!p}sWcxkb6ChZ8537PI>Ha5!bCO7^NLH_~bLY@KT zg@k04Wx28{vtWm3>#dv>n>EWHZlt6vL(?kc*+ur2kr0JIls?-^x8vnN-Z{1gl@{mW z_zU84c#i{r00h%_;b$~+5!v6xu>W2cnW3J>#ip*ZYt#9^z+;VvK4?$tD*LP3=Fr}* zGB51X9KEKw_xXap2JukFDs~a{4d`3_XyrRN`H$Q7Qp3?o(1E#k9<5lQjkl2A^h(67 zXq`VgLizP>l;PzQy)wZhdhdUJ1t(xwMmadRPkmms# zyORbsb|()lsJ#*`M_VSO7MJC^W_JrW_VDs@D;&LgV4hA3_06>F94n|9=x5Lk5KqUs z=6`8~Z@Oi53-zfror;y=zHH;UhM8`GE-fVQI2ojZhsVk4;4_P?N;}AZ0B6l(GOO5c z`p9}YPId|$v{;`%X5?b09lMEDaq)eSS)~;67W(Pkz<5diVN3M2`(uzh5Z_fK&hb9B zn0|?uuAW)&F97y|oIA8Rz2AZVaFe+g{2Lm45B-uL{nT4a$ft*N`BpBqYNrDM2o4oj zDwool9x}rJ7UcdK*8O>C^VV?fM?IvkMg4MF?e{$qk(%)US^CJSYR(FL7*{UwJ+lJC z1VVC!uijhwwR&IYB%gn|16@;M<_T zK-?!C=>xivk1E8)4RCHHg(b-`VkP|TI$n?@hecchPSUWR?`P}7>-gPzOur;y zvX=D_1@@DL>b!?&aX%R?EP zT?#l1rh<8%(}iPRS23oLbGR??al1{)gg+~f5zaU#L7OS_9;Ued(7M$R)6o7hI=Tr8 z&1%aH-xTh~2RF@3{@xba(O>pzAs}OAVUia5zQ3H)f-BO92k-2ho`QM)`L+7)*f(ow zPl^okF<17-lz2`A1hL4_JMM_)AT2D^$}X!T9$u%L>22Vg#C|tF4$ijpBzRNsGwbNE zU6#dHuh*-m{d|3s&gH16Dy>wM_mG|UK_7xX0(}bl9JFtJ?LDb-uZPdA4OZ?HO-sw>v54YV{3mh}=aTh>UBH^{&bz-`ws1q_x;0+(;JY6pfqKjd%* z{)jP;g;=e&^=q?9zeF$(Qh%&*YF}04Hr#%~n%cWtURl+&aND*`wd01!r!4A?&GhF` zIo@mDV>tfMM$>ueGTf&C`_}~y9#HN3UZ&H-WO&U!gqV&PU7+3|GY&Ulo;k#r@M^f( zh#28{gTox2F`GKW|FK5?jJxsvoH+o`LJj-`+~x%K0k<~!zW_HkfDxWC4>ksV5pJ$b z1D}PPr+o&#py8SZ!S{^RXrXwTdlGMfyNq}; zP5z7FZehaX;pTzRc>W%^<4kxY+}v`AFD6}9*KF8k)sBiEfsE5N@CLZk8sQWZCb-Sv zH#WkX8{x+r;VnAOuTO9(1PLG`1B}B=cp2P@jc|7pPJx?s+IT({ZtfEsw$VeQFfiYG zg8mpKyZ9D7sV{7&gR=_Gd6E(`WZJM}z&s;skn8hFV>`7RBPgu1!kS|kyLNE52bpCZ zEc9B2EUSsxuCLL*L11n`8!&>_^Bfz@eog~^7XDaX)cfN+%jPV^sVQXqhu;Ni_ML5f zC%A1OV-gw+cL=C6D8^M)Q5jP}`$o&rs^<>!7$cLJ4;Ukdsju&#hsMYV_0|qLG6ti3 z^i%ZL7#Ux4Yll9dEk^{bp`qZcm7G`@++9GQB7^)ls)Fs*of+y1|B~Xef^OjWr%^Z@ z({NavTjaPSvk{OFM_6s(Ls%57OMQ*v*0VAI1;9=XkBfJdI+8vfE4!+_cG6#CWxSfR zlM*sfmd!iy8+4g0&g{eNSGdv8(T#8na4aYeWYkkU+zFr_ApT?46aQgt=fc#So*gHnqLp1%?fT&i zc*G)rQK>zUdE`T}McL|QnY*azcocBiuG)n0GEY_Ce1>QOTJzR3^vMLdyJj6C+YEXZ z^a|)b(C45lpxYp^8$0r#&Y);eAJ8DsC{Pw?3TQTH1?W-GbD$%jH$kUBpMbssT>*JM zgK-vn-v;)*F9IF?UmQ{%<(L!sw%S6I5&zt5< z#8&pYJ+xw?oE&mv53+_3uX*WfBQp+${Kg)VljKCTaxWE4l8HV^h?W1C^`pI$*IcR|Kmiw0)HW5&H2;X+`Z5E|i~ zaP#eTi-5P50 zUja9dfkt@7Y#|5K%O>dO4Lu=<4DXiQuS-OV5%_+V)d$3-EV$V`N1J4Z$+n}0@lT^v zI5s^;Z`~`C;}iC~?|ZP zc#JBqDx1wVYi`tiu?hR>ACqM-Un30nU_b2{3dok#A&Z{3YIj~=0cUkR4juyjH8_u( zc>YMXOiwkQKZfVIQVonVGtHV9xHB+6Z{Sd1t~bOpJV(w^!QaY}(ae9%k*Oht2lUGj zc?iS9nSqPp<~mxmhbHC9F}~(H8HhX-9-w2nC|4_JupcM{6b0(@95v08Q)^;gz|90u zH_${-BR@)QF)7$A8R*;Xk(tjma%7 zb>_!ZxbkBPr&VI6eBnjfk}s2eZMC}T_Xg)RQ?pw7DPR7sdL5!43J~vzL)6j%!g@?x_LKLWx*yvXB-G3NQssL5(gtqVLH( z0?z8_$}KCxHb7Z{4I{B*mhA-OT#QGK(9$Vb;a&pfZgKkv9hoB2d^^6Z*Kiy-ch9wl zsC6+`hn2vb&Z?Jb6tIew%R=yG7a@;;oQ@aEc~suT;)z4gvwx6%s_d(7_&3d)D#KFS zAJs32j6q3wie$#!On4CHMLe<_{uT9@zMd)*{Z}C#wga2NxzBC|=fdneO1(>DTF4n- z3H${(8%(cb`mvl3IHKZkTS{b*uMw^vOVGDAK+b)a3(Of(E3se~pa>ldXpueWe2*2%+bKpK8&OlbxTxI(kwf$YP+9Q-(e+FnR=rHID Sko^)~x*)xuL0JBK_J06mr}HHM delta 210827 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

3(k)*0X!4dK8+Nk<7TP+m@CzEre3 z{-vU5-GkH%BKpCD)G04;cs)?YpGg6`Y3jf*uYj8vwj=ukzBx$U0)3>IeJHCmyoZMl zDV|w>h&qBh9AD9mOv>B7BL3!vT=o?;2bY}qigYGe$#H5G#Rrq|Wbqu6BfiFNzvFVv z*C>rz&coCRr`^lz4#OLEOg?uQ@0uK!pB;uv1RAB&5o%g?l)$YqE^Jo9ascnKB82g+ zO46`a=4pyR4BFQxugAb}ruoCT@b^lX3s2BvNOQ?c_exP8JySOC27Nh9OB_SHP zNytJpIrf)elUr2FVFfKHVJCaOkr&Zqu?1xnR^cX1innH&4y)dr+=`a1O9x(IQuKd(&~3q3)a= zy|HH7W(+%(3!0xi!3q$^ub?Em_i+{u?yS$Fbo9Ey;ek`brp{ZCALt@2?l1U?L6q5( zaluE4lA-YE$l@nd-phU54rwk=hg^ZdeSO79EnnQBHWm?YWXPW*v zyF|30Y|?OUlU0!go>`IC_*YakUkeSZi0Q>|KXz;m^x>UXs1p+ac7{iIPAL%hnAs~@ zn!~KY8?FzYp)S?&p+sO6F)-n*vJ>7qi(R_MU#YP{*al3lpeEGV8eqsF;nmBj zEaDfO4|LjwN%Hr3N-4I`I?o!Dr5jZD@MQcmd-V98GFaEWbc}j14lW+6t}9vYPB~6p zG3edLVNRiN<_YRxDMmJPUOSsNgh5&aIZ=d< z3@|5ThH(OBMUhfxyq;i_UX^3XM)`s9DQyVH_(F72J;$k}(0dA7pEeH`*``lm4^BIYz!E9Kix)qNu;T|uHtbR7c<@4Pv82-4)=@tL}<$$DiJb#$E|;(+JE{ zUdyvZt`=^bz&g?9kB1Wiheh#R!=<A4%CEb1Wg%2K@XFid@^Y}JKvHlD0tUXZi7 z7Pvdbo67BKJ>e^|`Phs}=@etvgG$}T6G-)cW!Id;9}Oz;dyBOKuebf*k?jAti4~GO z*g-5~hOW3-w7Cm|(J&ZZw*hzjegykF@a_=LEsvL! zysuE@N1BX;WN&1rn3xbFY0;UgMaq=x`-+D0P*<2_VTj9-m%54qa>(p%B0XdO_DWde z`n;LAsBaVkbqCxX?&t;*gAv9+9B+K5T zMRK62+&?Jf1!*fuoqsUEV0=A4GCBdO1yc$&158ewXTW zN(#~mN8|r1o!sGcN;T<}%5-X$7^%CuLNU3U_9v=9wTlUj^U~zJ8$?d`3^O(e zG0%tBn07hT4%_8u7cH`EL$E+|wW9KXWCMDO^Z>+9sQ@Otl+2T3ZWJw8N55pyc^pthu6XZkxRQX2D-^RO*&ZAs(Ds5}N8(zkF2waI?r0 z(+e@kd4Tv`-&mFhWM+m=oB|&I=V{MPcg*&`P-hii)4BCEg~h5vw#ag zOv=Y^2~BtK{>fX!{b+PhKf&MqmFxNmUlkT**Mfoxkb~BsF)qB-K-RleG(y5aao z;A@?nC65dc-P6q!wr$c%1GY^PcE=o+9R`Y*BO?I<+b3!Ahk>FQJ}j|!TS^MH;jyi) z3^_1;Y$pWfK-?P#nZ$i>kQnI-$W~c&hv*c>sqfw)W~;E+>^nt@>+lqeBNpQrF<5jC zE2X5{f}xOZ8@WUk>6RlW-6dLIt+4Ad7lw9|zYV#1bFPOOagivoVW?>8I%6pS`PWd< z$aRiuGg6!1DH{2f^HY_Hz)BV_8F=&9Z&E0I-N3IEcZvwt-`oy=)A{u~tM}W)^(;4p z87c3%>&ncToXH4ibGOKEZqloDkaG1vIeYOHq*S4-Dx`eoZsEHwM9L;iN=PlW^a>>- zAY|FGiq@)tqBZl24O=Vg!>@?YpZb8OtmqOFF(LV#tdx~}b(nC2r{5kXa#Mo5psXEF zCoI{R9nK6h*`ar-xGAH8#Yz=2W-~T5FH}+~PIElZbV&sszAF{{)$D*^8#`PiW{0!! zm1AExTqH+WgOmdYiOgs=X)OE1DNhU+zQiDi=+R-ZYuX4CzK2GL&T-$*ME^1RAAAu2 zW8Vl-H<0)jC&GOpV@H}|Xy$n6!rmj{0CC$mad-8! z((&-Cq8u>QG-NP9nOd5pt=LDbO5D*2ympkw$BQAUQ4~br+|-{quZkh8RJj65gcn~h-b|5j}Ae5hnC7MS9p=2E1wPahWVGP{-2;#s_gS})|_$Oe<;cX?8KFWdD z2Pt4*^q3{zixWv`Y)_m>zJ=Y^v)OnJVkVE-drLUl1CkyMDM+nPZrR%c~Q4UW(x$%{V{ ze@*-$YQk4ePQ3gmB>$PZ5;;%LfKIP53t%`hW`R#*1BNIsN%@FHc%yr1F2 zJT5!@Z2Ame|Ct(d91U@7)&OKisD4J!Ycf0IVuQ=PV9?77kEvLu7luS!Dx`R=MjJO8fsDA4`($ zJg^gi{i7LbGVb(<>)8q8OUEV@b{Qq(T8U@uYtknRb{)a`!WEw$)8E7u@A~VNxZ+!4 z`chn@aGfOw#$zsmI2+={KxU}C1kn@G^{-P!^FU|3zQ+`i8jq7yO2!4SoXBA@Hs zo+u`UTqw3^zdW1@N2CR3qBXm0(LS~y5Lnx-$@Mu9+z%!R<+y$?N!-T$rYDO9_3_mq zwZ8g;I1ZAIUUz~+3PibJc|=|_-cgQSHU;=7qx?1*ni{b5NWnU8Zxxuq%U`A-K#1Jh zsV1a7Q^oLnIFW2Ixz#0cw%Z#xcP+)Ur%FR?;g~+qEO{|Oq|1qEqHc6h2->2vq@E~J z9dXLG*^(yIzOi=cB1P;JRd4~2wx+r4aFdp_Za?3j2>IBpc<83 zd0w{46vdGug8!~ae?3XRx2~Z8Gy>i4I(E%?bWJkI=_|J2&tN^t#az$gDgLPf5D9S@H zgWd6%Pw>W48h z&zfhqV%L>b(7#flf2nL(1IiG}11)6BJ@r&z_v0F(A*X>B*>YtqrBLeC6b-`Y^JGmh z_fEOAW)RizRD_{=E-x`X`l`T6^Y@w}9p#g21GNJ~YQx`S#>}m$y}Q7i+Of4wkus*XXarVfnQMb1Qs_r*p7ZjJ+QJWR++SO? zz$LDZXy%5|3Li`f*ey*S$-)c*msA2H9M|`kC}zAAFh@bnns7OQbeVNij+4nTM1_Xl@=Oi zp;aWD9|A?J`Fgb?HH)fD=_iWB{mrc@_&!g;WHz2H)G9NWS;pL1qnRcO_!s$Xp~!X( zMeQ<+OBOMg1okm7VU*<^R+}TLRp}e#@npugbG$-eM*0WRIxY z1!XlTRE#|&{+abx@|I99-m|>Yeq;w>Xb~_aQXtat@4J%1Eh*mSqBbMFb^%AwAm)1P z0t~P#Eh*lNwC18|MEQT9qW{I-o5$HzRD0iN4?U#E(^GoNu+K?Cx=A_&$OMF8N5T+9 z1}~$?AS#$3lYm?WPJjSmj!YFHK!9kX1c(ZB!~h-1g@6HqBA{?F3<7#1L_|dadB4A^ zz0WxrK<>TooTqKE@O zzDn;Fp*Cch%2xBp2i~#j63RdOP~DmTKpB?#{s+$x>C)H_J!vz2?nAFk>j#WXwSJa6 zt)Ko6z2V+l=GhOu5kuj?lg7xG-&pJCt!vx;6*-+UKDK(x0Rf3> z9GKhsU1|Hik%FszN3K>m%MZk?RZP})mC!uhH{ivM$N%g(Fej)u+AWZ-pq1Ak<^1!!8!jt-iYuGgY) zu6y+E2G_e(SIB%T@Vl+~Klr$6$0C1}rchK=6oS{^OjF3pRyHG3B`JyKJzgshRFSND zgv_bD-UVV{YM-$>g)ce%3rge`gQK8mai~( ze%&AL)te{2&XwiUD`XrouKp8m6JQxfnh&pnae3HuUhU&}%&ZO-bQEh#rvvppU ztJhq19fH+;%>3)Pi1@9^8vj^KGM{ERN3do8-1whksPn#F(b^Hl@_Z)u;^{m)50d8a z`TnyqxWkQbC~szitP>;bNsS|UJd@Nk@_K)V zAKHm)Jq-e{3P<*1hb*p}A#;3hwOAv=ealnf{DXb^_24C{E=&&T$?(0-DSX z9u#D?S%0SgXfjvCD`w@t`};Gp=5P4h9%<`P6N9pkfCoMPQlB@y{4T+iyM7nxWhlQ3 z{d^$jwS!K8R-0}?{A9Lo-Z*aW+nd$weKa9{` z-}Gm0o7g0s;o9JdX!RL&=p^{D>&%~#RP^{T{kAi7s@lBrO@FjkZEDZ*w~8*+)Q5O3 zv^{jCkwh0un*+}BcOO?(H@Y?&w^$Ak2N%AUMplO){)le^QhVp%IDT&jc zv+`RKm=hb8I5oMAz!VS)ldNmur#1HF1hdY7;lwS!D{30YI+CB*eueCT$Qe|jF6U^+My146~Mn4*@w;2+5XOL zsh?2YZ67y{%*YGp`a`ok`2;(1O{$0g`?w_RHrbmistSOX z0p+XXv6}em_=Ajon~De!)a6BCg#b8X69U*YivZ}~=-IdJg-9gL*^wQiY3|D$Erb-C z;+m+6^Sak*$+d$!peIf3Q9m@Q8=hpyVQCyyHG;nE0jM@}*Li;17r;PjJ1oxAv$z5I zFcC?s3j^g#Xi(rxkt_)itTFsW3AQZ^@}fbEstV`?wh6GSs)SwDW~=i#aakAXP4OM) zfkyJ1uB~VP%2^G8=V#bvs(Le-X>ULFtDoI_=db(UWYL0pLZPZsiH)|OCT%}fry3M$ zaxkpTo9EB>yK9oA9OSF6o8wQ|wdBCnb=FZB)V~B#A-DiAK3U(aZKA5R8PvN^^R+oV zmsn{Q&hgs|mgZnWy)V<_3PhuGW9`$dzDzIkJRbd>G^#q@K~|-c3<*rxzDI9Fq9Xfr zG})S=Qyuvp5T!__Mn^q|qta^o83Dptd1~!i|ZL_>?Sq!E?N$ewF#2ZmIcZF9}SXUUf_?10zsDhsD6yB5!>-~q#e(V z4n)S$1SG)%txrJPs|d6)Qcomi?-I~#R1s)4lmKnYra;>bpzSJRY_STcO@X*?1hu|0 zsBIZ&=F=DWW6YZu`Ym`K^e^JYOO@%n$nX5jd!lsJc#cOK%EBv7Vm_0?SrsOb0}I`1 z(35TuA1D(eC?|+(j=abp9!6twV@>}>FiNY;ix>I%A!8;78#qTrVY*M6=B$h^ao?f8Zs46&_At!&8IH&$FP;3M0%I4V`1X|W|1}8 z;EG>rZg%DGMZ7#LX{t6CMs3t&ZI4DRdg5UfP5yG3KWUse#O(CkFnr=NPWN)7c{+r- zVLFRM91?qK{q*|0eW76vzZ@ZRwYlVS|5kqbuJAwKG>-K?oBvKepTV+N#+e(g@N?cc zbN?0o;mlpfmHt;}RH+j^iy^T+)1tYHbw>yHS{wB$s@FzA3*8{DOwiN8&;qK~@q_S( z)#k}7IbN(bzq`^mbm822{>}w1n%J@Vzg8HUogNLd4t_TpbjA)Ejw3e&KA|P5Mm0Cc zwW&aZHK@k$^^B##Uhb8kG0o47jz&z6ny0g?pK7hLHQOw>CXa>yqt;wa5VdhT(^8wO zH2W>_hYqtl7A!^eX{R#m(bN0`fVmwUZ1XB}-naY<8qwWEH&}OwC>CQUbMRIEG4?=R z)(N`fW@Mw0_;w@^aPci1k9E9G-$C=7PU>bzvGhQj%Jo&p4$qh1yX<3~5)T>@yOTkM z+4)9z{)f%%w#sgE+Kqk|h+lA{zn447v9+Wpxe4sW_GkyfkH<*FYV+oe{^jl@7tt3Y zF1!g9vDN0eoBVBD{BE;|f5bH3%#A1qmZNXxEfy@$&Hm)pyHe6LM7^~c|BR_Bf6vy$ zW55h?$iezV&xpz8hR z3%B@_cS^2Ho$o;1!&tAENn7tSfqj|XnN9|3tL0ddcI096^ewE52TXXY{h4s9e|&4= zykLgo=3KYTvRmyz@wd04DF5I-d6xA{}> zHnsgC|6nf1E?MMHL(cyABLB+*-o)?tC(EpF)S>k&pVhTd3wUEq8m{<`-&x0FF6(ce z+nl@1OW*NtPQ4>u_+8c~5c#e@JaxI4oD1t0`#(QYH4U4t)ifl*drLsHUhwK2RluA< zFp4Xt)PBtAja+rgRc&*n9pZLQg|vRm&P)8?4OwNuInTqEft@DpEcA1YHN-IOd;Wx$ zC9)>4$+7j~@A-Ruyr=2yM%Rn+8kDgjy%#PA(2cNU7zfj1$RPeN#nclcKh$03%79d7VDMmW~Z9aDgr zT|{AuvQ}WS+MITSA2~mjT6d)#?YlQv0n1}IaK>9{-o3%UB=wo@+`d*?4h4S9%RXvu zSm5VeC1~(h78x}2!~*}6LK9SiZOdv=k{gTggGD!1AiZ+t2W8k?6vRfqu~~E#xrKRM zDz&*GPbIY|>6(FJg{sZQ4Gau4r>!V*v@&9ke5s$W+{%6L#!>upX&Y1VdtEXrR>y(d zT1$kt54qoy#jA*0BGE+TnAUYbyumgLZq@EZ;SrF=RL%h`yzH~)s4Kkf3zt`VRR!yo zcmof0d?aU9LPZw<4KMndJYqCMBlFaYgDZVUd1&m|;{0(M?#m2`L!R@T;WqVD?S#!q zXDd1;7h7{KTS*=J^K~9E%zNY)cw92cKUAMM)38s>_=07{L4xd6Ig$(& zaRCiLbpxXf`oWnty=EL!_+eNRs6H9zlC*90=?LPt&;|8|2T_H+D2*qLsr;~8?aq&! zg-!B5U8=4KHfi#xIzjIQn-hC*DfA}rbv%g}l8e`0x>EBfFy2{B|4l%oveuWRx%xk~7b2EFNs?NB8cVZ`?Q@IN21M#hLWV3oTW+91H0V!PF8+1pjN!M01+<4ZRT zfMm+d{bt(9nl$s@$m~+VsWf#^nkw(oR$L%s3P1Ep5 zJ73_le{aODZ0{tZ2Yh%CuYhvGhiknQbJn(bm>c23xzwocb>FW)@@FzDf zl#T$J$6_A%Q=L7l|J7e`PHnn|gx*YMaz?KTQIK3mmlmjI7Z~kqOJ}PfYJ`{C&z2*w_OK?dIHd{uSO5lYNQ9!cAtom;BR8cG*xT#s2EuFZqvm;|0u**#K9t zMzurTt+mP_NUG%vUS@lIHe_d=J$sdeq;_MKXXzk&zRL$A^3KZ`E5T)S&nx~Gr z@v~Q(;cxhZ$NyfXAs|vmxjOAf)kekMRF(>58A+)xz2P6Y6CQNwF-`yn6>~ZTSmoNE zZXn#H+r=L1EwAgx9sO^=;lJ)@(~0-=0@lyoY<~A&{)nM?>Gr^&;!X2HPYfDpYjLl4 zy}v_g{^xP+UOxZdSnnT&ecfNL_jhYp#Nv`;C)lw7!{$AI@W0D(?8!g)`yDWV6`wZk zr+t}BzEK8W+hi}7zi=nLK_*`1;TX9t`Zi$U!Y>FG?;ue~d-lXCA=E*nx zp}2Pb!<+sAeUqZL9{&vXhX%EbXB996IqdPy8%}^d1Tb#Gz9OV(n7H4judFgGYXMX>OZ~GXQvYmjiG^!JJ z5NSuM)nr}Lkx(sTaM_L5W$6vnvHqcd_G7QW=;II8vOH=?Y|4Jo-!1)T2cq)zx|IOo zEXYBsbn2qE-e3u6`bLGaE(&>^&hJ95NA$ZO%w^&ItaYxoc%k)fk?TmhYSRI8TOnR# zQ?gU>N=WQ{8r*Vg*1U0B4DzS#OPiVcR+nPRd!+B>>YewIy=$uTxHfWq#mJ!S%SnZ0 zutktYQ9u?}g*oT1$Us1=*Z#`J^dqzVyGWnso5SDrUu{Y4W3y0$)ADwC^dImypW|Pe zg1Va3c)((K5H&)kfr0F)#xFlTkh%@^;$IVR`&evQuWn%JV-1T-`C>(FIgeM4wz6hb z)*RQ*jDPUUv>;(>U7Ca^K^2fh32UqY-|DjqWqp57x}7=#!(8E zWa)d{46HKGzUN=Z&x!A2RcLYlrSJQDc-{~CfBu1glP4?br+(;1TGmOI;g%+45FKDlP!KRpTUhrj6 zw(GoLy8~B!WOD&BvK}ZRIK}VX*29gyxZ7^mHAN@2ueY_Utwutt#7tb@-{oVNaj>)5 z(}Xdj*Dzk9H~HOCmYG@+{J~m@u4Kh_+cb}~4iPxjIh?DrRFz|a>+ivp!9hAZ-BB4l zGGxgG)sulvoPpN|I4$;$-A*O$6X#V02agbaloel2ug%!2%r|p@t&K)Aj3IVuwC0+x z{=xH-Fc~aN*xwzh1M5BSgz8|t;y!zUp-Do@cWwJ@{fn*)wRLQbd37#t_z$SF+2<^ z{F%C7L~q#$fo(KcrjENLYOzM@SauS9>f2mj7hFdvh?Nuz7~}(+sST=H9?M6y7}7`cIVWg;Fl{01MI0 zVl6O8tCh-azMs9%ywDOX#YM=)t$}rW@%`2yM{rGRa40{c+Jdhgi$@YXTaAUn^D{v< zD5+>BhSgRQ54Q0r*1^elq#y__gAm z#5jk}jL$Ew48km{f0U=Qto~9SW?7ASvlP)Hb~<|(f``1e)o~U#w~nK|k+<}z!;cOQ z_O}O*sbZIH)K=}mx3RV`&>l=E?ntr6CKwer!4U$Cgs-+k3s$U54}*4{UsE2YLzk6@ z=d3V$bp*p{;P?&>yD0$y&RI!%*{($d*&R>=XcpOhsw0^8G1<@;OS9$sVDmgE=xQ2t zMp}876F;Yr-FLENwGw3eVb1RizS_3zS#4UD9=A;L7l|$pJZmbtg5hoJH&1&1S+he| z5V7_T?+U)MZ`%8~8}M{H@NiL56?MezGvgmVQ{*%{ME`CloE(}vME`Cp58v>N$#w_r zW78@bhGjXZF30T;hzA=eW*Yph6tU6leYQLJd;!vw$>l(_dR<4CF)qXD)bL_0q3hJu z<&Dy*%gV!aYEF6h{UYkc!*fmIiX#$(-=UKAqFz4KIPMiIogdrG#ut6u5!=`QZLT#c;I8Rk#<6tNB>;TY9^( z7nu|uC9TQ)yQCGX$VOQ-K#T;Mh2e|-}27LKpvPnMnQmH zG&{JT!$$@8Os(fQ$~`caUbcWkbC}VdOhzXYi$m`N^|ZtBJHHhUjk1~vAT&DoEFZ~V zsLrxriIB~GD`3O znNC{3eX!a#Xdg9GM+XZ=ykM2KTdWGB9_(b(2-pH7JrNP+z0twNdkWDwVQs`oYk$R8 z9>iILtbQB$L z_V)(EEF{@O?B;I|)*KnFoFLZ&oo?rPa(2V4{9ssv05&5xF+KLDzj6|Q`Atl-AHdoP zxGZEk;0}<#hB@D^J&9uBMFQ5IWf>%AfGWa{aNav;>tLsn__7j3u)EAnTL)vjYx^G~ z$!mY%MM%XM4m~{_TVLh-8coOTyt)f={(@J{u44l|XE|$ZaJK*M%jT9o7{P1IxIP#w zkZ`}gV1NJaSJLRG`vU7ixMf^0zVcehdwWb_Z7|FnHx3s0Npr)v;Oq4RYH>)s;uYGt z$qe5n*he*4r;*og6O2~ifo+0W{(=|HnDN2(dW_67-&eKG@w?6{>7Oz__>zCwf12mU z2iuI=LI(RXc$L_2iVWzM$&B4LIL3d28=q~1&!>GDc-i*hZ`%etbf@!gfemG;&NchH z#nr+Ev+s7nqdIAJY!CUn%Ivm1$EH^*`j>1U%_;0`P6uiPbwhl)NA?hWP*%2gv< zV;|%1{6RRYve^E`U4qvUBYt|Z@Cvx9-BoFpkqLU{h6qB z@|)$7(w3WT->AD3;ra&pIB?PLN$wk!S#>V?OXr|(9Ou}E<p*&%MgryL&Ljf6F%;b`K7+{Evkoq>VMWTx-!PB7S~)(8-+kpE*5f z4*WNLbJ<=&*O&xfbo_c3ksBj`d!;MOh9dZ&ispEXOrA8yOP=e0YOmliTk^(F2M>*8 z<%sRb4^LOb@Mw7U4J|vnoVrk|d&$h%H@NY$T8rv@eh6E3r#6lB$N&V3SJGJUQ0-GqJcz5axg&+Mapa zB7ta_;ycy2`{?AbleF8Je%K_nI6V7W|8EWmZV9w5&O6Ahi|-v2^!b1F&2t9@6LJTv=yE9~vy?9<5o0Nu@&a>Q5&=csG*TT1hr{(TM(+P&ypp>ozzA9lp| zZ54{3yf%$<&3T6eU*0HJdwDLTX29%RQ+;S~#1X$y8R@q!yK*I$c~H=EaaAJGWplh1 zr#){a>B@D*O6|6!d(y+O#iDk)A^dHR=L+d$jWiJPXpd)K)jx1(aC-x~yZv81E@*9N z{Lp8V9TvV(_Cw#yJ3Z*EVX|`kYr^32k4_K1x-GzMv@;^;6RV)^9Y#l^VU=tURmuE_ zXaosD0&~C_L2JP#%;R37C2Apodm@)tYqvFm3v;{U)G4nQPXP-G#wqa2# zQ%Ou?vdTwCL$iNGxsx8zH;7WFvZ;d>2O8t2&8uewryoR}LIWE)JQ^CcxJH?8T2avT zl1962kS4nIPuXZP#mUw*Mjx;7q%SzJV4J4{szPNFqS;lOKWEa3jb!O>_O#+>x(HgeKInn~Ala3blwPTn^b3>R_sU44x1PVpl+2|7>(J#QH4d5rYLejzzXWUsCc_tOF`jA zS?aRF#$i$AvSeXMG00q2OVFbu`s_h7^Nn=!ef7R0_OsGFx0Js#id>Mv#PjZD|98D* z7J*(_jHaL~+NrA;#Ts`tGPZiP+mZdd2D-3zCYsBQ0ALQXJ_blEn3bK=|Cw(DEA4`5 zx;VJKei)rmpGvt1D?}xf=|6W-aC3b%0o#g#->EOqZl{7W0fN-X@qyisO%EcJr0Qh!wa7n}xH-i* zE;AIZNVde!|0sCdU-+Ck;O<}&Z1dc^gURA=SKb}$;4lA`dEZ5Ee^0QTKj&BGxO=Q1 z`G$LfZE+61(V=7l!@A3?yC)ca)K6b13XoCHm|yE$l1t%i zzS_QalJgiGW6nhJ0 z1jd)qr-(0j!L+Xk#&I*S$BJN>eVNWU?eWIlW)WHs-wOrTQFm~>tafJhPA-y(ay~c) zYg@a=BWWbR<~u8b+-DIrQ?4#&fmV%D_AAU|IU=18Vr-Mi?1ZR5_fYYB<>?^OpUT4^ z(tkZ~I`0qqzGC~J{^@>{ChYl37lszvx<(ot50|8yG!C))$2KAt5w14+dWwI@ht{Z2%;narg(6Q5n`1o4NkMpu3hz^&iaqkgVSXR1Mj~BvrS|yX> z-TM+7!!B2hfsr9k*=>Bh+{Uae%QIkOo-4(qH}>-oPUw3fH}-SwH~6=p|K^p!zTUq~ zX=J;9SxcQ3DRa$;A(=ey7en@*F278O8USCN7_qsJ<3G3qY~+%r;a zYZD(=j6fZUc_@qMQ3QH6#T=0$P{k=mfD4W0$NzznIjHo<{|Gww6@F5v3jCC_He}r* zE{P}57+24P)>Qh{&gaB<=WtdcBOaw$KVyL?ri5ehyeG{e4+oR$Ip*_viih8j&)MdN zhl8Gt{E)uR52n6jw=&y45_DCe=fr!T#GC2Kj|64DO09cobJrv6z_Y!4oh6B$ z%;ZZXC!eDD4mEE)5`6lziD&D?*|7|a*gSHkYTdT#fDA1yMy3u;(H|^DBJOIX^L9)( zJ!vjl9gMAFjG6c!Pni2w2hkA0tb#S^6bB_8(?za4M%Ve~%}0V=zK8-gnu?+b<#{qT zj|{Snci>JawsT?%pi_m1wUBnZ0irZf=I1wo_cQ9t2W!pzM`5a%$NL@)j;$e5J{#hT zo-(5!3*xPg6sezpc!Zy^IXp^pktm}sPe^GUSfiufgh{(A9t*a!dH@x=>a?1dw(D}v zc&M%-Y^ASXXI^fH%`=+ z3Mtl~>g~WAvy1G2(nwKN$LAgowrP?yr9y%O4sA{k^M=QRF7FC+@8iKRweZa2 zK_A!9;S)jBtIV7P={wR7wCS9BG}Kn)wDkyjBNWJ{Sv0+t9fs^5NGi8^;Wb0)4{Mhn>3r*B*A>+>0qa^ zsIf6NSiRn$IzMSzCYmrUleLl3?-bKDu^4GydOB!1#wJR5xjhNhDpo9_m9$YEoZ+KV z`2>NJa<*pIlzOCcWF?~ipkD@;c#<8z^bGgovoH9m*x)4>{WOzZYIb=xIHi7_qB`UG zHmZNcv%x5Do9Ess-Yiy${;n+#1F_ZR;emHd_E*7u{>v3+&98#4!Rdgfpf$x>-|g&Z zLYB1me-(6&vuQ|XCP!107P+(txCuJMv3aqjB!Dv=zY2!+AMSWGTP^zXVZnB`Zx9`rAJIXKQs0%qu|L0|g4|Es~-xpjZ0 zb0d<@L5X$8x#5q*b;i%V%Lr~VZ@wD*ymzB9kWHP?%?rY%c%8yWa*ShCd!_ z4_AMEEg1fl_wFxS7p#Ln5iYI^*1><3hndw^%EQd+^X1`R6a$X?b%!I^;IU{j6qBFMT6;*z;~T2mU^oUAg=>B3=E@ z{T>yf+RL$sD*=Y~oSyZ_>Zh9H)(4kXt7>*W&qQwqyYx@_LvX9N8KwUnNgqek;Y+qEk#QTgrWpTZaARgToHdnM2s$o3v zmLAoJN)KYMmo2C1dYV*2gq%8%SyWB$2-2F90a}XBeo(DV0nJ)bMSZUI^Hpfq+Cpa6 z4Z$tm4*f4}5V&qMOWtNXLHzyL+rbcTqIv!8U>Gp1{8O-xH=+N)Kd~0P7mRr)nC2a6 ze*F$NUTi%dyc2X&MdzP6|9LO;@A8-6$KKwFPU6$WO~W-@DYag9aZP~jpPn?iZHsON z+JCjVr>U*k>&C!M-UsJ?cZUDz`+F|0iSiSIQjaqXyWr+xv*F0Vr$}>eHm#@gl2;` zi_|!?m+lto?1a>Vk}t!k3WL}%YxK3w&o}JNskN>*c+SsFq^+8$VOG*=)WBQAtnP2> z*fRM8fBTB9phqZ6nen-aBo|cE*!B#8&X&*C1S*$F$r@FRUI+Rpvz0O!yE)DcZ zhTCX%qTU@$bY9^PhHoK8Ug0NA4kC6YoWh6E#KrmgO*||OmU8i=!s1+wg-U%KoIxIR zM;qcm##?}d?Y7j`Uh?RnZPo%bREhLo)PU6@e2=LsF^W)QX`e}9_&xlB%^ZCbXQcuK zOZ{38I=1?5=+d_<3M$qEBO;)XoUfN7!1A`=^01)5O!oRclYMM8XtCG9cIRt)5%${{ z2uqz5@9K*&9Lee+ka-N$CV3*oa5l>iE=Fly3RWejxfloIP$$i|d`mHk(;BEpR96zE z@o_aY30#O8?QANTy_dC8?50)nOM57VoG9&FR_DdEU)h5Am$XY+p-S2pT~tMBFQiu( z72DT38jz|vcTAXQ1j%aDv^WPQO90c2rUh&4iP$BO#eicuWdBG;@ULt%txu|*|mfzbi!*fWxr`hrCqp2N6NNI{%ZY#k|>tf$<+cdqX*59 zn@p}t)F5gpNT`f|r+f{9C1`|51;?9wz2>zBT+7vqD(Q<1#5p2Y1FZA)X^aM1V-ZPF z_VFYiy2Vu3(M}2^*|i}-H))B~!pOWx6L9ZQx;}OKgxHFnH4yKp*52=S54b9KH^FT>{I*b7bCOP! zg}z|mCMhW4)3n+AH^BPBh^I)pMvD<)IT z7+SO6vldK?V^MEVQ?i5|*+9OgpmPtpk01)>QdrOy|KjUqNw=|RJQN~tv2CzSH@O|b zk^oQ#PNhq!%ehY%qf!^^>0Z0s`x3i?cLVyp+sk3oZYY9&>*LooqQV80CYotzx0~Z2 zq^|ivQLSdg)mxj}t|XA2kHG~ge%0HiL|wDFl3JK(aw@ZK5XR^=d6_u7+7(9EQF~Ye zB>Ia{qn*aArmseGw>ucdVjoFpj^>x=ibMF;T+d^YTlpr6&2HLxL`9R41=I+36z9d{ zv~!7cmBkZgDkt&gr7&zQSW!22gPhdAUa#=;E&r>|e_Y>_exzNW9ZvfHvG0iRttApX zF4U!9sAe9eh3WRi$XyxaYP52E@e+P<5(!&=mxV9F5qaDi!0(PIX25Z>o#a+1m6u~v zE@+dEL{LIi6&7<6-l!_^d{pI;yOP|M%3XR6NZ97aY7-6D!XhXdTEdMr$XC zy+B$Nt+KgLsCK_0Kj21&UJa)S$xPtV_bStlBy5`)Zkrem`(CXknq$TswRZ!Ss2v`% zrVA3>SR96fS)3xb_O`MaPSgXCFkW4C_f@>7N znt@B>q!{J~^C_b?Byley((1*yr~S~|2Ss@=_D_SUqEYA}X~h9Y^@t_w-7KSQ%C02W zY8AG1YO2c(QiTy*FF!+a1vE{yAJ~T6bK7)W4aISl$Ur)-20JeA4rC*YX40J8BpMl% z43Y{*=6KRnBV$l(CQ+?SY}9DFr|@H+Gt|Ia!qC+ew7`3a9b^eZgv2Z~c%mrPZ3 z@B_L)94y1l55z?bF{@7W0gYbh0J^XK?xHZ+_#LYtlo#8Vg`IG-#wXU=(y7FGu09)x zEg&$^_aHm3@4K?vqM2B0GTOno47_e)d6vUgDu0bzm{{tv?$0v(Yxe3sOzB zY&nutTM&@3-IdI%q6mKE+~z?H5oz#>nH65ux|vO$C~I2d^|lGnASTva~R-07uLE%}P79jxhYG-ua@QGp3!N@9s(m{omB zY|MP?lj(`NT&zShZu-<^O|~-7WoJaJMqL)}D3%Uu{`HBune-EO+ENW-*YXKUkf9(Q z8OF%pl&wxFDO)M1Gl@+Tp#*!Qzvrp-b)~sYD2(0TQ1TOf(H@GRe!Tk`%MVbp%rd@qyU#x3 z%VHM#JTnm^)Xf45$N^Vs`2$XFoU%b^$6Hm!p`}#$s8*og9uiWpQu#R8BR?TL0?u1a z=eohBCgj`$DALuB%rNol8PaKSS`Zi>;C#`wb(5Oy|4HBViq*?6GQx6j*ewgOMT$S2&%p+)9LN}V)XuoN6 z3k!5Z28F2{lp-MSx+8K|NBJf?PiJ{(R>}M}VbrdzKD?xp^%GhSxs;wHFRu@;DsZjV zpgpJ-k*v_8K`yfunr%6V1~CiNX=%UktHBzXL7;Ch#B9V=Wf)%yPf)n06dtQ^R0@w& z*h)Vq`*5KR@Ww=BOBsa0wIWEmbF)oYOt%=D#%M*ON%UFGqHBaDbp6o<>=rVFtCGPD}jlsw3=9g zIqdK96QN_I*~eBE`cd|jl5YW*$j|xM>X{1jFeb#%^o~gjAK`OtTo8%SOQ&LtC`pH= zC(R;))1moGBSe=vG{I?v$d{BF69}TYXp{ER`djT`+>ze_7y&I7eXkNd1zb&WUBS}X z1n=7fFN^n8C3qxw&j|@<8g0_?6WO6EyZ)$y^Wd-|>NDD5Zm3M1L;=N4a`u-rpcsx6 z?kJQZkN{-MhlvnCVu4}-qyLYDw@*>cnjxITf>)KS){ zd7J`?DeD#(O+*>^L1-e%zz;qXQPwfgnTYYFo=OUwux905oy~4&Cjv@ZYxkVm*i35< z-^Lw5Zdm`6meBK#AL)|vqxiMVovlIJSbi&_XoVGMQ3t$0H#1%7HVWL~B~H57Z4~&G z?Y;A674TtoOA*HnRxGvx{HkP<#g}Qc#>ob4s4qJA{S8BSzUF9TgLmWUW zc55wh?|}#oy-jokA`Supdc9IzS4!Q6(k`BsnJN63WI*$l&N=02;ZK0tH*cDi+MBWVKjqk*q{juO`7V0!@}KjVb04 z;Tl`4O@ytl7!u(dR}6_TZc_}2aE>pAUdR+?M%xyH38mLTQ@Yzg3@H!lKd53^sYOH7 z=_njKaY6$jdHMoW`f|%S-MzL%^-v!uQ9Z=qm~<1_`+YY)tw%&nLu@Lwv$2!ZkZu+CWjZ zAhsRz?9i~KU{$JkhHWJ&dXMcsc>9rv&J~=4FFc~KhzQ%?p`SbLvN{L&*w>De;vL>@X z^qsgxCng9Ll5l*G=yIUQj-jjXPS`qbC57`M@j8qk=CP7Xq>xM02xn6s=hw#tFs;69 zlcsszv++tB6&?=CKjdE1wS?Ixs)A7j81T2mQcuGk_6W9!-KmOWR%8{0)la4X=6hzo zb|2(BVN?YuFiz#2#>+7noTz#4?z|YCaNj~VuczR>>0opGW4Q6Xks#z+s6kh(Fx(QO zaEGKk6086;yYaRP)&Q4e{W6Lc>Xp^C?4#)JNLoZts%unJ<*X~BB=k%; z^nx=Hr=k|M?4(=uKw_+4QAWB5F#|cGM!||HNui2R%ng&tUn(ODOcbZ+jR9w6))rhm zq~P~5j5Q$w>B5eBePvxiMgW+(BC;tN>7>ORjWH>q2izQUL%B<_$X3S>XkX0_hnx_6 z6eqy#6Gee^u0b-oMth&5j^_n73F0_`TfV+IlsA%U%j5$hXQW+vHdc4s#^?s8N({3t z3RKx1C8<{wieLb});jUx6^O2))8RAm+%Z}%h4)`a^7B`M%sqU~ z{7#j_wwvZCI6lUbGz`@AOeVm{pdC{@Jb zXh8AkA(%cXOd<=X7@s{%R)e4MSQLma1hZn-(w@yf_oI8JV&>!#VOODz^GDtSu1RxQ z<4!0%{%fN~o3N+uSDbu09}&&nwDL>Avc?H9@;RcXrqSr_K}Kra;Wb~sAGKx~hOD7l zIr>IjEjTDX_c2i9DSjJEnkI9=%mM(o?PbNSkTR?&sJR}0_kEBWvUpfFA|5Q$>=wYk zQR`d=XbuN1{Afs_y+GYV;Ntli$rUX>dNbh7TB^^EeCN`0Bw(MrSb7Py@$l34gp|;a zy_6i~5iscWSjS#pr*qzco#a^$k8mFE$Y zWOVEqvjDCa=lA4~x92JK9U_}hU#)VlUX8LV+hcjuvS)p}ZH$*+>73J}WZH4{)EG7I zS6`u$L+YETXUGZaU4aVlxWpl!&8d7ioF`eYc1)23F^r)p?wFMyqVJB@&AsH8AEgzR!EDnh!nhr^=Z#1O6>)RMv_deM1WJt3Z(!^=rSt!tO z;++L5>Szm%wF|8CWXNhQ9;#R%iJYE&3_R^D4yX8Gr%yew0*2~R4+N5pdaxfBl>sW~ zU~&JySzTcZ^|?v zjvnj-rS`@voP~dlKs^gk*TPE(vjljEr@)l}UOr}-5+GEIZ#rC4k6qgZ|AM^}#! z%&zhVy#hko3Me+2^35tPWV$Q_1p=m=%0FhxUHyC4^UP99F8HTYzR{MQ?u$z(%sn+JgHP&ZM(|0ocH5f;R#U_{;f)>qe>+)0C4r>!nFidbqStS0hqlt9^h zBF+pj4SdP_Y{YLXJ1IYK5g7RJvJZ%rzy!LjXI^omOzMG!{pa;8$4r8&r@__p>37ac zf$%@8hfO&_{2Eu|4$pz8juCo;UkwosiQ$xnxW$3hCdF6$&x)t5FZiDoALLpuyjuk8 zf2;F&WD?gG?-0*se(lqk(k8~8l2-O7*^>*-FjBfH|F`z!3Kp5&yTsG!B5R{PIs9l$ zMfcdQR~IL2u{?%Of$pmSvsWG2a|vH%=aM$ofg-B4xsz1K ztNm&nS&|bIvdNm{@|IiJD&5L*iHmv)Y=ga_jRGBZ&<5uTkxn`>$6P!$LOi8ME)ST} za4c}!%g5|{bSjZ9m`*O3E2xX-%~sTNiF#P}mpBwtabBRQIG3n(I-ydesywv8m3}9F<0EC2MsHxmgeGi4i>y zUDKj+*ah#+Ebudn>-S1PT>*O$pwt4)VCU@fM5hN9BbjkxC_EMy+*dKm1H4viOa`iw z4<|lAkkFCFIJ3y^onwf6$Hp_J7yLy3%qp+iiCFW~bY>+&kj9qNRMy1uiC9|l1*6ba90iY!Kw3x_%(`C}VLCL`DDMG~ z$vh#P)V68So4<%mG);8)Zk-X_n#bueCy2VdH71ovyg)wSr*4oW*yxPm!uGEuGy{}V zK0w^d6|vNpGVb10i=N~SMd`CWnIo| zE%Jh{mK#8gcpbh7%{~*uX@$Gr9>~NP9!Ay`-~9?N1|F@@<0mhEN(tHQK!s?x7r&%n zqk^a_VE9kLW(76Z@p;;I+Z2RSd$CclRYC3l@$CxQ%z)dA?^m#e)Y@Fe)J+Pv8|{2z zXx{)AQa?Rj>Zj*7>&ahBs`=8S@PO{bxt|0#)-V#zn3bVI8J?OHc6Ps`U}g3lT=bM` zLrpiVeZXvcLv^b;dSNvRkNB7FuBxuAuCC7Te?@h55LQ=veA@qfs1a_B{*W|XUsbBA z*s*m=9jtCwmQpdV&b^r7;O1Rw)H~*24pvF=v z<}Z%z8l?*8MJO*)j9N5jPYF9ew^YGkOHh7wCqF9Go`d9aT{tTrjLc-;<~4IXA64qk zD3e{TfK(Se_lc$pJ~D$smXIg~sP> z%!X2o%rm}$JD#;{qCI$+$kpk0PN1!^7ZVD(u?o)%5Sa0MO~6J<{QMx-M{V*jVf&Tc zTd7M5VSbojUUopxn9WEsa={(+Wo9GQI)y{^c3}>}hOY>=4BG?#&J9YVr*)Mqi&&`G7_z(SC{0(-_2T#BPbY53W!Sy_-4t24JIref6c!`hX5HPbMJ>1V+^CRo5Z7)2vsmU!hWdj@Q(12gN85hLC3JriQtFP=}$Q>)Fw+XUbz|PhM^vV2(ky zm%s`#m^K8)_4x0=SerAahNE}ZO*))z_Et;an0LZ@Eq^OUZ?ttfK7=B3J>Gr| zMo7rmx5-?t3A)m}Ff|~))fbh*btD#Eo$0{nT0Clyd!s$CQPVPbyN@Bgc+88=? zoJPCe$JPpsunKJ>ZD#MC!y$zcQ8iwgaT2S02vaf7VP?xRv}SbGXBS*KpkRyB_cL&9C)W3E=>yHSgE#>~1t(CLTG zKXwiW7u-Bxr1uovqG+y=pVZswsL+%+$ZU&pP~WVEa7ZT83RIfnZD(1)4B~3Q;&W3n zM@>by<0Fv}2D<*JbY90t2}s;|sGVqJZbTh|vY@Y!>COAjS9=oYJ74WdD4BRJjz<<< zfr<=8({N1Rq^}N?vZ!H}eV=$%eq=OC{>CNN0~+g5ot0;3u)EjCd(a4p*+*MQfT>LA zw(6gC!dnEt?oe3zWmvj@8FU)WZo8r|<-ieUGTuhu*qc?W=t7S7HX=&q5D5WS(wliWsg^>6lH5PXfU)Ltc!Z5 z`3Dx8)CLdRGsA*GD~}fc&Wcrw)58K&)Em6(=f>!liS1PdByK35a7e@mMY1$Aav?AK zRBj21L4ZG-p@}IiL0#{=f36)ZWSw)M^JUm@D09R!ElY3@i{IoHO~*k?i)}ZHesAqM zOyC0@KMfK4! zw~zm9;B3%VA-vfx$z&$?Nygga`hoVi6k?0x-2>EZru#i~UmKNMyGdTlVkdNYk9zaB zIIPS&`h&=Xt$s-ju0KtjAfqt1X|c8a(*g8^@g+bcdM=iE^qa7pRdnw_DVK&g< z&Z8G2To*nh^r`BOD7=GbF>`XZ56ob#c39VF!W^enY^5r?+U-(hFJq}Xnx)pRebapN zQ{m*o2v;|w2JunOkA`%!IcNFk=+0@aW$b$E&W+MZ@f7f-`;I8@dN4W~Gpz?y^Z6CZ zRYYSJgB9#MwbQ8tp-H2)O(Vu8fw9PKx}|!!l>=+D_>}i~pvX|{PGY;ud&P7}W|!T= z?p+e-%&_xpRWwQjn>}oV1q7#ygq)6ooQ_Z(?1@4_vwJwSvnp3%UChHyLMJTy=h$BJ zlikCu3IN`E8JjO2XH!-WnB}#?H)i!<0AZ@`4c)wdGG31|@Ot%|Z9Qt=?mZ5_0i^hk zUJzB($&x<~i9J61Kp`sTSXaEB zk6z59!k)#JnGmtB76V0YOI2a>lA%?xK%BXvWcuhH-4^@`wsX8U>0KfWP$UA`4Gr$TzlF5EU<%VoRa4IbUa>%+!cYj^FA*tEkQJLGUgWeMSg@#FVG_+ z?sFBN!`zCUtZ2JY#SZmiWkh&i>Uy&A1;?T-3t9vb)5kg_r zwUC&2Ar?C1mJ?LgaaMK&b9EfC*K)=RM@oy4LxQ!inW_s#nRt8qz#KU3_z*%T`olyVn|cy&N7 zScR#h9LECH)S*|2)v`##8gOc4AUn^Z1>Wk&yJK>YjjGLv8DV}%Y9FjGGaZT?TCI57 zzozUX=9n2_`|%c%A<9V(rXdy}QL-5!AG?TECv&5RiMAax<0(vcI|$)FCM&1A_NzmU z@zs~veaFnUvd6_yP(L!b=h~ApSN5A`-Hh&Dl*x{v zV{rXw`q<9rE0Q-ZVa$mYZ)0J+&?`QS33cd2#maWKn30orJ|b=zIPabTF=iMO{w@$~ zIxy@oXxgPHKrTbnkmcKXOz%-!l(?I&A5Z z*Ps3Kx}BG}!y5XW&kDe9vpI4<&U7Obr-t%xhQBO$?( zTT*XzZX{=C*@z^Wj+B%Kgd+YF)}TkSeejaoO14AC^5n>OaK-rWlr)5K{ zds!qMu{d7?au=9rk#mbb+{&&2xsYmlIo{0;jxa3&l2J~?i%`{RSY8o&@_>9=jp$(w zw1|qSsy8^(nx2qL&@+i=#hpw%`~Uug(nY;HQS69P!vqdfqe9IzUXV^8cB^UUvC5;U zrQ5z?M{By3Z(ST=VQOZSPXOo1t%+?Dh3(`EtLMoVyGHU=5e-Vd?4SX4uos*qsArKd zp$mIW7g6zJ`=r{}))1+b#cLWJRt$jkLyG}0K35E&Zbc%pZW)EZI`J}R9c$Mtob*;cS6<{w< zh4tni2PWs3h4gHTBI_-mV7R`xbkvreYwBJ3UW&1D0BIgx55K|<_x41brD#W<#! zb4Qv--0XbYLcC-Fof|^|8j7D*VAV|nU%BYOKX0XZ^02TS?@zBE7Vgw+dkyzJr6@i&6All*POhbghh1$+(=#OV z@nz7OdLA~?(f((Kk@@h5u+lvBx$t0b zA9LiHVY}J&h_IW|pF1KP(E|2sKp`Bo7LqIxn{OQvw$c9LBf{k^&j=Def=IR_+kX6v zIra150sc$3n*aEGcqR25bYytgC_9XK7PwsX_km~b3@@AyLa1ve;2IF_tdn+v}X?o7g}FNB9Uz;FT~!2xEKX8{BEsK((6 zn<=r|vEe*dhiJZHUN|;9kUF;cVmV-%LD1vB7=B^UgMy582KkFGhPwdfL8_k5wei3NRC7@A_#Oj+?V;=kx z=(CUc<(I;3`jU=qxq>P|9c1C$;>Nt~m$wAd$;RJl;VJ>I>hr z+RQl4LVfOW;jts^Jn81KCV~1{*c|cg%_BfRGv7h}hU3EvT@4(SaBHyIEIi)U@Z#~| z7?+@1*$!ad_LcD8+PPZykoH;iwaWO(g@DFtDa`&#IBtwfl_&!nKdNd}i1ebj44a`)5KjY;>>r$IP&n zw3=Drukic#>a6fEt%Y4r2#*3`ZayKrzmrw1o<^DJ9CE;eQzfy}R%cHCYIqXP>3{oG z&`LX>7QIavc49b(;r%nuy_8v6bo#g7i{G@O|ZR~e)I9R{gQ^HpB&6C3# z1ui-{9Pd43mY<9&5y8}ZIC;7uFJ)3Gw~)*(r-Xab(uJpltIP9$`P6WD((&qOog8wy%wwn0(^cl(Q^O6^_Peiz2S8GHIxRF^KfByvt@Oj2C0#GB zck}vb;m|#}QiMQl(9JwYRDJ&ut&@x>b+W=mXB*4zNs9CZ*+J~(B7oazW}F@l@jA_M zr-vhkTALxARyx=TF-5@OM>|dSUj^x+PP6#*@N^Az*cld5`<-Di_?$DsqqYd34QGVM zQSqT)52s`I0BI}L?Swd0+2?H^|KzlUF@*f!q?=d`Ap1rB_c zO{+COxhUM(gx?I?R9p8q!!x#WwKZtM)IJ(i^irFOp0`>WBnyqE|C`}g>F%hr!hI&F zyWwL9YIxF0JSXoJq6)H(SN+NqyBeiFTKk(On z+dOb~*r5(ScXs%hp{ZQak1wkz$rb&04xv~3KXp!cq}RGsCalN6hOe6YQ)~-e{8RWC zb59|hg8S?@3*p3)|6^DH$!r*y7CS;P@!Te!&8!cYV`sB$mzeppks%D2U(XJAQZL%i z4R_G*f#-&6d+i7~C~LGF>)c5>MD~U)Z9jECL8Vujea;KVtJvA+h2L+&<0lXUz!Fni zr<+sG53lgPX&yO0JkWp4nC?03iNF7u*?mqpVx$^@gWaFJ&K9vZ9Vpqdj&-e^cCop1 zPWb6&<%CRBxJ32F{BBP8MT=3c5dE}d>&Oej{cW_%&dk}|4_**%-)hAfH26i0ir=GE zPvwQ-j-GGg3&UwclTp{@k?AnyPPI~>wvL4thOI}EMa1IiAFz7I#EaGpB>W83WmT=~ zcuP@K&{8HUXmO$f5wldoGtjmIv&-6jmlKs~z9>9X=9(|N2wLn=+x+mN@UAVPd0^4} ztB`^0uF=-i+RJ!qqp|A782bqqP@x$^yt1kKOT4KNK4pe2b>D;;j+}L$+U!@&@QcG4 z-s5KG#o-|x32$u^6W;n};BmY8)y3hceJodBD~_JW0d|m?+AALN{o#db%T{AQy4vY! zRa+@V1yF{WCIHuE^|Y$(*|Gv=dhbiZgS=LA^Ce;X_%@mNU+3jUO78ipjK`AC-aiq> zd~=K9-|(g7B(z^`Ub`gxly|Aw`qFTh$(!+^u56WdZ`)k10xo}9mDM5RU@*H1k#qJ^ zbMvKPFFV_#mxd2PcrL#zJWhKrSK5_I|L%2{TSopQ1LHdWa>wQ)_$P4?9Wa;M9s8G; zhr?Z|H*CTq*Ig0raNr&1fl1=xArCt6ETl#D#CVQ$-8^*NpgNXWCzptSWn5MQg5*k6 zmX$Cs&3A+^w~$`3g?~GoQVEvE8(>5pym>j zD{=bXyl`y&O0Cs+Nm6{rdEriOC<~LAbLWLqfy@K*HXq|iQ~#}S`{9A&ojhlsK zuTJM*W9RmnYr+vOK^TK}mHENj(nj5bQ zYpN4$TV>8&6>e*WT^Cj+qgacFon#bGRg{e)zAn6l0lacuc$^ym&V`BtSXE(9)#4Hu zz(7S_s0fCh>iW5ic*Xp|*a3{0zxl*%cUYY;E{s2Tgl^Yuj-#tK$5C4XNS8`%grjMR zE#YXTD`dWPe|Ti`Lf5^J{TY!!UuI#2@g4|An04O{M|UwUy*`{eHo+Xh9NLd2lI_5`73k6-iXS9WfjGh9 zy_T>=@3H2}8^WsSpALH?9N!$e8{v2nR>E=rgGc&X7KDR~NIv^U`0Lf?vKu)jC;0sM zjTWElZYokIKmb0Q!c8Uebk|Kq@x}`JN34* z>HXfK5)IR&Bs7e*SWd%^tyzsEN9*I=z&v<$ILsXJop8s5m?1eU60<-^9KRu98pJHH z#Ox>EDH1c{Mc&%KYiYqj-~HbavmuK%C1xXZpI()ytF8@-<9RA58_&Sv@Rs6uR@?Cm zHFKAwQ>6=YA@h?ic$; z{o(tT-d=foc&sC$^O8RO<96Gp_NC$Z$u2-bNWt$e4X3k8*DrMf5=S>ewue!7gj0sx zmdIGO=feYLZ}X!;;@&K~`R{jxpYBLh;%7{2NEE*yJ0U83=0EQUd)pIrdZk)nsfbdD z6T-oxpRY z>A5T1j-Sun6%K1(B!XX+RfAG}v{XS$P}srXU2uaf@lN8z@x{akulohDgZu`^+Q6n@2lSVB_a zL*3mL_M`3&3oZfCu*HXEcS9dmo638_yh{)iv^7t-Cp>ZZWo3I8BjH)iLX_k<@Fd*+ z%6r0*)oCX4hkL@#PGnQ8o;NBJWkO16;?N&9!|%0+<u+`m-)3H@R3j%j1!_)0yh6GAw>8ya6&g>oVSDFmHX5*p9tPI16I*&nuV(mh?7 zq}}_l-*#`@@^BAtp#Svc;bER&y!OZ8zRbq3`@&J7P7da+t5|GYGb3b2TqVT6;=Xih zMwzGX@81`8YHCmyvw1fpc}M>wWkV#OOi9mr&$1!wh!XI;lnrS&kNqUwiJl`- zba~qqb_JibVskS5uVs|K!kqo(e!IPV`T@}EQS&934~NUX~}rc=~~q zW=T$}fptG<_m@K-+C;MCbbdir;x1F7Wv??#oh#B1PqKNv9V>@k7aIN zzv|?mJl!@0SYT>Sw*G-8@6*)dXZ|Z%QSWhg=<%9$(E%0fSh=w)CK^4)AfG)^HflWh zfvo?Wv#9^)Jz)L+`~&}7|G)5H*8k~|ZRtNg2ywXEw>=bnX57nb1^fdKMUUq1@yj2M z=4s<^co?1J#!vX?AC4}nD?a~!H%T4ck;WBp(U8>x2%sUL!_)Ph~%UPiiM=tk9|CvSm??78afWYA%R+#oABsS0b6ywGHuBdk==grlae zR&=UbNLE@J)2_5?NJBNnm(3x~EJJA8(l&-PtTt4(*V3NMFTw#dSHX(6TTmfEpS2VyS|Sy=Kdny z)A@4M-}L>Um+tyObh)5#=?|jQ8;VZk`({OFJ6i|!S^UH3s74;N;mRXJEtaj!nUnIo z>xa?NJIjL^aXrrue;DnaU+Q1{VKhowxsmv{sS5{eh^EZTOnfj&%&JFxBPJ2MY_nu< zwwvtI>|w@%aznQ}Vp~f0`P-;tXUz+;vM&B%L$v2RmSXiP6D2dbiO`Zk`ceE_D|q$` zG%&0*0~{KgT(CQP1|trH@y^`Xa{BP!jxR^ulP}P^ltTG<-)Lt z^+zxodSn{p-~1@Lve9c6D4l$?960#HHZn_B{}>my`}`Mv+&sXvHux*%SC>avb$|MC zv?udB?kCY`&F=v}iN<$nYv_&zwEj%>+kXN@C{{|2m9$yMU$&)+v&pE zGLLbXG!03{9X}>%$H`z;L09}f>EHiUG%_ig_j-Gk>H#TGj(AvJF^ejZIIGjGO`6GnoI z_gHc4!L_3Zp|2e^#J~6F(Z@RHmkSFP_w?w7qC@@AUqn;RlqZZsm?=nax`;C>IziNL;Q+gL=SZwTDGu{1#Bt(C7Yv<&&h@P{<>`ZhhWbjD)4Ku4-MT_GLjovSbW{9i|V z)&f1_fT}^y3}vrxN(qR4LsLpX|C^dp0+B$AP_HMDlC6ytVf((~?4s~KH)RzobjEM_ zHHYnMxydy8D1t_3i(h|0JjdU+g(KGMeb;ZI&lb4H`#*jI{ao+=@*B{7&l>;E-$qGc zK-&zz4Gmmyz=DJ<2%F4|*DAaM_yfr`adkAq#&W zeKsGh`OWX6v+|wwiHVq)lm8fv8&ziRplK1lHaHDWOy{kTl)1|^+USec^*sjpb=JRYAq4jJ{WJRB#a{0yRsC~+jE-uh&8fMGr3d}d zTcdLe>vH~gTcbTn^XW;23p9%X%9i-bGn|ycZw!7Wx86~OOyS$gDeEO+D{y9-k9Eue0CIw1Gwt${5Sm?|0!SVjm`5QQ z2-u*UdZTMjFiSHOBKE{-u6!v<>kaKJG{oZS2| z|L-qEBmJg7NAC=nEI|QF??SPgbz&@d+iZ#A0jO+~9iSKe72Bc_6F0j+G4Slxg@8F8 zw$niKDMs%s_%mPRpy0=UiS~O#FxbV2U-XK)db1W@rrD6wT9vs1F%ETTFXJM946z^n z?7tGmgk51PkG?4dFoP{yc@8A&Y3vM0E39}^8hZn1NLL=TT6NjVYeO_vUY4qw+jQl7 zu;H|&C&+*eXmP&2_&w0+ba}D6r^qs6`OEPRtG~)V-{#-4Et)m=Rm`Xvr$7yDWSZ%W zoC|KI@B6YK!>Jb_Q?Sl1FKBLG6U@xttzX<<4$G_=$t6;^8(a;62ZSn@z>+Brp z*FPVPd@a-Wp8uCK_iC_G14KGY25d){M@(&OAmllM3$jGMc%p;C2(E zU<)+gYk_8l1xh2o1eCQZMQ&(`35O#0;zDv;ib)3=HTQonxT4o{HQE<@ihF_Rw>jbDz>;ecQR?hI=9T zXPdD3R&~c$WB0zv!hktGH}jiNVZ$fQTjZ|p7>*Ry|%JM;k2juoobC_MzIbc7~p zKKgg8%k^O!M9JtNIIh~@l@IkV4sxUOZT|5VH*7)J4C~DTJiA7sY2ChPN5EuXf*c3wW8!Q*Z)|tRXw84o?oQa%njhKGwC2rJFI)3w>bS)Jt|P4Z znVspHuM@$uHHZJ`x8`E4SDNfdOv3Hg{Habi`jm8EpvbDT62~SAn->2?g6efgM)r!ds#S`H`;ak z#|F58DR}?mV}lsrN@`;(4|L;4S228ApF@B|V8v49G31s3aC|T(*e|*A(5j*slzxUv z?skMac~4fW{%%mhxO)v|kdY8aTX`4{i`=eYyKJ6&2D&})c+sg=4okIIu7Ij+9_(9; zN~T;5Z#XYfT5jS1oce<3T$nG`0R^I~qRCZYlN2NYgp4DRy=2-2<6M`EbG;e1FyBZ% zn?8x7om|`y;Wo?@J?}(4*F}}x%heO24=l*Z6#(91Mj=ONWE1m^8*$Q(`(?bj2hxex;?efv%Xe zRUvJUbo7?S>?z-*kS0_*DTt23w0QYzR)mOCEi-(ydy(se|$GQ%lrEpcI&;oCcvDtrs_np}J> z2*3NBmu{cZAt82l?PLBTDenqyFDVyWRYiLtJ<5 zXL;^>q`yrYPyYX^wjrx0vdLi2G^IcaNoiICK=esTq1sjoB@-#lS^$(xr1UlFshO<` zl(mth-bgX9+N8pzGS4#z7hVaVo=*l7-my-rG#5~PlfAYyG*t4w3X*tJ8fQI-V9?t% zjk`llU_(6b&$fW)kp zBR#I+C~N+1v_t}Exc09eXecveJ!Y8+HS)>4x3JYo`0))$pLf z$5wvzhZv}v=CTPG=y9Kb{MFz=vu0?_u&QrN?-qVFCRcrGOs+cHm|TsbF}WJv4wFll z43nCs7%adRQsYcy#x1O-7$fp3GRbK*G-jCu)08C+IW9lozLn(r9hz;AEIMPnO+= z^V+Ae_Rr5_eHw*?7&*ay7ZVpFQeUQ z{^Bw2fD^!%mU9WBCHai6Zxg)5R!(ACq3ye{J#?$)$9`Abuu&CH#}kx_3n2{`YH^BXMIuVNv_^5x3y6+EVV&v9TNtmDG~R9QA(EYZfQ{PN!KM18>7Ukg05u>kGDA{8U&XTfQ&`k{APL znTKJ!R!5>Wu&QlW8i@&8)xfpre^_?A?E}Ymhne|SEs z*6f|dYjn@zJEd90*`y>*EKNE-n2!|t!%)cF7z%mjGcMBl1or$~uP3PBEe_8Mc)|gN@Mz$H4BtbmP=l~d|-TlA6#|g2mjaa`_c$PNO{FY z$%DW5hg99`^G|qRbrh! zI&`?{Q1nL=+*$c0{=kXOPRrgp(M|0*G|-s&499i2uN8Tt8s%pUIKS9f6XimK9` z)LeUI#XX_?>waiMoBYs**8R{3^{=8#0vD2v-bn<8UxV@$0b@%RlO0>~<%# z{^w`VG!#k?`G1-0PMrM7)DMfM6jXu!bgL6wTv2+6PvQCkoo@QaCc8fB=-tze$Y1DJ z?&&U(PO`k0s}!EQ-XF4;yDW21v!MhBwL61@+7I_~lWOLm)`|im&{paW5jXI|Ayhp| z5N@M^J8Ojc`cS+SD4@Q&(Hf* zq0L`4#U0imY%XS@h}qu{r?}T0u)SR#pSMU~D&G^sr}@-ldkPjyo>vl4FLnAW`=<6{!{z7J#L!rhN#wI)7@8Q zdqo7C5ZWvq9|Adt=@uPJqq6BJI&dO7ingEtFHU#Y)FI2-WqSY9e{vr;)9?^+%m9xJ zhOKWih;!n9w~spxKg9#~b@TSHh1S~084+={kge_}xnpI42>qw_bqi~$PovFE0GTHV z>enw^NFn(&lJ#w?DBE*K`fcUeg=xXBv6l!T#ffSBd01k^$~69bFYuhkpTAkGa)>`K zI)RI03K;&B$D+ObHT$`L%OB}mXSnk^fsGJ$UapL_8SdixgkydWk7W}+(jWX*H`!00 z>GsKAH0Ka$?;49OjLH;5j=F~e&06-w6e}`nBxxLF~kP`=vo!YXkB<9%-i27 z#Kt@KcNd2-iQQ9pjNk9?6k=nq19mot7BQlj^jO|7hl}%yes00&nZq8!{87nQ4sf@G zYPI#0a@v9JB&z-Lfo@u34z-Ved!U;$_SV#?MB*4TQMwi8p?TP^9~t}@Saf1rXcmo4 zQpI1G>&ABnPfuu}BjmVDo#$ZcypZb!dEH-ev{l66L%DS>=NNbUVF$ShSU&B45U_W* zKkp!S=CJf`jiWlbCon*i!%1Y*L6F6x{jhm%zhUY98fh$SO?sMRa;HVPR_7g#71z&W zpJ&mNn|my#OkMu@Ja;tB?tL)J^?*O@U^k6lmmCbXyW8J(usdm|g(d2$@R0dd_>B2h z_`UP3@a^-h@b~Atw}T7kCQc!G{w1-TwMBmhH+LkL1kpyZ-(o-TaZes>F{w%8em9L~uUA`c-J<@T1(GaT>bgy+^t8hGoo1 ziV;E-VqwX>{q9G*l`mWSh&YfGUpU5{I;1H~ZHgRmGd{*y7?IV-xS=!E(VWJG-LA&f zZsW2@D&agSx})3@VnXjL;hXCk>G5;NI17-WDiob!$10LcIJa6T=?5L_Mr-L*M$eBQ z>-Lo8Ds@iH$*qp_2!;13=X8fF_TS)X|MO$ru^91BKhBwBmCBmMSlVT*m(Q!Vgf6oT z3P0?>a-2J;@TE`st$Ol%+VO6mx~V=f!?4@TO!bR8X(2$x<;SB~C}2nb(G#47k+}Z^ zH*Mg|GG`PLlKCUs)aXQa@<>eBBU8!cxZ%xgllT*1!hX?-?hpC>*PQh__h0$^3_tlK z_hf#*H7}jyy7;-K^JI5Ze#oIwKupgo3-CNPjheZ-#V2Y`zil} zQ{9c~J84&y*8Pl9x5{f6c!^3YeesR1XY#&Abcw=`HiU5a^Q9h0%pQ7so7z=xq$~US zD^3SIANT)py1P2R@0z)9a{F7e?|rlTBqt00={LE>V}xqMIY6ACRSx#X!Q|F|^$fSW z@zE_o$I~JkCjZiz;ov=6)qT!#qb=e^|45boO=p2X7}3(RTzOAH%*%53Auf6g5j6VF zbf>D^KT`j^SF9iVFS{x%$Pew|xK5;hYk@cxzdg%+K*z+3-hzH9jbqXK7Wc_ID_7r_ ze(qb{oHjL=2mGr3E3YSpw0`DbYuQqH!Don%*R8p&8Xno5yc6wh5^sCh+ujy6R~F7G zU)P8>Mz>aAv6fT+ZVsDrYCT}yvg}K5_)<(dM3BIqikRoeosH1?h`;D;cW`GKsZJk0 z>%VojJ7GpWzMPP6h%dK2zgSG3eg&s;*NFo` z%|zGLq4gia0qFbZvQ2Qje223j5ux!M{K>KJa7T@M=?hGRcsvVKRaAh4mgGZUBylK- z{()=VKKu5|Ba7I!MvkU-XOOfu$OZXfNl92=OqjC_wO?wBSMCdbgXWKE3#E zr$}0Fy1?z#SmD-i;OCcL;AWgeRd}>=%!-C1RCQZX&K!0gi6;#9)j?mx0LTEj$tT!r zn|?Sgq~B`#Hc@Dm^W_VPgptzxBQ7+Ex$Z)D!VaEfjK}~3b((`ke(^$>#C5)Mk-NGs zoC;pXeaY?TH=gSz#Ml8S0SR?GpgH9|ZvQ!TfJkzOSBi8o$rCFrAEbcxr2l8T#S>zz z{yy*?_xfS!=cD8$ok8RMexHjW;!Pm3`onHqhZaN1LOHU0>teT9Q+>$4x)Z~iDQfNZ zYc`|Zs$>Q`yZm?F?e-d?4S`~gzuPj?1i$+w?sO*L%1hin!|EF{U9Qndp#m|#0Ey&x zm$V2B|eXc^NJqrYYLK;0;@<3_-I0FhrA-+*Zvzc%~d{F_^yzr}yz z{cgdbcRmaf7-*QG$^V8M>E&b;>`7$69u@vKnpd!Q+_6Ge(9q)R)vqg@ z9;+`|$AsbtZ%sZCr#wRxA6z7zwR%N!c+v*mhOxi2 zdIqW})B@Twt)9Q&@&=8*>2mk3Ce#LQG}Jci18z@q%p!@zd5!`os`&FwQe+@gq3S`5AtTbx9ofI#WvR=P*rojk4)*Vo+JgV}kH z1VM^Kr3=@z_8|8P!@l_n%osN>^H*NsYMGMH+6xqTGnX4Az3EuW#{Wt(#LAT#FR2s*j*hg`n60%sKs$HT+ub^(MN#giS#7 zSM3b@=TCbq+TDovZ?4>)cwhQKi1&4V?FV;Gyipfbqku$1t=ADf4J>-UKX|b_2V8Rd z;+;|Iw1_Bm1mYe3A*0j>e#l+D1Em&1ntD}+Z`Fv1^jX)sVgBl?+{D+8bbonOGt#x7 zu%Y(*{jnboNcX?53v?NzJE;gg^xy1thxpx=@D&7h#*$`?yHQkfD~LIQO5SvXo6*Ag zTFlnI>FR**lBxR2Hqa6qnfEOLDw?mvAqqUB{Dbpwn=|ERkPygX#7 zJ7aJit{m)V(o5QbhxAY^M=yc!6;+Z=4+RwNa zKjT_g3G3UmjQ`hottrhR>JEp>bP z&)(=x)|UC(jiF<6Z!+5d`J3F)m6Yp)-Un06z&l74oAq?CcW(nwFZH0Julcp!RTcyS znG$uyw=?43MAV<`N7NtgN7U~%qCRH1yB(tb-R16}*XtsYBu>5yH6*6~p>@I<5M+YJ z#Hc%jK-Z!qw_j7ggd|En&5x9}=Mx>LNR?E&(ZBxVZe6{i1ieSfAmrm~k@@tV{s}j;E%1iPqYwK}e8Sxa=O8u#cEO$^6-JFg8PdaLY(w0{ zHpKPQH1r5T8s@HI8Luh=LY@G~DYY+#7w&IJZ!>4*m)qr77^oP#cvs|q`bl?369G;U zjKBG2cVkmB+eLWCFSrGTuNKV0l7`!u!sZJAbdkU57UZF&H~HV(;^s|C4?+Zkx8wz5 zMgeus)lXvf$9>8j_RjiA2!J2x>TPy-Ce|fA7Bj589l`wZ%)*dbQ3SKMnP5uL-5J5$ zgrKW%>G@B)ulJX2@BcI~d99CE?3_F$NPE<0Or(Wcj`lZxCd0LAI1kCZ z`%7;BgZj%LnTP^oC?V@*L=+2x?0bt(+E}`1RUvOt{PtRJJqUXP`GYK%AU`Uzf z_uMZUDO>tQ_u)Dz)AS+%Hj}cFzvWBW@#O!%rgyA==nnUtesjE;h*xe1Q+n5z-Mlc- z*ZQkhyMM9SUTw2&Bx%2|xS<10tOGBJoU}j$PX3B}YkuXLZ+yl5Fpso${a4+5=J<)P zx+95Jy4#&@?1(z5-)?`NaHo6R@H7YKLHJr-$J55sSG2n&ZZ)C`OWbM*UpE_`e(TrV zuV$nO`ujrAZKXpgsJ$A?ud-+uIB73)lMG*Co&HO^xzb<$pKkOpA)b64`{8~l?B`eg zr+cs&RRzfMA70ZBgJqJ%)U`XqU|M;zOe$UEuUN~u3K;AMYu&t{fD2!4@#U|(6W&!v zQRDs|`=Kc;(6&QUYnK)Z`_^LNsrAh#wwOL*->nG5@KF&GA`1SII){tqFDO)Ih$fLTs)9C$RAlX>G{BgmCmGSj`pa;OQdsyW*YSp zC5`%{wg=HRkCGh@8gWF~1=v&(Gm{}n31}fyA=hOpaGf<<$tSgl-xjJ41x8j=YZw<1 z$-B_N=k5E{TpN)m?OJ3jkhZ@8U}`IctE)E`Dt6cUrh*|DiG_ zFUPbQzrl^Sok@J&fI=>h8YNC{_^6nZOc&WH&MQuCy^cgvP;%y6=@jclQ%rewvu$%7 zx&C#C!^-uqL6m^2II!{N{4U2TvuzkB`$%)$QSS8lZ@J-}ZMw4{bU*eJzU5}jOgnc} z*{)7pR}4pbVG8~t>r<(Bj@v>qtKdAb;Gmgmy?cKyD&Six8oje3#jJv?u-%kJ?* zDe8VpyY3|RbH42=Bk|J4xT9DZER?7F{`iWv^;Uo3w}C~CSdeW?7H3D%VSGm`nHA=W z7|at2m2rBq!W@s+vv;-HHrRPSdM=YU-DS(X$gaOUF1(_Q*M)Jp-I*?QGFaR7n_ui~ z0I_4$&K5$V_`Sd5_FT|EA9jK>WGRas6l@}u!)m5LV>jCFtl$0<-*Mwl+^!4s0F2t` zL3uQD6z(i_yaj(wU3uOjpedJl3+6Gz$ARY)wr%fo?>~}TGqHTNOC6W#$%Tkmz!nuP zWvQO+vkFV}B$U=-J-JP@M^98&FEIS_ZWwjx>HMR8ZgP!Y-lfmXl5k&nwi(|R%cEx% zFuE-&`pQZ@xn*aq!yhS<4@p?s6lR$Q`Ejk|FUSf*RBq}_@kT!24Yt;WcIcRwk{r}f z05b@yB|ZL`C{y@ip$R+^DXzLL2nd#i2Yy z>-;7r&Ls!tzR$+y{zB>>Cq-be7qT_vX82b>=Uj!woTms_j}Cv|J#JRbE}33SoHk9# z>ZmeD(6h>JHIjQ)fZFBYH>EF&0yOtV0dFmh0+cU_DoiR7aH6oih}Cb~@`ZFeZcDe> zv+1_nYTHprV0cyg4qMI)4Vc@@Xy5x?xA!#ev!BNJ!^P0+iy{qEb59m4*mK|vSFG$G z0GPka(GcJ3fB#)Kvc~?NmV2te)d*Zo%l4b0LTo?0`I)USeS*sXje^wxp>psKP}{}Z zxB#`>VO$+}-{T&pL$=uSOjpTFOYIGDY7n|@+&yh2a*-pzV)5$ke2*^_qp zHha}B-`;;Vcm9FU56E52W0Zfx{g^CrX7#Y39P8k9JSAo(ANnNZY7c(EqS#%#Gql}i z%r2f=9>XGp`^12CIZv|4#@4~*V0a`gJ&4ufFlCHlFASBVesI4ashbg>x83cWF}PdQhKA%w|VO zDbL1<6tYCGV|hh+sn=1wBK7MP8zv|ie;9FT1qKA=X}IukC*U^XKqWnGixxy8fDu2o zwGs>MNgZ!3Y1096l-xC7Q6=w7XGGQ6WlRlT5GCSf%mJ#8+@--vT{}Rjge)4s4fEhL zs>0P{K$VHy(BZFLhg0RIj`GX}@oC`w8Mnjfv>pk6(zAxyA6lA3A~1^e!7@VzmH#No!INIpJ<=&idnOTfBFlyoAMtdtST2RyXzVvq~{Zb!Wi9oM#qqIP$ zRR+wf30^)3h8ma7kOUY+$qJHM>q(fYa)~8Lc2%qugc;_xOOjgZx!|P7FcYM8q-k1f z7M|TUfIT+%L08$EpQZl@$0wybLG~ocS zy~h9`PZgRn46kTOlc*8u{FwV!2BZO~h=2#N#7{a|2_RTsknm;|o+cNGTeOCKa--(X zO}%eXY1Xf*I$2lU#ahdi1_2aW9bK?spO&==?6v6xhlQnWIPL*NFllX=S=uUs_GkcR zhB?XaUp-Qgx>-- z4*pWIqMlG5?;6tezJi0W9_0yJX*DrBSB74&Pw7~{#(T-UMUAs76#>#1R;#9_I1fE- zb=_TpOd*9H_HF`kl!CuPHcj<_x#Xvf9|m0udIgto8=5ORukE8HVC&3S5Cu4A5H_v! zsy@I?2A=e$*4&vbjBiCcz8+?MgZ7c6Ya3-_e5@h9?BPCCjkB6g+g54~uh|T3X{8_O zetXz(4teUm*f0PmK~}5I!*h9Y3Nm0GK-;Eh3;Xfj^nF7sE+T@sO;#Cw>({GtCpX%6 zs)5qm;I5;oxvvkZjt_bQ;Ai!q$`HZPszH^ZdfqmuQX8R{6@$1*#b6Vz-v(Q0lW@#6 zEskR{XSC*b>p?+-)da@!)!j;Gr})cZBA%G{iA!DjKrbZ9FHOg-ObTV>y|gV~Zc8}S zQ~y3i06Xl$YDC@()=Jh0)4Hnyc)qKEf}6^{2wK3ZDsvVT$|SVCvH=lGFO_(y)}Rlk=x`Sy1t;0X&uZgIbrw( zGy0}r22QeeJ%Kx5sl`S}X$gd{(9>F@t6RSJ@?A}PD$Z$_Jzd@0)3r?-%&F+_)e}8s;-;vpfvq3Hw_5*2c*Em~W3{5&pezl3er%})< zYzs1pU-dX#TpJ6m`9+lqy`6D>rAz}D!&L_H ze3<8Oo{P~t5j?Ph3bGOx=a)<6vXo35j+Cp_2#@G;X;F0`N1bK11_?gqCXRr z%F`}Zx7(ZtIYwsYqPi%PuiBC=;flQ?8yNq{o&tfNJ5WBfBzHmCVr^2I!`u^Op+7>< zs%JRg0D46rQ8S$4)WQpqh|?@B3Gphb)iNS=uFS9|(}p&Bi&>k(tdlBqW?iC;5?Zqn ziJ1?*=X;2otg-{8-K(Z-%Ru?%v?N5pP{RK98E#~F{j*hmZ}_aQ^r3K<^`V3d3&KyV zN9=o^!1ooWrJ*G8C?TxLg^79R(F)_sLn0;*@y`YcocoPzICFuV%LTaExYF8W@IqvB z!9RzF?dV{;7bU-FfM9`~lQ!m}D zO2eV^H2wrg5DUtOGRvb7CsNO8aZyeyHI_XuFaET@6suq+y@!ls(Imly)~!bylB?nX zGaqH)Z1MMkCl-2Sb*2n^+O=Ai+ODM{4O22oELg3b1`DO1bi!yuyKtGxo(il_(qqb0zJB(>D}PTj6@b$RG`=*JueGP#I5I)2FQ z@nWQog^cwSxFU)q>wXBvFWRg z46`>K*1Ddvn~ajvY|)A9jPiU`{#{Q_- zo77yyfVM*kxaV5JL}zEMApkQU{}&bmYq0ut@Gny#MqjUXc~Jo8labcf|D7%>)OAfK z9{FT?sJ2CTU3^=2fh$j;>r8|bQ_s=_n3w4rNxdP-z+8+`Pxw7ciwWOzX=OG{PPPv^ zRE_P8jxJXPI;)GQX;Wbgkcnx-F`ZG`5g1*3A z_G2ttGsZG=)TGMbIcO|UC6=B6W~G*AxOv4~HC_`NHxRS6QL>0D$Q&E;)l?CZ*SM?P z{3-I4agTY;kE#ef5-^L3o@|gsF^4Ho=QX%01{KM=rnIfOnqs-;la#@-!t9)CJ83Bw zW@+r2YKb&>xU52Q?16cF$r^&K2Fo12`Wl*s~lVVBWJ(58mq`gi`=9q|wJL{zL_PhdpD0%`C~3j{Gs=SCS|x&wf3 z$y@ZQz-lu?5+GpX>yYvCfKixV(*kS{8{0L#3)r9=+d&2?{oz8hxE)ZC(hL$c;oO&l zh-}p5e1M2n#FHQADFR?Lc1@SyqBk#aRkZigJM>&;MApQx05xnUq^(faHVWF+W~fTH z8&Kun{bP67=zajjq}v`>%?4DE0f3z46G%-x$_~)}Nf<(pn!(UN)Obzn{|aCu5$B(U z@z6ho>lc2QqLnjV#n*o9X8mJ5-T{h(Tnnlc#sq{jOyH8cip_GZgxF-8$+afBj+#|K zFD&$pMiwoU-r2P4l&u#{jLEw}tQ9&p)}^Cd1Hbnco8;Q%;Ru0&rE=|xrUa7~S7r*7 zY_q+po<6+up4PVS>Q<9$5zTk#Dm~rWEZ1%e*t5~op6z?Oq~253TtS==Hz9-_3Ho`) zhhDQ-gFe`f5o_p@n?e3)3k>1$fgCgf6+Q`S;C@A8A)U1vkFQ z1m7LHBCux@wL%Hnj0$WeuBE5|eQ8BFwJz;eZiQPiX2DPTh1;t(Tv%;BXBY!3Eva6M z2tKEj2~0NUb$A`sH58;CQJInCD+Ty16P9p8l15>OEDiGuuApb!MKJ?(%_+}xNuXy| zhLOJ=A{x+TRl>QNPx728j#kUBo5OdW(<`tM-Gvzy&{<2l9lnL6|qqKKcc*}Vx7+iDfZ0(TLYIJB}toNon~gB@p$k}Wt% zCS9tU$y1q<7@BU*26iitDSg`5j_E-wtNt;7U`fx9q1Bk5b_R&WNJ}tB4Bm8k|M$(V zEO(J|2`wLI!OEZIHYG*KIFPh(4R~o`c{rD@bABC8>h6+(q&wPn^ zM8M}9iN_I~Bk?$fd)a|`EsZQM8LVhnecZ|QfKt+Kv`;IkB4<}wx9-CErMI9d;bl6m z@utqSiAswCqKj4ZKyHyonQ7Uq`8k2qYDU6E3Vb@3ANA>BA_LWJ^$ULGjyLy4sPyE* zP$Az|6M}*rm2gw5bc!M>sY;+#(q^7a*>6FW@!YCIdPvn_dFl!hI0W4^gB$lO*3T}_ z8p;E)3T45YtpZI9g51QMw7hBDS0g&`>0-!|p@#!r@)D-@kr}g^16cT7muPd64O#)1 zl$oXb{$0Pu_iojb{v*F83=mBoQ3j0y>%!_Wjv3$lwVPT4H)3C5k(`NcNCg#jq#X9C z@HIQEzT^0PL}g}Ser7H#=XBkClx%q@GwS8{CVn&_kZS9KkFXPUO2O)CCO8)`odERD zpR+}w!-8y@baAi)nV|DF3}!D3t7({Qoqoeqbt++!YMxmMp1zsAuW)~>hIbfUg?g1Z zt}!`EVplp>h^*8a#3_{4u=;^I$+Ml}Qsty2d5o-}kk;?A;xcj6IJ;QlVG;sMDN&g2 z2ryhjUS$)E3!4DGCmovgLUDH|7i)G1V?v!YDOtDD+Kf#Qo!@EMS5cH1Rgcla2Oh&X z2-JfBm(k#)W-93y>H!^u2 zP!Q)ay@N97vC~o3#t!^AJJsvVG8cC&A5@uDj^JbpYdP~;0Ic`ucy_gZaHhLbPkyh+ zKI(9Hxqk4pgXJ3MlVHB|960&TBYnAK7}%HQx5#3R=hGb(j)S@j&vt-gd2Z`K*~{~V z4xK~7-*loi=DD~Nw9j)%Csr#wmv%zUc=mRp1mL+$&}`jVLOJVeX?Cs9)5aFEbKKHX z3TK=v5z0@NB|*ZcAcM4n&t-!`hk6I0P8h$C6Yg0H@ho)+F*!O}yAWm%KX~*TZxj_aC zoJP~oxwMrB37bTT1~91fFcX?hY-6IciO&`yTbOL2vIX4QQHeQuv=yeOjTO#T76{07 z=+G`{xtLRTG0f@=tbxHxrnc#j+s~zep}v63$lYy1V3<~Dnl+#luW(qp-73}kEt3`y z(}7}REjq+5*l9a|n@>&G+tKHyfU>lP>0u~7sA|ksm1ETA<5L~ds|Aiv3+vMNlUK*H z3mf!<_0-NNBS@L~#n{yJf(;`0*O7f?GEYvrD`PQkkDX09!Xvw; z=6-}#n`~GiWBw0+a1$3m!~?&W9&MvLf0{klolDQO;4n7xJEdWE{6-MyC*j_mm5v2QC&D!sKWhnzCd2) z0i?CU42x)U!D28HjPNr2_td#wp0aS@?>d)J0fphDD`wvSgPyFwv2R}J08_Uj&t;zZ zO0H;qq9WaXuBf`b@uEs+ona`hB?IQ_s7IDawm6_E4Ftw)bRGt!zw z$BrS`6*B?ea>*kf|7v_>QoL9ke_1wbNFL&txXe&_#6!V37{MAU4k54ksNqN`357Ak zfx)en9>|Lw6e{G=s)_3qN}v~JYAW2(nn*0TRE#Ua5}XDlO`~b_Ib0VP*a!{2H?GJ_ zpp30Vm{u*GNdYX~p%&-`h>h8AE41P0WWSj+%gRFPRkS?rH`l#p1=8W~#yxgKkFj9P zY0?V5E~HT&dsW$7~iPmo>lAI(OrXhTbnuaNP+&r6}DTC1H67m$bcT*Wmxcih_LtzW)M|C`<$A{9jI{Q056vuuN#43t8Ud8vO zkZGPOxq@cTPRgpg0e$L_pmn$Hy0Kfm9)L^r?529AS?NAwg{l=5k1E3{UMp7;R$x!9 zKqVQOt}!d1fPI+w)w{=b)98@Wh!1J^E)HaCjb(*VH(&)z{k*hRhlQ@SsB6R2wPB4q z5RX$-!Wmi%T^m*+!ewQG%BEA34_%WbK6?jM zSfnM1&J%|0ref*Ct0P0F2B_AN>ePs=CM+D&<9WR62(UGv++7~22^(P5>i9_zf33DjMq0Qk(6 zD~DSJ%=@~0rCalVZ@x0Uz?viThFQ&3CTIX%x)V;rquolG{}V{!EKdU+0c4HP0EcD+ z9L;Z=^$7&v?kG>7-4Tp$G-YIr$$@4?fEiT2)xngK*6p>7orKLr{dUd$xz8-4}LMSzylQ8HQ{_<4V5BPELl}$`P;%!wDdq zl#)`aj-Fuwa75SeMqNyudd8N){iF?ua#}g&J6(T3Ohwx$+O}O$Hob}ts4eW`<}(Zw zuwA!R?=0`GGafs`L7uI0$BN*t|aWS2wJI zMpBEKl8uWqDA-)Bb}qdqusTp{CF9+wGD+(-u)h5psY9{VTU}{x15~RA4gS2!O#ob5_XcL3c7Favf z-g%=1fp3c0!m+ln-Ef?n3J=Y1LpHF`1a%ZYsr$+oEZjG8j8jIF<+pSEc% z=r9=BNMF(a*_%K01-IKkKxjs}AnW^X*u-}Kp%;h`l?Hsf;{^gLZF=@@s(`{J5BNp% zTKB|FHvgjAt!7&Io_u9IRc_>%AiZW(QR3p^OX+3LWrG%9=+5fbWML?CxNW&}*i9J5V9aj#&d#BwQ! zDbztq5Xv%^m@^idk$#_5=+1pTKP&f)7-Q=eLVZESO|=FSDO+bvRiD{l6MM;cD@|XA zrcY6lYME4Qi@KNs9NO9aGo?GkuIeZZSt3^rYa%dSo3Z0|IA`gmFtcShO_>ykTCdL0 z$m!@(Lf`?I&Gcn__Oe^4W=XIbS<BNWiM^n%aH6Pz41H`-_cJ4+LF&an>#S=Mgg%Lsos!E zTqr$p;}vmtO}?B4a@9fQHq`Ty|IV*e@Ni{26K@M)(5`(%I@VR^U*I`}=hsP>e~!=; z1H6zP4ALe6BQr?N$sizMlqG6#{9+o^KHqJ2v_m?|2ZrtpDm}^0oSH)npjF$Lt%dn| zOZTcU{CY-9#T+HH>Q0IdfBF-Ji6>OikRgUQ?>jan_qCZ?pn2aRwwC*ExQ|PZK+VhI zaA_4^pY&&budv_Y)Q9fvyrf-oD-*d6<~Fp9AqL#!~f?EN*r(|vA* z{C(dm%$>qWI?E&B^w_Hug@>e46R+`nBe<3IS9q$Gz*diR;SavP5D%$sW=aH*n|Ruy z6_QOr!%aeEu#j}h1hf$PYIVLV6G}t2Ta-f1Y)!-D zZ1S}z9(_1|CIdv8Y&Q-t(j;Zxkn+%U!iOZ-B@E?HhG@0eD^pF;ZLwSg>AqDqdS{hc zkerwKj>;t~pWomgjpC8{kbBBbYExd8ZbjTtm>>QLm{-IL{b^4WDm6`VN+p0UqaWnf z<`f8`?G^atwT<}7HZsTqObqfUXsD&RU?^~2(iY%Vhej#9HcA1nzYFkMo1J41GMmYt zNJvqOs%yulF5OPFpQ09h5Ng@J6Dex3&naqQaZI;|&VxxYn6b;v@Rm-}0LrM?R@C4U z9H-}IF^D-Q282L`DPOBIQRVl3^BX_7V{2FG=NO=nsVve~h2xv9pR%jPMzEU?fWvIG z_Voe_a-}UQGLvt1(sp@yh6=P+XP$J&<*EU>jwJt39FM|S0=v6p>xO$IxQUi>SV;mC zpw~^jnpq2G8jJ7Y`^6-RF}{E&k5iP#Sdo*glXIAY^Yw`+pt4J(1U#l&Fnx9b-qU4g z`0%A>;cywo8oXfvq8UHis^C^8vDlmralGs#L=p3zBTkO)j;M^#;}{(3d7J>2v=+#$ zvzL>~QZFw4)7`n!w^VC4gsim2ff2}jN+l1n;N_%hmma5=`W))jd=2Od0e;$&y-N?d zu3`~T1*dnFVG^WKgkmqM4mX7ZtV(roGVJw5j-=yXRJIp93To2Orci4{+h z`k#dn!%gnT8jS*RDU8W^UOW4|J#Rk=>Q`*Zw0Z?r3NSvS- zFGrl{gb^n?0dWG(VdBM$Daua2G1rI8vBqt&#@yQ&GkXC-!?B}L8g&^O14L!yn&`91 zpBFQzc0eh$CTmH>hko?88}>?IiYtFac~D|2kyD_FdQ$+Kl&u4*p-1)^NavTyKI|#P z15q^`M@{xIYRPS6^duOOH5RdXKzEw(xq7<+t=!q#*NbIKzoK5MqrtvKc45@P1<^r} zMpA@uS#O0&)ImhGw&d>(=*6XaQF6tSdR#Xv| z*tOq%klF8~q8^jkO4pl+w*$NOS7kHBVyfuO01$+bEvC4?&B}*+gp?8*PD^SeU)p1* z0NVtwFiRQ#vQuV?wSGBx?axf@k{LR5CtG2AW@zVN`W@CJk-t}Ik$-e}JbZv)_evH9 z|4@8a{I>?iBlc3-y;qVZ&bHTPl$T&xS%>E?u^xTCvL{Tm#DIW4bSxOaZ7tuMaRz~& zc0@JxVi~w?sDoPw;7KUvR|f8Gw(HhLLEEl`zuU2(KX6byrj`jJ97bxAka%oErWcp> z#$9%HS+1aHfy7ihrFu$ooIiC~WboYKrEu>Vl+naZ31pHwcP*r9vzqWob#h$Iq|{xP z*rix&yr-mE@t!+MwO_lcE-RTe=C}CWB-O%t<_>AJ{~E>G(i8r%!SHq?U`UMWu0<$d zCRzBd@+jon_HewYh*nJ^F62SsqjwN-2a~>xbcw+CxKRW9B0-{CQl^<^aKz6rcRPlJ*ieQY zUx#uKTziUCu%IE&r6Km`mSVu;PZu*h-r@%hjk`yhplmp>vl&Tm3mauK6Se(D*_v*Y zjYZuDQ%IDjzb{dYPP${0cBE2E=Xzt%ws=g8E+OXvAIz)>htJD1Y#P;Jiib*!!W$uSWR12MYSJcBl8b^6OFY)jMf z>(q5LFRszFj)^+uH)WVZ{S(ub3*9CXeu_R;#Nu32iC=(t53>ppYd6H)sg!L>X(weX zsJf<mMfJ4`zavj+=h>uo%48c_s} zkP{+m@Fxz9hm70V-XtEE5wVR$f8NM=^zJ*$v!b4-bC{}IYt`j9`)`ko$3*mDsDEl? zJaVUH`x<3AK|_(8mEC((C_C66J8BnY#Z`;I(gFvb#DC1nekv_n^53HDfjjGSPf9H* ztIHKI9NZC~N%{Ac?s($R`sNm27Z}gHKW$JvyM|u4AZ5y{!9BY|J*5ow4B8G^Ncopf z9%bcI<)675{FL929o3evv8Krn8X1IA6n-Y%r-s>fiHmlIiV9$R4l1ghfxDO5b_YI` zS4 zWmY%ZgSrqz)t(+RbD=L>iwgwk$u3u?K*)5qVzv4dG*-+MZ?fV_H$o~Y*jA9ZvqD~a zndUDXN=YyoS{~dTj#Q-dLpMYW;}UhggX^1dUjf+|2KEOa@UmHh%}8u4()hK#lpw0cse?9^%)ZxJCYB z!$9JoKGVEI-5USG4Tmj(tj&Kdq)3w=sHk-OMgak|0IKXyEt9ni^NI2cB5!j`@0+l zmPnX1K-7tPlQRiJ;)B*%w*}RSI?_Xfa%qESBsQ6Ajkc%i{QBHAp@SOPSAoq$WTl-{ zC)-mypn87hqX~U%5c*Jd)NCPp&}218t(b%K_(>QF&4boPqWqBh);6X7;H1{Hw++Xo z$`b<|Q=nkSmhJIZy~Wv!ud)nhA?WUOE-FjpS6Qf0#zb$)i@U&ZNQgU}ZGf}}rrbcT zJb9oHV1rQzC{2Ro_BHzNRN~R8s6VY5j~m51H}GTzEk-GmEEIxO`x-c6Ul-GTy`k8J6#^8f9fKBm%bR`1&V=N(wW8{ggPhT= zZnT6FTdV(&%-j%J|6!52mYy$4X4d)QjxzHX*+g{$0c-yiey0S&3jK2@!EpPA@N<*C*H-xo-*KHB{ z;dO)Jxvv3yYuaxAgvzHw42~eNbEn|@sb=tnfBAfW@aO2Q>Ib_c$Tx(1 zfqXjH?Lj^h#w8c82n<;U@kcc_u1+ZoLDhc%->3n7yxW3bPe%$|4TeR zKh%FRACI1tA|ehoz(ZzW^@XMljfidZf0L=d{OP55=pdb0i!kxc$oww8aqz)ml>gYC z@yIqbwnlBk&)xY+JWrH`bxm2JS*bR=a96Rj{Z)3)>RspmSc)h4pO)fw@AryF7H*FH zSN4iWpSjF>NN5A~rQeZ}EY2E@F0&(}mFdVZE3@7|+@!n?iU-q<6BN>gY1vh~sHio* z6|b`0<&Ac2I7={I-u{TIKZ_8KxO!Mpt;9wX4)J276#2RfwK|8ODQ*mNquH{pOPjmP ziuGDC@&W!CU(tVZ?y^!#8l5yzahr9r|Dweg9;9Z2ASLu869DB*{&O8Dpf*df8E%O-fKecy!SiaN$a_{)~p*qgP zp-bowH-bJrV}Hc7c=t26J|b$2FDI4tq;`{w^B^OBFU4L}&)&Q= zETdI^uTaDSp10*Ooaea`!+Skf;r-zsnHGPd64=kkLxLL;WIqam6zwyQ z=Ul<2c(s4)^mw@4HeTQus%XBPDgn%X>@@{@c&23iZL%h2EZ#VHMgwapR}pQ3E6F{SgW2p z`cg}Uu?jp4hz38;;A|OPRL#Lx%g8ZGUcj+Z=0E|a6m)K<5s4qZr;jO<52P$(%D}xFG#%qH{=^6OwAF ze5}MwqE>T6d~Pa#LdYz)Xk83PyyVHnEgf2o(X!rQjXE>O)6r<@NWj$MevP+uf4ob=y-|6dZJ0 zv5E=Nsul8^LT7YI1Gm6OE-G3iDZu84L2KFeNi?$DAm{ z=CykIMc1|zic&#ZRCW>dC4d(~KocWp?#~8?xX&gpd<1A8kzJcI4I<70tyR=@O0(!P z7z$mr2I{@ioUa|=ub6=(Og(8=qNI;^1^YH%>K=`LC(*f=gAUWZfZM=M_JTzc&!Tgu zgIMM=sH}p&JA;*#qO{&H|D?96poHYq{37gi{iX0GNDH3N{*aj<7##VbA{r)C1k-S> z$>gG~1zS7OmAI=>6!F(;~ zi~0fmE5N+18D?wgrXe;vjimq$5Jn2%&R@Dy?;2j-q~P(LrD%*>I~ecj0=%89$m+(5 z;6H-iUlYe6jwpYh`DY8T?2Ogm0EJlqEiCLJ`GE3wiGOq!no#0&>uv?>84jfoBYub& zMcOW#sZ8MzHtNZad{R$baj_kmU3geO>cO>zb+Xo>UR1kwK;6+PDF#;!`EJ(}!NY}G zzl#R(rdpAmlqcb$!Ga)1HyHG`En3iSI9%9tDX_ZWgLDL&!^OM{5gPn53uFc&(@m1B zWv)tZByA)6Cs*3b5DU{7APcU@AP^5Z`kN1o7Y&J%4_;T-0L2QY^$|a6Zv2M) zC;f$UF_Ga+nG0SHWmG~G{>HiSl>EE=J#*uU`FHzY>v4haJSg6lf6%*m@i%uDim`ij z>ii>@e&Bhmn|1gg^Vjts^S_)IUzXj1Y*%uGYtR;dS`3AM-@);ud0hP11}>venyBIO7+aUcYP+3d2pzaOa$#zwU--HV*O6&yNr5?1NuPunnfVb^e$ne%;(1 zu3>{gH}|8vl@(KWs{K3?#?;*D;)bO)7YlnzHKv9iC-H;fc1YR$DrNP8_y{fld~QL! zSNPD2G!k_&6A73g7l@y+#FDu^UcBGOMWyFlvK&VTigc-n$S$*uyX z4@ti=(kJH{CAxr9Hb7GBr~qIBX9KT^hsKk*E&7;4;{&pe991rek=RfO=hdOF_cL&W zfv8&K+O#gj4>^EoY~MIEUN~ci`HI7(o70siOw)&+*~$47z^c;qmPx{^IcX-zfa% zBjTy~5BjA?#OLO(_kTVDPp(_n3_miyD4z(lbdS>*BUvMP8)a|9c{5Aj@=#67FiXrY zL>k$PaDc3@jBdoi`v;DS&uC3A@jA*sesnyvt&pViFKY%K6aPnEgZl2V@sV5@*>zkzRX^t*7wgLHj~^HB72o?n9~U6_2ak)- zuA`?yvP8N7?sYx*`1oLz=s7-qv!0udkB9B`4-C?mPl#>D&N?CfGd-AcVm#+am6sED zxU@;3wgUoGxEmNt&JaA8s*Y4smIDV~t|GOj);{`5{3 z>db$M!v(x{uUJ-8Xvm<4>nrd4m)NeaY&$uwUtbBJly32_KRG_3amy}c0^WY|Q$WU- z2wc~=Ww&PsA@RX#VO-<($~s=`1usg-{H_-#`V8_(QS_h&pR_3b5Q-V##epOBAdF70;{LRdw@rd zJT0CZht~Y9Z;XfM|KdM$TKru8R)6yw<1u6G8bU_0-caCSzyN69I(oGK;_2~t|I8cX zuaNn(r^jd8F4XP_Af_;msaFPX0}Y5UHAB0>>zaMvMDzI@{Hbq_$1x3;zByjp1Vd^< zo4xCd_#kcaW6p?Ao-0@`>t+n}DbzT`YJA1^P#3GcpPmu#lV`h^&Wh(8teVul&?!|B zI;y=8I?sCIl`Qma(o1B}kiDpG*{=;X*hp@>XqOKEOb6rH@q^=#e_Uqpgzb#*Q z#`|x)6@o)+8{Zm_?#A<3y0xd-3U{&#OuHu5r0L>XT!oX(e%#sd(tNA`(%JE)C#r8R zKRVg9q}&Q`L17~-5q5uLjzk6XNt?g;ZSf-Asl4fJad}|s2ZeNzFP+*|;2JUXyR+UN zzhfsWx%%z#tTF1(XhC2gK`37h8_Zb*GRU73kip64#Pd4R+qn5~i~saF@d+o^ud<~? zzy-^UhwFz6R_}ld#^mtpq2Ib{OoGoJ%|$U+`a|UBpBs;#_Q$B&0;i#~a9nCzOV24} z&Cu{t;5rvei4wSad-d0z8}D0tE=t^a<>Jv?x}gFE>b=?_gXK#vMpak3%2gsM3bKEs z_k^S8vO88}B3b?1JyLoe219|kmi-W_e<{M;E>b;l+2O%nE*wb$kMkhNani%jJhA3V zzm3G_s6l_sJK{No=OTaAJK~8aUgZ+Bg>Z=QK%M8&6-jwfawl!rA6i8qiO(}pGMDrz zU4O*SN_EVgqDP}m%_VE~g+Kmp?}!g-y;;Bb2WFq|EVcp)HLK2J*-*v-u$YN4%kbm_7c$lkn@|fYVy%@UZIygi3u?pdngR~fA<(}@g=xLN0ao)}!o11K ze!cc5ofi)y01vFE_OI4q$BEEj3Q7JV&Ay7;T@AMIS%)ZB1P-eO?FV4URx`OYxy;}N zgDBm6$p0fP9#Y;KE9cc*3sXV>U7(7(t*3h~&FQn26>5g&R#b z{fY04&&q$*fAyX4D0i;;sU8!*YN~mQg$E3cV7~Z78ZZ%l6ddNu+rETEItdW+ZYtv!cTs0yjvp=@RJT*Qc$@aC?n6=?~UKs z$kUh}wBp>9Y18AMdT)Hk*c*f!v*-f66td_8nu5V5HH)usith*;FauB!;%h#wQFuA%=H zUp*=9bv>Lys?Df(Kb3y{*z@D}pW0MuHdQta)J%mHFq&enNmLC{M(q4aQAVQrV)HE< zJI8^bu+ZnN=f}sqA?-^Lw;MC4t$L4P^nB^N_B8yNyJGru)8+Aj1L}Pz#v8!)`OD)4N7mC)@L)lhY_zuq9_WnGhAMa{G|E&E5ug@r zHy*BCq`G}R5DycbKH>xMrK1AW25^W{?GQ_Rz4K?@ke@xQ=g)n)N>RIoMFHEYyUYBl z8}d^c5R$@K2CrZyt=PM3@#tE=SvmwvRG(X}@UpcI*J@?Ax?pl;LB5i&)2_w&lIpRw zoRcP!8SFr5M#Sys^idmIfg{+%A$i&J+b7qCD0^QcU3o3->HcX)^y^wFbS*@9pg=EFkccTX_3wdpZL$rInq1o^Su$jG2 z`wOm(cORbapMaj(&M1pq=^p>3YtewBNVpa=kbC^LYvVVJ?d`dnejh;|!H>dKp~}X| zyRXpce7-jxK6b<3mA=y)k#dX}v+F8~R>i1QyQ;#!bX`1Z)C;?+z)$b}Kg_)ed{ou- z2R`r3^6tzeFhGDL1ek=dgMuQUxbRRwife1#wc5o6+)(OXCsnFgu?7JzDgr9CsHj2F z0Yps@6%-W}6)S2`YEe;Ri;5NW|NWl(-kZq+g8KXa|ICNHyWexqIrrRi&)pDRwZq)M zt&W|M6WHE}lanWM2OUsF0SD>QRA4tpurC`S8&?JU?VvIE`#G zx7X@>ZjN=|?`>%O3uTn~wdaz_iAs z(`U|%9ha=Sn%yCVPVjHNYG$k=wir@3^($mDQ*m=2Mp_vhPrNNQ zn(=qzTU`HVzZBD{icuamOw?-o_Sk?Eb`)!uLoRc21%XXbPxG~>Vq!Ru1sK0#v`91z zE_BIU!Dvng?xi{o0T1B3No5Eof2jJBuRF?<;lQ;gR)pNu*VUO_=OK5#=S6U~o59$RBs@92Lni@l4_k|$!@t#`87CvlMtzH6R} zonfWcOr@B{>c{}how*h?sxCIh#&>F6>>_-#vE{J~ECyWqbnGgAw>}-~VXvF2(<{(V zkl@Z0v14t!;THYPv$1NsMrUt$E_RWX*@l7vAqw3J*FJEyakqG`wr+#xYUghDTt)6C z&(+@D=(#$$^`5JvyWVpZyX!nxiM!Twm6FM*O!Tt*!6blBFa4)gv9k%@rd6@M?7sDw zvIDn~)Owjif{Eb33YZrH?t(DIAB1N|u8wuKBSefYey8W7=OIF2!+7**cGVu+j-g?bP+z>4>t* zt`FmSsIC`}#|El6YA%P^C@*yjFl1Iet|Mz>f3>R~&sMLE^|ngh#&!)Ps=Wp51F)GK z0nlf%uf85zXJrs(^EqM~LNF+bx4}pU$OrLa0Si0h5pTSBajb%!OnI@$8^g>AMY5;{ z=u>TEk|f?*6veiBvDo!if!pSN@0uu{t!oWrc+u6!%uPPN7nuuju)*`zA{P6bJufL> zs+(OHltX(9SNFBReE>gfWzEkyM7=T8zq(v!y1Q78+h@mfdV; z-f^~|=pE$WRl492A4!^Pswr98?^pj5oA_g3Mf-nZ%XW)B0}y>j2FqqGV*hCTx8TUDzM1@K zUeHf$YfxazlxiY>g4Da^D9GWnsbu`2F1-W!^K*&e9~=%E$)BAx`X@3$%g6@@vHiaI zYwpPBlqLgJ^Ta{OPRJ3Y@f~QtU;XZ6%jF8PH+Sp`=kAjHDcmuCHLrEILL!+TRrId3 z?1wnt2*h2GKS6_bWu)1)T64X$ss0mG_7fRCD5trjQ8Rvo{P~I8&{)OVf&6I>b>nP} zMziLLgODH0)kyyQd~B5?@DGR$wErjKbJyG2(twGj^B>g%cPm#Tjw2K~@zsL-`MJiP zT>`PW{`2Ex{w`JKOZq&L$^17TAwk?u96z?Q78Knb%AcV6pRuwQ`ht-^yVCIjfSNmY zs|SfnLW7HxQ$pijh=gh6fWogUHpQNy&FG^|v2OO-sk+rivA(n&4dZwHRDBk|^;7i> zem73l%lX|jRe#R!=Bc{uV|*K?>M{IonW``5ck5JrH^1AaX4iZiyGo2xM{SOkv4Vl0 z#@ZEeISlW+VACNCEEiU^eE=pSiP7^n$J(-9Cets|gUZG86+M7JJe@y<2VlU{onT1d zcm@I%@!U)g020pgm~LJXz;6n1+gsjSaRP$Jp5-w6pF1d2A$6bIs?*&bIY) ztYDl$s~K!%T>O|w^JXQML(ql?d?Q*Ak@h1zn_3W2=0|uYwjiR|k3fU|^aa*9JbPP^ zAmt|j8XjT-&-fN3z>^3D7+`P%67=>gaY2F*EU^NuXPARo&YJiDTU-90*!AuHLW7%c zC^EL6>=XY18uliJdfA}~uq=tKSS))8NLv#gNCP2Q8%#&WK5*rg72yNn36Y?O^>jLu zmgD&a8UM;JK);t?5O3j^Fyo=EYxo7-KIa!CYxNbrpjQ8{V!cVI!;1 z&!J!WE>^TR5)yY_Jz<;xc^@fQIW3GKrU&s&33Q+iUHpBlOX(-52zGy#2`5p6mGs+T zjQzJh>U%8h16&ZQkd5%TC*s!Q);*X^O>NlA1~1%`rcZ2X=N4?pxy-Ruf;yKP;s2rT3pL#%BsQpf4H^JcyJ&H9#Ia! zjX0Bow=}#e#Us-v0E;uZC2sYdbzFTA0CCPAZ|&93MTpk|+$U7g%B^8Y#s?cgt=%dH z`H)AzmhPH42=Sn${kM%fmmwZZv=?JNU^YTLSn9z$?c7?1_y8fK$gO5bM-L!`w0G<8 zKuEF7e@yS{;MOq6u(IK5kfs(bVK(-Q67m!s!YFhUHVbLhETna_kW?;&^k+eBazS25 z+h!r{nuQcK3u)ghqyt0n*5TjLHlau>w_zUKLW|ZJx0W8ELdvbCTkzk;t-l*?!F*e{ zhHk-mJGY8%!FG|m<}SDe&+Xm0bPI+%xD6zKvB5UQ3ztt?MpZ^yAK-JRxca|9)zC)d z6kIWchze62LF}ew1MM2%4=Zf$TrfLM0<72PhnK4UnCL zCHvoq^P(A`D1~|OSlZ`^bTw`WG>owVm|vE|3W7pWC%b%LG>}-4>JXqNn4n5L#lO@* zQF~n&i}`R=cokve@EWv{wNS*HrosVSWlwjUIdmqDi zNxf@uD4mYco+JbhR)&)Q33EWQQXiQ_+&%Pf(=-#Z^N0+v_yak;_+9^C@NF4}7K+H# z-$G;n+y7l$#&75i*PdUfN-jU6)dTIyNBl~j7InBm`{(yGQ z61xzK#Q@WtyO6A`ziRIsq|mP^8a8JS=-^xyZd*;&1zZjx=^A%-Wrau!;d2GlJQ3zCa4 zutxUju;{?pg@jB{#=;Z|?2JJXB4)ynH`1%nlYpo%q#=-AaEO30uuBXSQ`^NbIlep= z9uBln|8{E~NMYM;sMeD@JH72K)%u~%&S3|kX+RUJ^pr@BAyOeKNYxXoo_rPILS0h? zERk)c-qrhcaT++E>(|whsqWET9hvH0#V@8Q_w$Qs$~t~AO@Ta?sqS8B=Y&!Iv@bE@ zd;DvCO)%X{`T_nlufPxRr+0;Zz~-shSD^db1mcZ~0El+FRX3-YlkQ&K3?#qi7m!@d zFXwvQoZlb!^FUxGudRHLFbe}n`)BW|bd*&B40rNz$nAY#8}bg=;<@h5FRgaDNg&Tw z0IitM_v`6&A?!cXWG{PuFX#6Bn($QR06>A7I`=U(9ni;2D^KPZSh|8=VCgn~(V!*# zVp_S5UrZ~%#~vo7OrPk~wyY*oPs7`XX{ zg_nkhv3c?Xo9if=%mh$Ibx$mC-oy!>$Ofo#M$=`F44Y(B3Zlp?@`;L!bt(k_>t3@E z;*HV-0;K9;8sZ8~1hY4;r7>NPvQgF!W|>Z73)zZR4EKVRb+fR&hzPBAKCmKh*^vquec z4hvh?W$!r9Io3`fizmJH_Tf(FF@gz7^MEWoa3vtpG7&cjC0SzF-s4T-scrd~#g&eL z7h=UodFP{oSXa}`$B=nq_;qJU_3?fgpgGtJBN(Y5u0<(UYEYgufUD_WC2|5{DItW?_ zzLVm_f&i~*6~HBq$tu$zCK7N7UjjC=_YZe2wlb277(pj7U<1?AIuAi@Bpj$|!=I1> z^-9mh&RWwVPy=K^Q9R>kXe-bHG( zVQR`bVGmH4z?+b`sWJ*)KnSB+qg}m@a?Y|yrWnPJ@U18|5<>O^x>3A%jhLbr1;m7l z6B3)x3NaC&c(~rMWGfu_2hWjD@ZpsYWIf!+ZHk28!4oP;DU15l29J3r{nEM9Kt*g* z)e{MUsTXxK@uE^TR75llS!U+u(&S2h6-AHiQNVW7A)?)YP6pvc_rmiG3YY@mBd#q1 ztU(4uas|c>%1DvVOiBSIwR=#(?&VdPUH2>JV-KO^3~cZQh)B(?kH!w;cTx&e0lF3N zA{+o@0k33#@sh+C7eNGJ7jkf0Him2=_~T5tz_f_{k|&#tCF~e-7QyFiUg{vKO#ed^ z2ydD!kO8UE;duPh3m0BtLt8O~dBH|{#<9+QcGb<=Jr3jlB>A?}mmcS|wkO}LuRqRt zNV+?Ok=G5uQ0OS$piJn!e#QaKkO(xS<(w>mZKh^KBiK11Aqe&j8QA?yF&B)1pt5Nl zv5Zj>E4)TTQbLJgSB&)>BxR)GASpCNHna#u8DgSF{)CmhqR6sd8BFC3R7geexP>>! z9w&$`U3N_K+igiI>Kbk4{kKQA;u4>D41a{7aGaT0TLCyd@hIe!c@z#LpnGq z6Bw|=QhzQ;6bIm6zMhl~NiVlV#jwD}0EUDSSxR9fwr;8rp3$3>p{^rVZ-3w-rqEL4 zM?1iebV!pO0){s0VJAAvGZ^a7aJPoK6;hcA95BFX5WOs$-iAl~1Z0>XfrU!HG=+y! z{}qSl-+8bf3o}4Vxf++T3qFAHqsrlOzk&b%n@?u_>Ca$mBmirY zx%OA$@^o=yA&@Zyb%If$tnmx(CM)A78OiU=mwoQ{&M_8cW9KuR?v#y(oZkOx)uk-?rqC9g-DcA;}@+)H9^au|AP#kpq8BQs2LK$b)2RH)piEV0+Jk7}7 zVyxIw291<5Y)}G-%HtbPApZm*MZ}FK%w?j0aE_;<5WuJcly^kDnT5~+(W0+7(>afD zv;xQgAZ`>)U=Wl-FaeT5Toe{#xrM%OAffUkm=xj1@Q;F0kQI8E7Xc zm4^&GsHQ_J(Py3IoM8r+2!aM5<{d?hR6~ILyA}n_$1w0hFpqfa4A}=Pd?k}m-&{Gj3nf1$N8j-Z+AR5%VTkD04DqrOT*4-OMMeYw7$zC1=Kwjvdr0nk&l86u10 zL;cb@&iK=$y`XNuMpU3>>`#aTuwwv62&yE@OB6_Ksw6R_qcF;-V+axTgCV5yt>-#D z>~Cyccdk=1`Wvzq6#`Vt<_KTs$S&A`m%`L?A&*Tua1OlYuMk(4pXU?}lQO`Oh%@wVX|JsYuxx5x=JPqPA~F?_(Lg;Qt? z9YPx70TR`hUgU7F6f|d}fm6)nW}75F%u1L5hz3njhi(q9sNO7-BIkD~l7&(T%eZF> z1yZ2#gDM=jJn2BMDU{qS;=>e5=tTttVlfM$?HO%m4H9bW%Pw-x7)hIopaS^8*kRlx z0UrA@9-^Li;Ycb-2uM~BwZuznvXyo(aC-diJE5<1DzLK1J{c!bKOo~Yi|}Lcm61|B z)a}{%IJ(Oi$e9rj#tFNNcrv}S0Ac7$+2=2C&akWvdf=NngX3cq=MH~y*M+Tp{JR#n(Qm0CSP%oUQ9GH z)|jIj_Z~CgTYC$K1ALQCT8}o$i0{d9Psx$N92;uT^hJMk`Vw&43}(nHgc4ao&Vd)w zkpvNTwS}M2E5J=6s8N^XOc6zS3MVV3DN1k++lzC9k%Oey{i$$J_;arLW!B=Gx7P;WzMV- zm~Q$EhFrL492*qtL+7|_vM}+IUXWw}E3@F+``)&hxU5u|q3T zR@h3$Bw-(TvzPtJdBhrof(!~lb!L`?%ob%fAwBuc@BkWQr?%Vrw2U(#b9ESAQBTlw z!>LBzcw=w6u{R}NZ^*@#Q)9*Es71E-yp;NRUUG1rw>~T{(FLg~%YbiY);+77^Unkd z<1&II(p_*fCRh*m$5XC~7mcOaR9HDKqi$O?Qfx519Y*F);19uY_jDK1l*p0rxJ%I5 zBRzGM?Nv@ks>(Pg4SW}*+v7riQ#VN7TD+!iw624AQFjOaOfn8c9WiXmnco7O?x!VpCB-zWwlEo6K03&wdwE=X-R9fWChC~Ly1jM1pv#$0a8Ujl)8zjOO zb|F(%TvUoQl9+H&I7-BejD_L=^tAPg2#KZB*x0rn9i0+N`Yz*8C4etxWek^2X~Mx# zG6*&bmJlvAh}EbFtS3FZ2N*SBWK$8|;A}%0&>_{3C8Yuh$*`&*s2ehNF_XAT2)(X` zAZej5C{rR1WWbI@L-7C+xWH1{BW1}5%P1L%S$aoS!;lVi6aXD!_ivr<*WJKQG6{Gj zlYoc$sv#UZp`l%N|7)D{tiHfw1%A@6N^vcED|R>88&{q#M{$U!{7~#}uTO&dvO(|v z7pD_G$N$ACqaus@Ai#%d&OLzc9u*~UF{GFbgadGViYT;iJsoTb!@tqkH3%<1hjWUZ|P##q7qH+YRJDH+M(f?v+22$&6L&XvwV!UJ)2~-cqLv`8t4&dpWz)EbVyFTBrdZ`A&Z$DMgh36 zvYCCf6)y?_@(ud=WQ`01G#NuZff?M)IcZS#rlu6uR2yZi2?PSy?L>$|lLz?HXbLi# z&P31Q*enxD&OoJ`L*s!1)dxxriZChymB4mrtr0K5(m|lvir&IRqVxp$6UYQJxIcZC z^&&HsYK@YG_sm2qC0@ZM`W_{yEC&PvG7O&MrgUsTL!77TA|<(56hE_Sj{>Nef&<%_ zCSjNYNC+l3Nh6KI>wsJ$^^F!5L0=HEpo^IDQsO{HEKeD(;LwbNmh6WfFmPbKhNYX4 z9}b2D(*WrMkXFXx4$2sZ(IzV}G?+P{ zI6yM_F^auYw(pbaNivBNiZMhqKZeOH2E7ok6TB~6YaC1?O=22hFj237bQ$6@qE1O8 z0isNUv8nO#2(wwK{~1APrM8K~^Y1)(mtupG!2hT!@V4Ls7%kPlvn;z2moZJ;jT}F3 zhDPoGzin!Bz@a4`(@68%O*OGm-h3_byBnQ9aSOdIVwop>%vm%Mo16@oH9GceiZ9Pc zbq$kc(>rY$Z?TO9NRg5_p3;Ksc{wg~zl-N3CdfCn3Ac=Z#t@O0x;sohuvyIC9|otP@1-ibD)< z9zZ{QgnEapixPfv_2DM+r+JA#v8_RYJD^l!`4gnxEr;m)jR+iM|G_TZvi$kE#PAOf z2l?_RfV#QkCo;hfkPn=p{X1r&d`A7j0XHaTC*%my1diMl4!e~t$iEZEE^+Rz$R9C< zw9H>SseV_YqAAh;c31fCO3Qwb^G&5cEPsM_?8->9i?!yMX-D$sCo+5hbaO}JX6(NF z`H9@nM8#@Z{xpZWNw!_&m>?z~C zX{Rve>ImqvTe%u@T;sZ$%b%ZX?AbLCo9RD4PUi1gWsOyD7_Cz4P5)~F!vU(BJAQO! zEf9J~@+YYE=d7#+K9lzEO2-QTYVO!Ai6klsPahd`LiV4towvihpaga;e`+t08W)s& zp_kn4ER-9Kd5>|*Kb`k~d808dO)??fnV(|UW8`cfFaDn4L(~>=MfpffN-KFP0;Cz$X zz+C|;Z2lU-8v_0n)e9eV_OtQ*^g(CXK})!DjRh2}@}y?N-9I$Ijf{#6M=0K?=SB`b zdhKrHHRk4sA5159YANxWOfA-DKIA-HyzXfngl%WCxGU&cv!adE}IX~ zBIApp=CX5l zu(>4Na`(Z_`}&TBuwgx>pIqn+vbWUfEeoC7&xZ9iW*(ZrN0q{K&Np`CIYhZTA7CoH3WR@C$e7%K0e(5`)w~i{uSyU;`1YD*{rwlh*dOohj~%Ty_4Puyh%O$ z5ocIt-V2}?dIp~RaOcCFS{3CD=&;4&4Ao$pM=v(7Mv@ZuFE8Q~XKmx$^$hwO1HcK) zT0@wgjp90Z$r|;tPGyqT?p%KG)Cpb$cIVT*n16W4B!j%uSuOJ7B^Jwlk})Y<#SUJV zqWB65p?HZA2x4vP;U=I!2m$3g!vZLiv^Pnr3DBx&vK&G|@PZdsaCy1~)S!2j+c;;J z8eb9mWhIT>@(KuU88340{1oWn-V1qn825X(2_rG;2<;atWXkPA&&KkE z4*YS53j6p8{Y4Tt9QLo14(B}~``442#stU%sCXw!#| z5Hi<)$tdqhqhx_(IgB|PB1vAHh5{F80_-Eh{eQDPDwRMwzDGLd8lm0yGoPy7Li=937m5ZJB zt!{#yynjelfb~WdM)klYPH(+(vD3jMIs~7}CC*rUE?D9$!>9jJXB0jYmpT>r=%r2% ze4aF)f5|6X@VGP7Lg>h4PB(ncUgq@0XNK`DS>_Cc?~`TD@9;VD38!yi?UNu}nLA}A z*lD)D?g{6_Rv6A~c}j$PLTBsGpK!{&*U~H*v)p=11TlJ--8+22knp9hH+b3ZR*ZA` zgV%^BovS!{QhKDL7(FeHo@<_z(KB1{6dJ-|bU>}Mm%Rb+lhryy>7QNejORC5=bX;( zd3DaRj+0ga#@ivW-FgCD?rt$ayUU$K)Ys@?)S7)8LMT~ zt@_xfookyzwE1Z>p7&be+-cpNeSU?rG91RkcY44or=xYZeqg0@96r%i&Io)CU4`M- ztFhj%(TA$R4?v^2=M>^@ockv50{JvPH6OU>WuJy;>!F&svue>0B!HkLLEAtPU)Jt>?e!{KZwcItYKzdhzHOCa+R8Z=gdmo?+}!9L#c=L zJ1;q9ff|O&QcxS6mz{IfGq<9igHn&`D_?g0(7Ey}#p#(@#GIkjqHxk4ZVyMT-&@EtI+Ae(k^l??MLE)z6E;8-mT}On zc?HT-7!T{zSRlk=-#4GWdf(Rzo&k77$M=(FL!oHBQtoAD!0_?z*8Bu`8Op7CRbTn4 z^WTAUUj~?E?j(H7J1xr?&=-4eTBBIHw=(K}_Dt@%y;;wF4QImjZF>1@PCq``)9{*8 zGUQY2zm)L?@6~uESV0Ms*LWqI9+KN2D=d!VSk`_-4`1taO)f(`pX;&QJ9OvQoi4Ez z%y6sz+giu1^Z=ZT2AIBYC3jHFWF%=+Of~b|s@>O};ds<1d(G?42VMEP&skqOE(7lW z(izsZ~A7eT&CLpvn!xr}`~P2-jVDMw#kwP1nOat8V(kGS#-UN!t3nv~4^4Y5U-b%kiC6 zj{|}Un*TZ>o;~y5m&E!oE~t1D(2G9K?Iq~SeAE(3BQ1dEHxf4zgkR?R-+*A_u9 zC32qBRsE9Bdp^`vU6}(B?csx(F=?22KN1>j#GU-Ek0I!Q=_odw6GK?RM>FMR>2uO* zI9|nmAgxMz?m+c{B*zeg4A8FlM791jonJK>IjA~hUL$O=YEES_81c1dsrtThRaU?$ zRumz86I$PXy;T}%%?D2#%2lcLv`$v2-|xJU*cZ^Kkr13-Bf$oKO*Iwj7xuL1v^{%V zW#15iYZ;j_Een`9>>HW zFE8i`3`rp!V%#r|B>(8C_USzN9rnLs?2&HxCtYc{Fo&*2Fof1OJ=G1Rey700)AC$q zm=H(YB9uD2m%3c{@2$#?TwD*N6sA^^-%$*AV91!h65*+bqwYG!R~t|25fT>T8X&=?ys?+s-)Sj6)kPcu2F4ou!Q&I!~Aiy9miej+i#I+Y9aTN*V zsk@mu5_vhc=5kQ8VLFIgcQRY#FkM&*$!nd=cO_kCB%Iqc;d~zr`u@JEbl7B+FY1fC zbpu_%iHlDvIg&0DhOKAbE2M6I@>}|;vWy7`CC@-|K7lu&NiMvJ7iyHtuf!CcMr`po zW@L4EOwub4o?bz4We_aYcu+Cx){Fpc0NhbkK3FXkxP$7GXL`*UYFb6$48XktS20|} zyN&l@heqK$2Lvt*Ig{Vhr}bCu5AzYFEf#GJ37=+)J~Y2TmT*)MfV%u5P33@wO0=s_ z@2`qVa;R!r;b;B9o2WRohuSB;k!&3TtLP*4P$gybf(3aMknNViY8UvSi(In@F7JhK zdteU~usW(=-a}Q|&qwu_d#JAIwM@APyo|nsE(B!ndX< z`m#OMP_^jasJk0pwp+5N8dbU;K6ZDTBQkrf`PC%@R3G%3Lk6fl_O8Wyi)8iT zmcQo>m_}P?hyq@M&EL5B)+AMkr$Vf@yi!4dE?PdDD~@Rytp?IwQSbsNARpcH74x3@7`J;xV9X+WSma!)SppxN`l{{H@9jrR) zKkcQIwNdXsSPirne5#l1rTRC8b<1AraK;_Hx7uegVP==*fCR0x1~9wj?lOcLMb>|D z*RA;kF=bwiesFI!%>FQ{KiONA_VuD_HhY=UL^tf=sSm@sB2BCwFi4F#6nZY@EE2#v zgVdrtAQJ!~_QH|jPysNM*tx;b!-xMWDKldTs2imEI@Fpuoc?!^D(~J1Iqn*O1T{QH zC3+j(v)Hiv^}hS4Bgmw~hNymLAisHMH|*=)9u{i-2KkN81$YIAgMz0>!PI}7MR|30 z8jSg5jxy&DR{Q-Z3^oi_WB%WU{ly{bl#U*&$b^+zAO<9oP`g9b*xmsWg9(g>2bsX+ zd^LE8|pZorN^b-=IB%Z1;}!%Zo9AA-(J+9kJ?uaXx0^S`lyh8_P%NliA{8ftrQA;&(7By%39*n*#utu-qH~Vi{kwqC zYjP1lHCC4A^+N}#0}Ja6JTl~j^sf(4{gU-tC|oh&cVEy`4#3e}FU^2)`m2Lf|ALih zljxf6Doek2hSdY(*8>Nr(Z_0%AQ_PFE_w?C@~zSE3W0=tAJALOSRvm-Ok5I>?_0(W zrq|M`v#j>XTJRSu4Y@DsaR9IlG2YxT3kRp0ca|ANp@ zMA0#aW09~DbFcE4jTtLeP;epZ^w)J87m35VhpYCox2@GDx~j~&Q(xk$u4Q*e3qwc? zK~+$}5e2s@z7AAi2Gu64A9mFcSSdet)yU4d;7}pXeWYbo6n}7(0x1t0p^C$pLg+I` zsIJyS`nnOS;uJ_bzR=Ej9i;(jj*)H_poL)zrmk`BTDogMe`ECVhf!!E)FzOZ0>;ap z%1t;6IFQ8-Rs%Y4I7U$_7ssVJeb~XOE2aOr2ji|3)XqeBdzewT9jtETqr;!y8L!lb zAEKVMp{%qYsg7mfxg*uq*t+ik&n!KDl)9kT4H4Q@RYe%jCey_Sio*gBJjL+fQ^aC1 zOYNk)jD|h|&(Wh*C*bYe(TYain$fCTcK|_>kkZgas7qKuQIOd*JRsxN(Q0hx#o$FV zS6T2M_6**jiYZMkf+77+J5+V-JpYy!lT@1|(+^cW2|1{vDxeF%cwitWZlE|A$ng=# z>!w&mQ8LvHdfTDuq(YCIVE1rf7yA7e<)(rlNP3)L$?8YPs1r&&LdM+Bp(*E6QWv}z z@0w%PBYvUwPcHhO>EvPeCB1np4sulkKA00Lb=AdCQy2V4TVqvwm@@u(vE4s6s(B_1 zywHyB#&bI~Rp{=Q*a!RL73>=Np|NVOvnnypba-{UT2DVrm0QnFyKH->zKBAlE5Qd?V8IpSq!pZTw_-GH@2NV( z5G_{fIlb*L+B~dZ`_e?u` zaUW!zzW6YP+5{An*=e6F9t>13JW35m>*9!~>x??28O?){b8-&(0Z{FRz#to$GfbM~l$HCMAcQJn@;JoTL2 zyk6o}n9_v)i*<&pA$wv{ugeGaff8w5?XtGLJfq>UIBlM11R=ke*RafX+W& z4bJnY4dK)Yu>F*n|Hv8 zs!zx7sSTt63`C9P-bB#o(^s9Sy7!(#Zvni(O33ZNUV{At`-Lb`E%$!LI*hfawb|aT zQv-`?4L<}SRW2;oFhx5S_sZZ%iCRf7ZBU&~QdQPMJ?kXZyWMx7UjI<2yvW_|x!UPJ z4~vxOFHTZ_u%D{Z$Dgc@@3`nuNH${?e*}e;x$_t>TR(TQ>N51HDrklSL!pZHBfhte zrYys12+FLm-5{z1qJBwniWPW2N_Rd*mE>|42T3A960hKrASxO}>GP1gb5KF2Ac+$s z$<8|kqbeJ*^i*_TeCtoe92MX1y>FM_82Z!si(7`Qt*BWxvjKj?Nywg=%{ps&iBDO-Prnmo2U6VtUfgi?jk4O$-zvK7$ zl<4T;Qn_Ji9+P;K@QI|LJ(G@-`?E&5OM~38Ac>coL^`?<=6cr|ovG55K~sG!;L6Cu3lr#01{o3JD|!};LiqOdzGJ-ac<+1T zS*laUYty8~Y!l%MySP6G_az-!*w*zMoEM4na}wFckDQkmDTnTmGv!Av%8SH#J;~YH zk6eMsU-*^cu%E=X@?+QLWyMO9DlGJ4Hu^DszzT!431_Q&{Pt`NupUk)+%5FUS`KcK zao5r(SceMbPRhb3tN6I|#+@GcU?XR|dS&rt{Q`-gK({L*tweEGR1{)}@? z{6EfBzx4ao>c>ex9Xn6$9N-+7@rF<-T@9XsA6V)9UyH5C{I=bWLC()k# zQE5E`X6w2?g5SSK;*Gw;xft0Qvd6`$S06Y+6iwV!z;2xmkLWe|A6&(691|O-2ToDF z^}QFXg0jX@4(=3lQx|)A^eY#uQYrtli&eQe+Fs(-xbG!ukc3=tiRxI|xRe4cNRFsL z)d<#iUZM^j+Bm)ycB%aX?~ZlwE6M}Abz=z1F7+xNeyLaSnU{JM&%U%-#YOoQzkI10 z(WH4D8yDXHGOu~RxXi2Nyvw{=W?ZHQ4QdQ^ryU}+EWg_Am#KrhHqO~a+MCR^SO4a6 z)j_a#>E)_tY_$+v|NU~+&*$$chUD*Ft}1`ItSLV%kVuMN99ZThI5_l-lg}KuQm%b* zBXYMUBVZCDV^$lVu*Y2CweyNARG9#B+ZC!jHp>7~cZJ%Yfwx?Vp%Pzx$d#Cg(sA~c z9`ffRB-6N+_P7E?(_YNo_5?d5;lu3Go#Oj^*)fX&GIHQrFL!|-jqxq!E(?4tXtnS2 zv#t-aa^C80_TzCs6noLpe^TdnS@)DzdlaVkv^8#QA@13RSqf*nW2yQ2-9M?}`_*oP z>fhg8y&ZFb1pqYV*`=XI`e1Ltd`(6GcM=o#acl6w=7i&~Qt6KCkpR(S#&#)y*BuTgUYG(q`iSnEmZ1pED{9ydvK z*%y%7Y(iUHih&(^!~Zm*YWgSZamO{o(E@}Gz^Qy2+kmip$V5s5b=@S@p$n5SO$wI< z*pTRr(`3J#q-NNiNNLxb6t4IZn3W;Ng6a9@?BB0b7g$Z&T5-MVUQEM?i`hDCG4p6p zOhEaknJN35>($laT$?agK$||FqHf@7`IR@SzaHRWZpB|c?svU_O|+Iu-5xC$`6+y^ zq-Ffzzp3jAJ!mK2z#{aUe^b57ee9y0sL`g?1vX?%Jkz*b60e#?b@@%|q|OZ}lk3@0 z*O+$jq5;REt*q)+eJhgKn_tmi-K4q|O?s7Kd7Xm$q54;2&<0x^QLQ@pY%zVRfN^oP z8q&G;FQ$AuDBouJvtTtw`OjCY{*?iw-WCm*R`QN9cnfu%rmA#1uQQt68&I5N7@ey6 z7QwDZQ=!=eYk?79*VA=VReR5L#T|iu`z+S)nXaCisye#Hbk!`0Fv95wK zGmTYG7&CohMaMPWtQ*TVtX}x=saJr##iy#6>yE%~c(^PrT1w0^I zPgesoH2!h>i=1J|H4REJS(b~aY1p=mAz(UymF)_$-Uzd;4{E-{Y*OO7>J1UwHdKQN zx-r!Zp!lnwny%V9Ugyx|x2pE~)9J9_JfveYRF4xjp+-*@(@y2q=lg-ab@~1^fd}UN zpec}j()(bfK<}gUkwvh-%uqe4l0G;C!WG}=W~hqfN|ZpGAMQcbU)(DDua2Cl_UuC> z89OOAGm6DJXgV0nJ1~NRZ`KoTQ5^^QrdXfl2cX1W*jl4KVm}q}`8kIfz3dirfQR%u zx2Uq9L%OwIkA$5n5;V!9UuUiM?nQP7BZ1?&iGv)^0I_cpV(wL~6oGfCRy__{G%XnG zD16-o@aN-qUcMjrot5vOK25))jSc-f4Qx$8WDD3Dv~z6L=F1N9yX98yD&8K)Q)^8* zN^hU3x&UvG0G)Dp`)3Ysxm{Hr-cGtz4JOH_-HIt3zS5XAEjOkw8WTv6=A{2;eq)68 z2mBE2|78b4CBIL2ux-9Wb#B^EKfA5DfN^JIOW0wzs}p)xPd9?a=QVC)1?6TUScVF4 z1G{fQSeMUHY4mrI(YR_VPblVka&6e>%x037ebzu}SBS(Qvni;C!gE+(L@iBN)ULot z0`ZZK%7!g`^trRtI3oS6S*m;I9l$|PM z@PnQ=K_Aai-Tk2Ub0yV2bCnMu#he+7Jn^*2)J_T3*#Ouq$<_eC^vN=;#{8i}R={L~ zW|BjaVKVOEOo-Q)n>kMV!QrjzK$Nrm4|cmum?M8fsOiuj3?czz>i6zc2euY&!B#zU z=UlDscNa`&SV^g00bAuC?otO>THk$_x`hiTc;f~Kvz(OHBkzX1e^#G;w;GT2gV*nd zmON7@<|(%@FWJn9KJ;#o?OA=R11+t}-CtZbTf_T&YjKM~y|@^Y6g|cTi~(Ye*aJ zQ5Uk)^k1xobh>^vtc#JMQP3ty)ix6trUL4S33# z@XfqWonw8f>mF4n>fhY2S|QJQ_p4J(d)Fb6-`@4yL~R~bMtj%Uc!O!BZn$4vXqvSW zNf~n90%`Bk1^Mj_qrLxKp!%}C=?4VY?gMIQ$#f8_mt7yOh`Aj`!=f8;7kkCr`~YSI zD|GlltgKGfqaIWP0obJvVm-S~&v;Pnjlfk8svh_>Jg81V+z}6{lMK+f(kuXao-IV0 zi6B%o7ki`u;!6*y%MH-g2xrJKH3Ib9ntY&R0Q#*OHDYKr7jw8o;)X_-D{fn}%CURF zb$DVId)^yGLmiQYSo9G6tA%Pv2QPYRgwu6H)tI5`P_W!v3$cQ{Qh&Kn9bO9d2;-sa z2Vma5ro3YqJm_w<2;eGx^26$YcEUb5N|o-231wmgCzyJ{!|J?_b&(NPdC7=Sc`^4q z$dhTvC7d!wdG+65nB$Lg772eeEXwi6=tm8IB!oYt=9T*QkE&+?V4ug-NgkmQ z0iMuPACpD7`yTT-9w(QDqXuOKnN`_*WO^JwQh$fwfbFLcb-T^>UalP5&(YnMs*+sW z!25sHpDq<<-nP_l;9lf?4*c$X57G-B&+-0{Ws-c`vPGz%ps)v&($pQiX^D zFwI#{NIMrjq59@}b^(~?sb|!ly7WoaHE&gL#FJ`7p7+Kljq&vHC&9zd>ieEm2XydO z6u~IcK`Fxu(CfE9tA=%%L_{gdhr+^EV82)a7Viu*6@Z!k_LLfI&CoYKhqg}Fwa=-2 z^}t$nu=0w$Nncs3emMeCEx~;WlF#*uyh*y?+(?CD7v!bg3*-Q0c^e|iIPva5FMD33 zJfTyo)WKF#PpMOt_Jv`>zn1E&Sb5ghHP7@4}Mym zhecH^g^Wa1*mHm3g=`njU>G@;ULmyHbA|e~p$yKt2`#Hvs1C^gj}>Z)$IOTzEf0D| zVWnG7ex?Ol9^NHb>&0&V5F`LPS=8O`FPu*6|6G@0;gD@%jW_8wO3P*6WG-bP6j+K6 zI|=zAVuItUZkY*EIRYCdP+pBw_3-DggQ5khU%69)d)a>k!8?%P2k5D*ROJq-Ua-4V z$JLOedcsiMA=S^;r#!C;L5K0r`<=G3AXI>&@r-16Txzm@>3P{_kbD700w(K$FQ~J3 z%m+pK=@-;TDD8pOs&nDwh?_*W0qGnpIJ~)94MPF#UR1r2;D8rVs@9jks7}uHWa%f|rmMYkTO4Ev)uOr@$3|;oJ zs>E(49;M>!Ra7i)LnKtkzO4HB`5zjHz>6R zhrm|q)7Gf|`LWn4h?kFqu}DXL1Q*Th444eWhP(E za|JVRnoYJ*a{`_^-I$0Z}drd$2rW(i+p_;T%;>I9l zu5R#c3n{1H-neea?N{DFtL8TeCrn^=foTD-gT*CzgcZ(k+NP+n5MABq+}>0^*4gw$CRzzCHyFaqg$<@doBNXkgtcE_l%Io@@m=4B#9O)$&ktN zl77Xc$rh7hKX-o0KXV?XTr)9h+(@!r9^^Ngl)gW&-TTZn70V zSqfJ3&;7WKHsU8wFoqJGKjMCW{hRfw;K%JzpR-=|uwTNu)_V2F%*?ylKYO_q1?|x` zcd6$sDJY`%HP2gC(2m~EJ#VLiw)FmWp2^#lyB={Y(DU{vfL>&~FMHlz)PrsJYtK7` zsY0cL+exNF2t6BU#I{SgzJFsA4VHbK%cIyXfNhDSaFtA3N z-K4e`R^1Pf%H7Qj!uE-e)IMB{+xn3@rii1YEU!WD54-D4si%Fc#z0v~QWDd0O|v6b zjF*0lU3O55>pxbw9RX#U;jLQu1Di%@<6eni>|^=uC#r+PW9pax2a0`}uZiI@2BV5u zTwB3|Yfz^2g8!<=2+!}gV8a}~L%+mv6c6NW4+zMof2oeMUx?^}uhik%`AXdvc>%^C zeNZ2(r+)cU<>(K-QnRdEb=BAE!NP_IrM30=ptZxcs@L~ezmULErS;mkAe!brT|7{QT%PuImub@!3+HmZI(;C67r@4%7qZUr^) z8T@{0VOM;-EBNb1Jcrlo-%Ms>U@YWzV$@QGPmr3b2Uyh2W%_bte9yenwpn_>sCd`b zIN}jD%#M{F1fDu7-mze1P$@$GJSyH7!!eTCNtgtAI~2!YcdjHVfU6a88gd`4)31(- zcS}{HsaO-nK7UgA>xhnyj!%dsL+;9NFkp{~SBAk;*%4#o2U@~^@5c95n^73J_HO;e zVeyXRuEjM0#?Xkhw(ld@Ys%vX;c?}VmEgzgq7_))`(`;)(B6Y{0C)y^ zf*Z!JaCaWU1>wXy%%gwdahb4NWgm%@q149_ec<8oergtyx%i`R`DHvk2?`(g z0Hl9nHX2_#!JYm!`T$U$5oD}CB3>3IR=zzV{?G8Fua@g|N5=P3b6Gb2=(b12=Zr$I zWEpPg#RxW_0#`Pq!xJl_6AVd0+(w()76A>3uCzr{hAliLWqo~Ae7FrX?t66nnATGO z2Fu`*>ZGri>sd#~2W3{U+V8t!))vL*@J_^zO5X2SQCwY?x*lAB&-O@#mGZd<{-2L` z+U*kabl;~j=U8$N%unH-JsNXQB*#4ixpm@a!G?rj{4jS?bWDndAnjUp(HQ#VA7oG2(Q zz*x39;zBx%XJ_&HRDMIyCjI>}@%Dp0!8TMf7XP3QKCQ=YmB!I36j3TYWyc-k%wNZU z)fEVd`3S+O6@w5o%ya6uejVRKArUMEsI~R6@iEeuPC7PT+F@H{V!6Wx;D0oXK7{Uw zUU0*)@pFrS%jo!YXly4_Vnq66!Ey0E#k1H=*+IBxMLG%u4EnA<;<$K8AM{vCjjPh( zOD3QxTz<#i+li^G`EJo<%5msE!bf^4(r5f08ybo2&!N<}k+VQUSNb)}CP29S2p!i- z{T00|LW;1bArKc~qCcm@V=C-Ul+K_O93YpZl!Nkoxda`OuZ(;Q8;i6h9R>xFHj=s~ zn$FO~GAZgyE0ELzfZz!f<93};5t^9#A4a%zXyOFIR$-$p6_D0G4#FM|m|WynMTim_ zUO6>L=`TwHL<>Y1`|!q14y z&yV-SWvdh7`?y!j@y4BHARySMN4Ucmqe+yM4#rFxAOWYIbV9tJ^kgpN8fk8niLjw! z%oF&zSZEwH(IA>OuCO_C6Q${u?1h?Q#HBByfm)u!X-0ABP3W~r&{^+!VmwBVKPwpjLy3tZID7%Z{;~)L`N%0ORc_Pb< zRp`pnJs_qOZ0vEX3OQp z9#>=@W5z#hcQv9?&pkQbt+NqOiXA(^oip4Mwkq9du1R^et6Q5qEL3h)&R z#h?I8r}>mA`<+7;=O}RVDe)c|NXw{SfbCURj>84ulWQSKAPpe-#*f2M!H7t8(5*_; zC4zBHRK||pXm<+lM#b0EQrkS_&& zGI{yOLb6B}@&vU}(ZX{YDw0_g0ZfxC4=|G1g$hP`q1WN1I3cvxh0__~c@G^xP>2W( zc(fu!J`9_-K(>yr5c$aDoRQ%Vcto)M)1iN z`Xd$ma#86h47615&E(o6IN% zF=|r2rok-gm4b=Wp?%_zlucX3RD(hTkArHDe~>kI*YW*-Uz-crpA2 z$)@MWcw=L9urG0Zp@}hE1e7;6HWp?T6k9SjzVnB8kMlT)`1yBHVu`@wJjsYfQQ6Xw z!?D^;nfk*LKV~Gfo^nRKcnAh<>QsTO#2Kz8Lw?XIYJa}Apx-_tKBSkK(^%e|rXrlv zydvXMpGCMN7=i@6Uhj8iynEa0VFvQ+;pz+Y&*pKy#rYtc~Z4^SlNFj+B0#6Br;hf^P6S&O3ybXOXhN^#?#KKH`-@XVYQ zAgP^N!NLDdx-lWaYK%J{ZeH09nB89ch1wx{u^-)ToV(16&f5%IWbB^Myt!i-Cb#QW zVs#;r9arxr@xxJH7SJjA@*BXRCU z@s6b%1rGmOJrpd!@FG4v8}XS|)k zp_o{+65JOV&dC&kg&XTjoLAU#ARrwo=mPE3;+=-De=KLlfuBr|I&J5iCNmIT-RU z*tK?}U|xU#kQ;*r&PQ9&C$~ube7V3hCDaqJ*u%LI2Yeh9&iP7spR5_ifY27{jg}e=D)r-OWLgcQ20PBH3s4_KV}En3I}LrE228PtqZ7JYf?|o~WIGe4txMx& z8REo83??Id!2oSX>tnoN4Z{Hh7EJb@ORkfqSy^n$!WWVQ^GsA(3{7tVc#i~&dZa7h z6m-8(89r!Jk^N-^jMJLrX%#yb!2I0QvuW!B>&^td(_`iNm3SdUO~ z5+D;!{oSSUF70bxG`1SFdkVTb%{8go?7++7r&aryYW+S zap*hm#!CX@_}Z5M6piD1zZc)ro)XsIS6l5XxOIgL!S@W58{+CAQn{NAEEOU5&-(WF z;(a>LTH|x?`j_*#cOHVVLi7H6am&gr9iizsr}agByx(4at(ffF?jodi_lCaN6$kw2 zu6_mCc|o*)D2u0}j@%GGve~sO;9FTa4WkKI);T{D3$8fhl`-`j;yrNT;OV^{5{He!OR|npaU*p*x))O5a*KZZ$qxBA*L4gp0oE{rKJm^IkU%wB0qY z>X+V+PqJq|t&jO2zQ?#p-~;J06~H(aZ_#PE(wf5Z1dWH(z{%&vAnMNCS!#C+gn--E zUBT`z=hVD_wGyB=e-J;k!?w4O2DE{^!@zMTrxG?q*e^CBZWEwvAx`qm`e#dV+1S70 zb(ZyHcIAihu@+W~iZ;cMvcn;L_@;PAc(2+N?`EUPcW;VU4CPU^?r5yPl3W2H2c973 zp`kN9Cto^gg@Ao*2s=>b4V<6c6#rf4+O>vTaD6i{Yq}1n&}a|f|I@Tc*&tf%yp&*FXY zS^Qai1U}z>7C#6{hJ7BtyUkOg7GO?=Q?}p%+?DnD=kbxH;ZX8|;1q&giAQ394|cb^ z^brm5;z64{gpj8MAw(DYJ-V8_g#u}z#-(_B7rG;q0?Bz>L;P2r*R)7WP-k({it6F} zsG@9_FX9ze2Jg~XZgL{b$mOtmlymJX44G#ScQc%m| z`5sjT^|ZejvK?_WqrV9&uG48TniWNBb7BCTPgFP z#*iJFkSvE^?f`<6w%qSCA$WNmGOT}N z3N1-dRi(Jz0KNRVg7NN}rG3Z1{lYzPN5@nt6==A* z|DaVG!q<&l?6#iZ=0Xc4R5c0Z+d7t8&?J=mB{AD*5}J_Eq9&nujvN-2GxhiXjTg78 z`gD0{&roPs2x0-J?%k_DU9S88H~y>tUqd&bQm~wG8^}B6+7oPr%K5@j-7EFJTjMW= z=dWL$jei4i?A%X5IR6cO+PCrI0byRwhnK1#C&;|Pb4OmNyVVQ=L4=olF3n4&dUU-@N~jw5G3*&dds)*-|SyQu_ii+DKaGiv~uwp1`0YG>QXw|%O2p? z7*P%PAR_^9+7|C+L-a4%79ViXTp9hM?w$A!La*W#Y=iBg;^MVz0}xUS+ZLWB0F<=B z4hROf2nL5<+vDX2Gjl(%1(#)bPLY^GmIg>s^tLchWLm*^2wB($%x<(G49xQW)-C#o z{)uk-q3!Vzsoa? z*bpV`5#`));#mE$l_*Vl*v9pK9=40@#DoJEvpC9~JQ8y{kVXgDF9drq$3p{RjX_#| zQvI}@IBI|4Gz#X%Wl%P7dxUF2)&smEcZsPiKcPM{oG7!wJplCF<}iL7P8`~9waLb7 zPoXs!Rv8&dTw-r~Lq8cwRQ_%o5{&b@HLg1vpH?HPUkX)?*ciI{A9%0DZ5*!{Upwi5 z9mOXYU$y+rJ*)oVZVX*u3eY2?i8L!bGn(kZ?@iG}$HEosfW0!e9v^J#c_fkgxnLsOEV?n)eZOk^V5HW#HUt`J~ol)skWfO z&@ArOCoPSYAaG71u?e5vOJjY4xa`to;=OPb3Qb8!AGs-xjnw{a|3!dEXvs37dR^