diff --git a/.github/workflows/docker-build-workflow-dispatch.yml b/.github/workflows/docker-build-workflow-dispatch.yml new file mode 100644 index 000000000..ae79eed82 --- /dev/null +++ b/.github/workflows/docker-build-workflow-dispatch.yml @@ -0,0 +1,43 @@ +name: Docker-Invisible + +on: workflow_dispatch + +env: + IMAGE_NAME: ghcr.io/bnb-chain/greenfield-invisible + IMAGE_SOURCE: https://github.com/bnb-chain/greenfield + +jobs: + # Push image to GitHub Packages. + push: + strategy: + matrix: + os: [ ubuntu-latest ] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v3 + + - name: Build image + run: | + docker build . \ + --label "org.opencontainers.image.source=${IMAGE_SOURCE}" \ + --label "org.opencontainers.image.revision=$(git rev-parse HEAD)" \ + --label "org.opencontainers.image.version=$(git describe --tags --abbrev=0)" \ + --label "org.opencontainers.image.licenses=AGPL-3.0,GPL-3.0" \ + -f ./Dockerfile -t "${IMAGE_NAME}" + - name: Login to GHCR + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GH_ACCESS_SECRET }} + + - name: Push image + run: | + VERSION=${GITHUB_SHA} + echo IMAGE_NAME=$IMAGE_NAME + echo VERSION=$VERSION + docker tag $IMAGE_NAME $IMAGE_NAME:$VERSION + docker tag $IMAGE_NAME $IMAGE_NAME:latest + docker push $IMAGE_NAME:$VERSION + docker push $IMAGE_NAME:latest \ No newline at end of file diff --git a/app/app.go b/app/app.go index 7cb184c3d..94542b87d 100644 --- a/app/app.go +++ b/app/app.go @@ -746,6 +746,8 @@ func (app *App) initBridge() { func (app *App) initStorage() { storagemodulekeeper.RegisterCrossApps(app.StorageKeeper) + storagemodulekeeper.InitPaymentCheck(app.StorageKeeper, app.appConfig.PaymentCheck.Enabled, + app.appConfig.PaymentCheck.Interval) } func (app *App) initGov() { diff --git a/app/config.go b/app/config.go index 017a094d8..ed64ff7f0 100644 --- a/app/config.go +++ b/app/config.go @@ -8,6 +8,8 @@ type AppConfig struct { serverconfig.Config CrossChain CrossChainConfig `mapstructure:"cross-chain"` + + PaymentCheck PaymentCheckConfig `mapstructure:"payment-check"` } type CrossChainConfig struct { @@ -18,6 +20,11 @@ type CrossChainConfig struct { DestOpChainId uint32 `mapstructure:"dest-op-chain-id"` } +type PaymentCheckConfig struct { + Enabled bool `mapstructure:"enabled"` + Interval uint32 `mapstructure:"interval"` +} + var CustomAppTemplate = serverconfig.DefaultConfigTemplate + ` ############################################################################### ### CrossChain Config ### @@ -29,6 +36,15 @@ src-chain-id = {{ .CrossChain.SrcChainId }} dest-bsc-chain-id = {{ .CrossChain.DestBscChainId }} # chain-id for op bnb destination chain dest-op-chain-id = {{ .CrossChain.DestOpChainId }} + +############################################################################### +### PaymentCheck Config ### +############################################################################### +[payment-check] +# enabled - the flag to enable/disable payment check +enabled = {{ .PaymentCheck.Enabled }} +# interval - the block interval run check payment +interval = {{ .PaymentCheck.Interval }} ` func NewDefaultAppConfig() *AppConfig { @@ -54,5 +70,9 @@ func NewDefaultAppConfig() *AppConfig { DestBscChainId: 2, DestOpChainId: 3, }, + PaymentCheck: PaymentCheckConfig{ + Enabled: false, + Interval: 100, + }, } } diff --git a/cmd/gnfd/cmd/root.go b/cmd/gnfd/cmd/root.go index 0b864b42a..0df872495 100644 --- a/cmd/gnfd/cmd/root.go +++ b/cmd/gnfd/cmd/root.go @@ -352,7 +352,7 @@ func (a appCreator) newApp( cast.ToString(appOpts.Get(flags.FlagHome)), cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), a.encodingConfig, - &app.AppConfig{Config: *serverConfig, CrossChain: appConfig.CrossChain}, + &app.AppConfig{Config: *serverConfig, CrossChain: appConfig.CrossChain, PaymentCheck: appConfig.PaymentCheck}, appOpts, baseapp.SetPruning(pruningOpts), baseapp.SetEventing(cast.ToString(appOpts.Get(server.FlagEventing))), diff --git a/deployment/localup/localup.sh b/deployment/localup/localup.sh index 625354f40..bbdc9d9bd 100644 --- a/deployment/localup/localup.sh +++ b/deployment/localup/localup.sh @@ -180,7 +180,6 @@ function generate_genesis() { echo -e '[[upgrade]]\nname = "Pawnee"\nheight = 23\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml echo -e '[[upgrade]]\nname = "Serengeti"\nheight = 24\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml echo -e '[[upgrade]]\nname = "Erdos"\nheight = 25\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml - echo -e '[payment-check]\nenabled = true\ninterval = 1' >> ${workspace}/.local/validator${i}/config/app.toml done # enable swagger API for validator0 diff --git a/e2e/tests/virtualgroup_test.go b/e2e/tests/virtualgroup_test.go index 7ef9340ea..adad58fb0 100644 --- a/e2e/tests/virtualgroup_test.go +++ b/e2e/tests/virtualgroup_test.go @@ -136,7 +136,7 @@ func (s *VirtualGroupTestSuite) TestBasic() { s.Require().Contains(spAvailableGvgFamilyIds, gvg.FamilyId) spOptimalGvgFamilyId := s.querySpOptimalGlobalVirtualGroupFamily(primarySP.Info.Id, virtualgroupmoduletypes.Strategy_Maximize_Free_Store_Size) - s.Require().Equal(spOptimalGvgFamilyId, gvg.FamilyId) + s.Require().Contains(spAvailableGvgFamilyIds, spOptimalGvgFamilyId) srcGVGs := s.queryGlobalVirtualGroupsByFamily(gvg.FamilyId) diff --git a/go.mod b/go.mod index c8516417f..d74e82bc0 100644 --- a/go.mod +++ b/go.mod @@ -176,7 +176,7 @@ replace ( github.com/cometbft/cometbft => github.com/bnb-chain/greenfield-cometbft v1.3.0 github.com/cometbft/cometbft-db => github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1 github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 - github.com/cosmos/cosmos-sdk => github.com/bnb-chain/greenfield-cosmos-sdk v1.7.2 + github.com/cosmos/cosmos-sdk => github.com/bnb-chain/greenfield-cosmos-sdk v1.7.3-0.20240527082454-48d116d99ca4 github.com/cosmos/iavl => github.com/bnb-chain/greenfield-iavl v0.20.1 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/wercker/journalhook => github.com/wercker/journalhook v0.0.0-20230927020745-64542ffa4117 diff --git a/go.sum b/go.sum index e09727d9b..4575b3f99 100644 --- a/go.sum +++ b/go.sum @@ -163,8 +163,8 @@ github.com/bnb-chain/greenfield-cometbft v1.3.0 h1:v3nZ16ledTZGF5Csys7fTQGZcEV78 github.com/bnb-chain/greenfield-cometbft v1.3.0/go.mod h1:0D+VPivZTeBldjtGGi9LKbBnKEO/RtMRJikie92LkYI= github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1 h1:XcWulGacHVRiSCx90Q8Y//ajOrLNBQWR/KDB89dy3cU= github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1/go.mod h1:ey1CiK4bYo1RBNJLRiVbYr5CMdSxci9S/AZRINLtppI= -github.com/bnb-chain/greenfield-cosmos-sdk v1.7.2 h1:Xr7NLxXZKHhRX1ccVCgOwo1miw4HcQ+POirvMKzKLLo= -github.com/bnb-chain/greenfield-cosmos-sdk v1.7.2/go.mod h1:2bwmwdXYBISnQoMwgAcZTVGt21lMsHZSeeeMByTvDlQ= +github.com/bnb-chain/greenfield-cosmos-sdk v1.7.3-0.20240527082454-48d116d99ca4 h1:0UFOOdVKbiIEfKkL15NJ/VtE6TSdlwM4HtJJuukJfio= +github.com/bnb-chain/greenfield-cosmos-sdk v1.7.3-0.20240527082454-48d116d99ca4/go.mod h1:2bwmwdXYBISnQoMwgAcZTVGt21lMsHZSeeeMByTvDlQ= github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230816082903-b48770f5e210 h1:GHPbV2bC+gmuO6/sG0Tm8oGal3KKSRlyE+zPscDjlA8= github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230816082903-b48770f5e210/go.mod h1:vhsZxXE9tYJeYB5JR4hPhd6Pc/uPf7j1T8IJ7p9FdeM= github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230816082903-b48770f5e210 h1:FLVOn4+OVbsKi2+YJX5kmD27/4dRu4FW7xCXFhzDO5s= diff --git a/proto/greenfield/permission/common.proto b/proto/greenfield/permission/common.proto index e56672fd9..f3a3ba349 100644 --- a/proto/greenfield/permission/common.proto +++ b/proto/greenfield/permission/common.proto @@ -79,6 +79,8 @@ enum PrincipalType { message Principal { PrincipalType type = 1; // When the type is an account, its value is sdk.AccAddress().String(); - // when the type is a group, its value is math.Uint().String() + // When the type is a group, its value can be in one of two formats: + // 1. group id + // 2. grn:g:ownerAddress:groupName string value = 2; } diff --git a/proto/greenfield/storage/events.proto b/proto/greenfield/storage/events.proto index 5dec8203f..d6fdfd333 100644 --- a/proto/greenfield/storage/events.proto +++ b/proto/greenfield/storage/events.proto @@ -514,6 +514,8 @@ message EventMigrationBucket { ]; // The id of the destination primary sp uint32 dst_primary_sp_id = 4; + // status define the status of the bucket. + BucketStatus status = 5; } message EventCancelMigrationBucket { @@ -528,6 +530,8 @@ message EventCancelMigrationBucket { (gogoproto.customtype) = "Uint", (gogoproto.nullable) = false ]; + // status define the status of the bucket. + BucketStatus status = 4; } message EventRejectMigrateBucket { @@ -541,6 +545,8 @@ message EventRejectMigrateBucket { (gogoproto.customtype) = "Uint", (gogoproto.nullable) = false ]; + // status define the status of the bucket. + BucketStatus status = 4; } message EventCompleteMigrationBucket { @@ -559,6 +565,8 @@ message EventCompleteMigrationBucket { uint32 global_virtual_group_family_id = 4; // The src_primary_sp_id defines the primary sp id of the bucket before migrate. uint32 src_primary_sp_id = 5; + // status define the status of the bucket. + BucketStatus status = 6; } message EventSetTag { diff --git a/swagger/static/swagger.yaml b/swagger/static/swagger.yaml index f7eca5f0e..48d31a42b 100644 --- a/swagger/static/swagger.yaml +++ b/swagger/static/swagger.yaml @@ -5201,8 +5201,12 @@ paths: When the type is an account, its value is sdk.AccAddress().String(); - when the type is a group, its value is - math.Uint().String() + When the type is a group, its value can be in one of + two formats: + + 1. group id + + 2. grn:g:ownerAddress:groupName description: >- Principal define the roles that can be grant permissions to. Currently, it can be account or group. @@ -5397,8 +5401,12 @@ paths: When the type is an account, its value is sdk.AccAddress().String(); - when the type is a group, its value is - math.Uint().String() + When the type is a group, its value can be in one of + two formats: + + 1. group id + + 2. grn:g:ownerAddress:groupName description: >- Principal define the roles that can be grant permissions to. Currently, it can be account or group. @@ -5597,8 +5605,12 @@ paths: When the type is an account, its value is sdk.AccAddress().String(); - when the type is a group, its value is - math.Uint().String() + When the type is a group, its value can be in one of + two formats: + + 1. group id + + 2. grn:g:ownerAddress:groupName description: >- Principal define the roles that can be grant permissions to. Currently, it can be account or group. @@ -34654,7 +34666,11 @@ definitions: When the type is an account, its value is sdk.AccAddress().String(); - when the type is a group, its value is math.Uint().String() + When the type is a group, its value can be in one of two formats: + + 1. group id + + 2. grn:g:ownerAddress:groupName description: >- Principal define the roles that can be grant permissions to. Currently, it can be account or group. @@ -34784,7 +34800,9 @@ definitions: type: string title: |- When the type is an account, its value is sdk.AccAddress().String(); - when the type is a group, its value is math.Uint().String() + When the type is a group, its value can be in one of two formats: + 1. group id + 2. grn:g:ownerAddress:groupName description: >- Principal define the roles that can be grant permissions to. Currently, it can be account or group. @@ -36657,7 +36675,12 @@ definitions: When the type is an account, its value is sdk.AccAddress().String(); - when the type is a group, its value is math.Uint().String() + When the type is a group, its value can be in one of two + formats: + + 1. group id + + 2. grn:g:ownerAddress:groupName description: >- Principal define the roles that can be grant permissions to. Currently, it can be account or group. @@ -36811,7 +36834,12 @@ definitions: When the type is an account, its value is sdk.AccAddress().String(); - when the type is a group, its value is math.Uint().String() + When the type is a group, its value can be in one of two + formats: + + 1. group id + + 2. grn:g:ownerAddress:groupName description: >- Principal define the roles that can be grant permissions to. Currently, it can be account or group. @@ -36965,7 +36993,12 @@ definitions: When the type is an account, its value is sdk.AccAddress().String(); - when the type is a group, its value is math.Uint().String() + When the type is a group, its value can be in one of two + formats: + + 1. group id + + 2. grn:g:ownerAddress:groupName description: >- Principal define the roles that can be grant permissions to. Currently, it can be account or group. diff --git a/testutil/app.go b/testutil/app.go index 4a62c3237..b6574d2b3 100644 --- a/testutil/app.go +++ b/testutil/app.go @@ -58,7 +58,7 @@ func NewTestApp( app.DefaultNodeHome, 0, encCfg, - &app.AppConfig{CrossChain: app.NewDefaultAppConfig().CrossChain}, + &app.AppConfig{CrossChain: app.NewDefaultAppConfig().CrossChain, PaymentCheck: app.NewDefaultAppConfig().PaymentCheck}, simtestutil.EmptyAppOptions{}, options..., ) diff --git a/x/payment/keeper/stream_record.go b/x/payment/keeper/stream_record.go index be288b600..1fb01a63e 100644 --- a/x/payment/keeper/stream_record.go +++ b/x/payment/keeper/stream_record.go @@ -104,7 +104,7 @@ func (k Keeper) GetAllStreamRecord(ctx sdk.Context) (list []types.StreamRecord) for ; iterator.Valid(); iterator.Next() { var val types.StreamRecord k.cdc.MustUnmarshal(iterator.Value(), &val) - val.Account = string(iterator.Key()) + val.Account = sdk.AccAddress(iterator.Key()).String() list = append(list, val) } diff --git a/x/permission/types/common.pb.go b/x/permission/types/common.pb.go index ecf1c97ac..5b00b6ed8 100644 --- a/x/permission/types/common.pb.go +++ b/x/permission/types/common.pb.go @@ -246,7 +246,9 @@ func (m *Statement) GetLimitSize() *common.UInt64Value { type Principal struct { Type PrincipalType `protobuf:"varint,1,opt,name=type,proto3,enum=greenfield.permission.PrincipalType" json:"type,omitempty"` // When the type is an account, its value is sdk.AccAddress().String(); - // when the type is a group, its value is math.Uint().String() + // When the type is a group, its value can be in one of two formats: + // 1. group id + // 2. grn:g:ownerAddress:groupName Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } diff --git a/x/storage/keeper/abci.go b/x/storage/keeper/abci.go index 6ab311789..40cf51868 100644 --- a/x/storage/keeper/abci.go +++ b/x/storage/keeper/abci.go @@ -60,4 +60,13 @@ func EndBlocker(ctx sdk.Context, keeper Keeper) { // Permission GC keeper.GarbageCollectResourcesStalePolicy(ctx) + + // Payment Data Check + interval := int64(keeper.GetPaymentCheckInterval()) + if keeper.IsPaymentCheckEnabled() && interval > 0 && ctx.BlockHeight()%interval == 0 { + err = keeper.RunPaymentCheck(ctx) + if err != nil { + panic(err) + } + } } diff --git a/x/storage/keeper/keeper.go b/x/storage/keeper/keeper.go index 6fb53e245..199424d12 100644 --- a/x/storage/keeper/keeper.go +++ b/x/storage/keeper/keeper.go @@ -6,6 +6,7 @@ import ( "cosmossdk.io/errors" sdkmath "cosmossdk.io/math" + "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/store/prefix" @@ -46,9 +47,17 @@ type ( groupSeq sequence.Sequence[sdkmath.Uint] authority string + + // payment check config + cfg *paymentCheckConfig } ) +type paymentCheckConfig struct { + Enabled bool + Interval uint32 +} + func NewKeeper( cdc codec.BinaryCodec, storeKey storetypes.StoreKey, @@ -72,6 +81,7 @@ func NewKeeper( crossChainKeeper: crossChainKeeper, virtualGroupKeeper: virtualGroupKeeper, authority: authority, + cfg: &paymentCheckConfig{Enabled: false, Interval: 0}, } k.bucketSeq = sequence.NewSequence[sdkmath.Uint](types.BucketSequencePrefix) @@ -84,6 +94,14 @@ func (k Keeper) GetAuthority() string { return k.authority } +func (k Keeper) IsPaymentCheckEnabled() bool { + return k.cfg.Enabled +} + +func (k Keeper) GetPaymentCheckInterval() uint32 { + return k.cfg.Interval +} + func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } @@ -2112,6 +2130,12 @@ func (k Keeper) MigrateBucket(ctx sdk.Context, operator sdk.AccAddress, bucketNa return types.ErrInvalidBucketStatus.Wrapf("The bucket already been migrating") } + if ctx.IsUpgraded(upgradetypes.Veld) { + if bucketInfo.BucketStatus == types.BUCKET_STATUS_DISCONTINUED { + return types.ErrInvalidBucketStatus.Wrapf("The discontinued bucket cannot be migrated") + } + } + srcSP := k.MustGetPrimarySPForBucket(ctx, bucketInfo) dstSP, found := k.spKeeper.GetStorageProvider(ctx, dstPrimarySPID) @@ -2172,6 +2196,7 @@ func (k Keeper) MigrateBucket(ctx sdk.Context, operator sdk.AccAddress, bucketNa BucketName: bucketName, BucketId: bucketInfo.Id, DstPrimarySpId: dstSP.Id, + Status: bucketInfo.BucketStatus, }); err != nil { return err } @@ -2254,6 +2279,7 @@ func (k Keeper) CompleteMigrateBucket(ctx sdk.Context, operator sdk.AccAddress, BucketId: bucketInfo.Id, GlobalVirtualGroupFamilyId: gvgFamilyID, SrcPrimarySpId: srcGvgFamily.PrimarySpId, + Status: bucketInfo.BucketStatus, }); err != nil { return err } @@ -2300,6 +2326,7 @@ func (k Keeper) CancelBucketMigration(ctx sdk.Context, operator sdk.AccAddress, Operator: operator.String(), BucketName: bucketName, BucketId: bucketInfo.Id, + Status: bucketInfo.BucketStatus, }); err != nil { return err } @@ -2334,6 +2361,7 @@ func (k Keeper) RejectBucketMigration(ctx sdk.Context, operator sdk.AccAddress, Operator: operator.String(), BucketName: bucketName, BucketId: bucketInfo.Id, + Status: bucketInfo.BucketStatus, }); err != nil { return err } diff --git a/x/storage/keeper/payment_check.go b/x/storage/keeper/payment_check.go new file mode 100644 index 000000000..2f42eb052 --- /dev/null +++ b/x/storage/keeper/payment_check.go @@ -0,0 +1,299 @@ +package keeper + +import ( + sdkmath "cosmossdk.io/math" + "github.com/bnb-chain/greenfield/internal/sequence" + paymenttypes "github.com/bnb-chain/greenfield/x/payment/types" + "github.com/bnb-chain/greenfield/x/storage/types" + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/pkg/errors" +) + +// InitPaymentCheck initializes the payment check configuration. +func InitPaymentCheck(k Keeper, enabled bool, interval uint32) { + k.cfg.Enabled = enabled + k.cfg.Interval = interval +} + +// RunPaymentCheck checks the payment data of all buckets and objects. +// It will compare the lock balance, net flow rate of users and gvg families/gvgs/validator tax pool. +func (k Keeper) RunPaymentCheck(ctx sdk.Context) error { + ctx.Logger().Info("start checking payment data") + + type Detail struct { + address string + amount sdkmath.Int + } + + lockBalanceMap := make(map[string]sdkmath.Int) // payment address -> lock balance + lockBalanceDetailMap := make(map[string][]Detail) // payment address -> {bucket name, lock balance} + userFlowRateMap := make(map[string]sdkmath.Int) // payment address -> net flow rate + userFlowRateDetailMap := make(map[string][]Detail) // payment address -> {bucket name, net flow rate} + receiverFlowRateMap := make(map[string]sdkmath.Int) // gvg family/gvg/validator tax pool address -> net flow rate + receiverFlowRateDetailMap := make(map[string][]Detail) // gvg family/gvg/validator tax pool address -> {bucket name, net flow rate} + + store := ctx.KVStore(k.storeKey) + bucketStore := prefix.NewStore(store, types.BucketByIDPrefix) + bucketIt := bucketStore.Iterator(nil, nil) + defer bucketIt.Close() + + // cache all stream records to speed up + streamRecordMap := make(map[string]paymenttypes.StreamRecord) + allStreamRecords := k.paymentKeeper.GetAllStreamRecord(ctx) + for _, record := range allStreamRecords { + streamRecordMap[record.Account] = record + } + + var result error + +Exit: + for ; bucketIt.Valid(); bucketIt.Next() { + var bucket types.BucketInfo + k.cdc.MustUnmarshal(bucketIt.Value(), &bucket) + if bucket.Id.IsZero() { + continue + } + + // get net flow rate + internalBucketInfo, found := k.GetInternalBucketInfo(ctx, bucket.Id) + if !found { + result = errors.New("internal bucket info not found") + ctx.Logger().Error("internal bucket info not found", "bucket", bucket.BucketName) + continue Exit + } + userFlows, err := k.GetBucketReadStoreBill(ctx, &bucket, internalBucketInfo) + if err != nil { + result = errors.New("fail to get bucket read and store bill") + ctx.Logger().Error("fail to get bucket read and store bill", "bucket", bucket.BucketName, "error", err) + continue Exit + } + + rateLimited := false + paymentAddress := bucket.PaymentAddress + rateLimitStatus, found := k.getBucketFlowRateLimitStatus(ctx, bucket.BucketName) + if found { + rateLimited = rateLimitStatus.IsBucketLimited + paymentAddress = rateLimitStatus.PaymentAddress + } + + if len(userFlows.Flows) > 0 && !rateLimited { // if rate limited, there should not payment bills + expectedNetFlowRate := sdkmath.ZeroInt() + for _, flow := range userFlows.Flows { + expectedNetFlowRate = expectedNetFlowRate.Add(flow.Rate) + // gvg family/gvg/validator tax pool + _, ok := receiverFlowRateMap[flow.ToAddress] + if !ok { + receiverFlowRateMap[flow.ToAddress] = sdkmath.ZeroInt() + receiverFlowRateDetailMap[flow.ToAddress] = []Detail{} + } + receiverFlowRateMap[flow.ToAddress] = receiverFlowRateMap[flow.ToAddress].Add(flow.Rate) + receiverFlowRateDetailMap[flow.ToAddress] = append(receiverFlowRateDetailMap[flow.ToAddress], + Detail{bucket.BucketName, flow.Rate}) + } + + // user payment account + expectedNetFlowRate = expectedNetFlowRate.Neg() + _, ok := userFlowRateMap[paymentAddress] + if !ok { + userFlowRateMap[paymentAddress] = sdkmath.ZeroInt() + userFlowRateDetailMap[paymentAddress] = []Detail{} + } + userFlowRateMap[paymentAddress] = userFlowRateMap[paymentAddress].Add(expectedNetFlowRate) + userFlowRateDetailMap[paymentAddress] = append(userFlowRateDetailMap[paymentAddress], + Detail{bucket.BucketName, expectedNetFlowRate}) + } + + // get lock balance + objectPrefixStore := prefix.NewStore(store, types.GetObjectKeyOnlyBucketPrefix(bucket.BucketName)) + it := objectPrefixStore.Iterator(nil, nil) + defer it.Close() + + expectedLockBalance := sdkmath.ZeroInt() + for ; it.Valid(); it.Next() { + u256Seq := sequence.Sequence[sdkmath.Uint]{} + objectInfo, found := k.GetObjectInfoById(ctx, u256Seq.DecodeSequence(it.Value())) + if found && (objectInfo.ObjectStatus == types.OBJECT_STATUS_CREATED || objectInfo.IsUpdating) { + priceTime := objectInfo.GetLatestUpdatedTime() + payloadSize := objectInfo.PayloadSize + if objectInfo.IsUpdating { + shadowObject, found := k.GetShadowObjectInfo(ctx, bucket.BucketName, objectInfo.ObjectName) + if !found { + result = errors.New("shadow object not found") + ctx.Logger().Error("shadow object not found", "bucket", bucket.BucketName, "object", objectInfo.ObjectName) + continue Exit + } + priceTime = shadowObject.UpdatedAt + payloadSize = shadowObject.PayloadSize + } + + lockAmount, _, err := k.GetObjectLockFee(ctx, priceTime, payloadSize) + if err != nil { + result = errors.New("get object lock fee failed") + ctx.Logger().Error("get object lock fee failed", "bucket", bucket.BucketName, "object", objectInfo.ObjectName, "error", err) + continue Exit + } + expectedLockBalance = expectedLockBalance.Add(lockAmount) + } + } + + if expectedLockBalance.IsPositive() { + _, ok := lockBalanceMap[bucket.PaymentAddress] + if !ok { + lockBalanceMap[bucket.PaymentAddress] = sdkmath.ZeroInt() + lockBalanceDetailMap[bucket.PaymentAddress] = []Detail{} + } + lockBalanceMap[bucket.PaymentAddress] = lockBalanceMap[bucket.PaymentAddress].Add(expectedLockBalance) + lockBalanceDetailMap[bucket.PaymentAddress] = append(lockBalanceDetailMap[bucket.PaymentAddress], + Detail{bucket.BucketName, expectedLockBalance}) + } + } + + if result != nil { // if already has error, do not check the following + ctx.Logger().Info("stop checking payment data due to error") + return result + } + + // compare lock balance: expected -> actual side + for address, expectedLockBalance := range lockBalanceMap { + streamRecord, found := streamRecordMap[address] + if !found { + result = errors.New("comparing lock balance - stream record not found") + ctx.Logger().Error("comparing lock balance - stream record not found", "address", address) + continue // to print all errors if there are any + } + + actualLockBalance := streamRecord.LockBalance + if !expectedLockBalance.Equal(actualLockBalance) { + if !k.isKnownLockBalanceIssue(ctx, address) { + result = errors.New("lock balance not equal") + } + ctx.Logger().Error("lock balance not equal", "address", address, "expected", expectedLockBalance, "actual", actualLockBalance) + details := lockBalanceDetailMap[address] + for _, detail := range details { + ctx.Logger().Error("lock balance detail", "bucket", detail.address, "amount", detail.amount) + } + } + } + + // compare user net flow rate: expected -> actual side + frozenReceiverFlowRateMap := make(map[string]sdkmath.Int) + for address, expectedNetFlowRate := range userFlowRateMap { + streamRecord, found := streamRecordMap[address] + if !found { + result = errors.New("comparing user net flow rate - stream record not found") + ctx.Logger().Error("comparing user net flow rate - stream record not found", "address", address) + continue // to print all errors if there are any + } + + actualNetFlowRate := streamRecord.NetflowRate + if streamRecord.Status == paymenttypes.STREAM_ACCOUNT_STATUS_FROZEN { + actualNetFlowRate = actualNetFlowRate.Add(streamRecord.FrozenNetflowRate) + + // be noted, payment outflows can be in different status even if the stream account is frozen, + // for we are force settling a stream account in multiple blocks + outFlows := k.paymentKeeper.GetOutFlows(ctx, sdk.MustAccAddressFromHex(address)) + for _, outFlow := range outFlows { + if outFlow.Status == paymenttypes.OUT_FLOW_STATUS_FROZEN { + _, ok := frozenReceiverFlowRateMap[outFlow.ToAddress] + if !ok { + frozenReceiverFlowRateMap[outFlow.ToAddress] = sdkmath.ZeroInt() + } + frozenReceiverFlowRateMap[outFlow.ToAddress] = frozenReceiverFlowRateMap[outFlow.ToAddress].Add(outFlow.Rate) + } + } + } + + if actualNetFlowRate.IsNegative() && streamRecord.OutFlowCount <= 0 { + result = errors.New("user net flow rate invalid status or out flow count") + ctx.Logger().Error("user net flow rate invalid flow rate or out flow count", + "address", address, "status", actualNetFlowRate, "outflow count", streamRecord.OutFlowCount) + } + + if !expectedNetFlowRate.Equal(actualNetFlowRate) { + result = errors.New("user net flow rate not equal") + ctx.Logger().Error("user net flow rate not equal", "address", address, "expected", expectedNetFlowRate, "actual", actualNetFlowRate) + details := userFlowRateDetailMap[address] + for _, detail := range details { + ctx.Logger().Error("user net flow rate detail", "bucket", detail.address, "amount", detail.amount) + } + } + } + + // compare receiver net flow rate: expected -> actual side + for address, expectedNetFlowRate := range receiverFlowRateMap { + streamRecord, found := streamRecordMap[address] + if !found { + result = errors.New("comparing receiver net flow rate - stream record not found") + ctx.Logger().Error("comparing receiver net flow rate - stream record not found", "address", address) + continue // to print all errors if there are any + } + + if streamRecord.Status == paymenttypes.STREAM_ACCOUNT_STATUS_FROZEN || streamRecord.OutFlowCount > 0 { + result = errors.New("receiver net flow rate invalid status or out flow count") + ctx.Logger().Error("receiver net flow rate invalid status or out flow count", + "address", address, "status", streamRecord.Status, "outflow count", streamRecord.OutFlowCount) + } + + actualNetFlowRate := streamRecord.NetflowRate + frozenRate, ok := frozenReceiverFlowRateMap[address] + if ok { + actualNetFlowRate = actualNetFlowRate.Add(frozenRate) + } + + if !expectedNetFlowRate.Equal(actualNetFlowRate) { + result = errors.New("receiver net flow rate not equal") + ctx.Logger().Error("receiver net flow rate not equal", "address", address, "expected", expectedNetFlowRate, "actual", actualNetFlowRate) + details := receiverFlowRateDetailMap[address] + for _, detail := range details { + ctx.Logger().Error("receiver net flow rate detail", "bucket", detail.address, "amount", detail.amount) + } + } + } + + // compare lock balance: actual -> expected side + // compare user net flow rate: actual -> expected side + // compare receiver net flow rate: actual -> expected side + for _, streamRecord := range streamRecordMap { + if streamRecord.LockBalance.IsPositive() { + _, found := lockBalanceMap[streamRecord.Account] + if !found { + if !k.isKnownLockBalanceIssue(ctx, streamRecord.Account) { + result = errors.New("the stream record has lock balance which is not expected") + } + ctx.Logger().Error("the stream record has lock balance which is not expected", "address", streamRecord.Account) + } + } + + if streamRecord.NetflowRate.IsNegative() || streamRecord.FrozenNetflowRate.IsNegative() { + _, found := userFlowRateMap[streamRecord.Account] + if !found { + result = errors.New("the stream record has negative flow rate which is not expected") + ctx.Logger().Error("the stream record has negative flow rate which is not expected", "address", streamRecord.Account) + } + } + + if streamRecord.NetflowRate.IsPositive() { + _, found := receiverFlowRateMap[streamRecord.Account] + if !found { + result = errors.New("the stream record has positive flow rate which is not expected") + ctx.Logger().Error("the stream record has positive flow rate which is not expected", "address", streamRecord.Account) + } + } + } + + ctx.Logger().Info("finish checking payment data") + return result +} + +// isKnownLockBalanceIssue checks if the address is the known addresses of the lock balance issue on testnet. +func (k Keeper) isKnownLockBalanceIssue(ctx sdk.Context, address string) bool { + if ctx.ChainID() != upgradetypes.TestnetChainID { + return false + } + if address == "0x8E15D16d6432166372Fb1e6f4A41840D71edd41F" || address == "0x9b825492966508C587536bA71425d61E822545C3" { + return true + } + return false +} diff --git a/x/storage/types/events.pb.go b/x/storage/types/events.pb.go index eaa5bd872..a3ebc7c4e 100644 --- a/x/storage/types/events.pb.go +++ b/x/storage/types/events.pb.go @@ -2096,6 +2096,8 @@ type EventMigrationBucket struct { BucketId Uint `protobuf:"bytes,3,opt,name=bucket_id,json=bucketId,proto3,customtype=Uint" json:"bucket_id"` // The id of the destination primary sp DstPrimarySpId uint32 `protobuf:"varint,4,opt,name=dst_primary_sp_id,json=dstPrimarySpId,proto3" json:"dst_primary_sp_id,omitempty"` + // status define the status of the bucket. + Status BucketStatus `protobuf:"varint,5,opt,name=status,proto3,enum=greenfield.storage.BucketStatus" json:"status,omitempty"` } func (m *EventMigrationBucket) Reset() { *m = EventMigrationBucket{} } @@ -2152,6 +2154,13 @@ func (m *EventMigrationBucket) GetDstPrimarySpId() uint32 { return 0 } +func (m *EventMigrationBucket) GetStatus() BucketStatus { + if m != nil { + return m.Status + } + return BUCKET_STATUS_CREATED +} + type EventCancelMigrationBucket struct { // The address of the operator that canceled the bucket migration, // usually the owner of the bucket or another account which has permission to operate @@ -2160,6 +2169,8 @@ type EventCancelMigrationBucket struct { BucketName string `protobuf:"bytes,2,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` // bucket_id define an u256 id for bucket BucketId Uint `protobuf:"bytes,3,opt,name=bucket_id,json=bucketId,proto3,customtype=Uint" json:"bucket_id"` + // status define the status of the bucket. + Status BucketStatus `protobuf:"varint,4,opt,name=status,proto3,enum=greenfield.storage.BucketStatus" json:"status,omitempty"` } func (m *EventCancelMigrationBucket) Reset() { *m = EventCancelMigrationBucket{} } @@ -2209,6 +2220,13 @@ func (m *EventCancelMigrationBucket) GetBucketName() string { return "" } +func (m *EventCancelMigrationBucket) GetStatus() BucketStatus { + if m != nil { + return m.Status + } + return BUCKET_STATUS_CREATED +} + type EventRejectMigrateBucket struct { // The address of the operator that reject the bucket migration, must be the dest SP Operator string `protobuf:"bytes,1,opt,name=operator,proto3" json:"operator,omitempty"` @@ -2216,6 +2234,8 @@ type EventRejectMigrateBucket struct { BucketName string `protobuf:"bytes,2,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` // bucket_id define an u256 id for bucket BucketId Uint `protobuf:"bytes,3,opt,name=bucket_id,json=bucketId,proto3,customtype=Uint" json:"bucket_id"` + // status define the status of the bucket. + Status BucketStatus `protobuf:"varint,4,opt,name=status,proto3,enum=greenfield.storage.BucketStatus" json:"status,omitempty"` } func (m *EventRejectMigrateBucket) Reset() { *m = EventRejectMigrateBucket{} } @@ -2265,6 +2285,13 @@ func (m *EventRejectMigrateBucket) GetBucketName() string { return "" } +func (m *EventRejectMigrateBucket) GetStatus() BucketStatus { + if m != nil { + return m.Status + } + return BUCKET_STATUS_CREATED +} + type EventCompleteMigrationBucket struct { // The address of the operator that initiated the bucket migration, // usually the owner of the bucket or another account which has permission to operate @@ -2277,6 +2304,8 @@ type EventCompleteMigrationBucket struct { GlobalVirtualGroupFamilyId uint32 `protobuf:"varint,4,opt,name=global_virtual_group_family_id,json=globalVirtualGroupFamilyId,proto3" json:"global_virtual_group_family_id,omitempty"` // The src_primary_sp_id defines the primary sp id of the bucket before migrate. SrcPrimarySpId uint32 `protobuf:"varint,5,opt,name=src_primary_sp_id,json=srcPrimarySpId,proto3" json:"src_primary_sp_id,omitempty"` + // status define the status of the bucket. + Status BucketStatus `protobuf:"varint,6,opt,name=status,proto3,enum=greenfield.storage.BucketStatus" json:"status,omitempty"` } func (m *EventCompleteMigrationBucket) Reset() { *m = EventCompleteMigrationBucket{} } @@ -2340,6 +2369,13 @@ func (m *EventCompleteMigrationBucket) GetSrcPrimarySpId() uint32 { return 0 } +func (m *EventCompleteMigrationBucket) GetStatus() BucketStatus { + if m != nil { + return m.Status + } + return BUCKET_STATUS_CREATED +} + type EventSetTag struct { // resource defines a greenfield standard resource name that can be generated by GRN structure Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` @@ -2907,137 +2943,139 @@ func init() { func init() { proto.RegisterFile("greenfield/storage/events.proto", fileDescriptor_946dcba4f763ddc4) } var fileDescriptor_946dcba4f763ddc4 = []byte{ - // 2079 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5a, 0xcd, 0x8f, 0x23, 0x47, - 0xd9, 0xdf, 0xf6, 0xd7, 0xd8, 0xe5, 0xb1, 0xbd, 0xd3, 0xef, 0xbc, 0x1b, 0x33, 0x9b, 0xf5, 0x38, - 0x8d, 0x58, 0x26, 0x11, 0xeb, 0x41, 0x9b, 0x80, 0x56, 0x02, 0x69, 0x35, 0x1f, 0x09, 0xb2, 0xd8, - 0x64, 0x87, 0xf6, 0x24, 0x07, 0x2e, 0xad, 0x72, 0x77, 0xb9, 0xb7, 0xd9, 0x76, 0x57, 0xd3, 0x55, - 0x9e, 0x59, 0xe7, 0x1f, 0xe0, 0x84, 0x14, 0x09, 0x21, 0x01, 0x87, 0x5c, 0x41, 0x42, 0x48, 0x1c, - 0x72, 0x85, 0xf3, 0x1e, 0x93, 0xe5, 0x02, 0x41, 0x0a, 0x68, 0xf7, 0x02, 0x48, 0x08, 0xce, 0x9c, - 0x50, 0x7d, 0x74, 0xbb, 0xdb, 0xdd, 0xb3, 0x9e, 0xf6, 0x64, 0x32, 0xb3, 0x9c, 0x66, 0xfa, 0xf1, - 0x53, 0xd5, 0xcf, 0xc7, 0xef, 0xf9, 0xa8, 0xa7, 0x1a, 0x6c, 0xda, 0x01, 0x42, 0xde, 0xc8, 0x41, - 0xae, 0xb5, 0x4d, 0x28, 0x0e, 0xa0, 0x8d, 0xb6, 0xd1, 0x11, 0xf2, 0x28, 0xe9, 0xf9, 0x01, 0xa6, - 0x58, 0x55, 0x67, 0x0c, 0x3d, 0xc9, 0xb0, 0xf1, 0x25, 0x13, 0x93, 0x31, 0x26, 0x06, 0xe7, 0xd8, - 0x16, 0x0f, 0x82, 0x7d, 0x63, 0xdd, 0xc6, 0x36, 0x16, 0x74, 0xf6, 0x9f, 0xa4, 0x6e, 0xda, 0x18, - 0xdb, 0x2e, 0xda, 0xe6, 0x4f, 0xc3, 0xc9, 0x68, 0x9b, 0x3a, 0x63, 0x44, 0x28, 0x1c, 0xfb, 0x11, - 0xc3, 0x4c, 0x8c, 0x00, 0x11, 0x3c, 0x09, 0x4c, 0xb4, 0x4d, 0xa7, 0x3e, 0x22, 0x19, 0x0c, 0xa1, - 0x9c, 0x26, 0x1e, 0x8f, 0xb1, 0x27, 0x19, 0x3a, 0x19, 0x0c, 0xb1, 0x0d, 0xb4, 0x3f, 0x94, 0xc0, - 0xda, 0x9b, 0x4c, 0xb1, 0xbd, 0x00, 0x41, 0x8a, 0x76, 0x27, 0xe6, 0x43, 0x44, 0xd5, 0x1e, 0x28, - 0xe3, 0x63, 0x0f, 0x05, 0x6d, 0xa5, 0xab, 0x6c, 0xd5, 0x76, 0xdb, 0x4f, 0x3e, 0xba, 0xb5, 0x2e, - 0xf5, 0xd9, 0xb1, 0xac, 0x00, 0x11, 0x32, 0xa0, 0x81, 0xe3, 0xd9, 0xba, 0x60, 0x53, 0x37, 0x41, - 0x7d, 0xc8, 0x57, 0x1a, 0x1e, 0x1c, 0xa3, 0x76, 0x81, 0xad, 0xd2, 0x81, 0x20, 0xbd, 0x03, 0xc7, - 0x48, 0xdd, 0x05, 0xe0, 0xc8, 0x21, 0xce, 0xd0, 0x71, 0x1d, 0x3a, 0x6d, 0x17, 0xbb, 0xca, 0x56, - 0xf3, 0xb6, 0xd6, 0x4b, 0xdb, 0xb0, 0xf7, 0x5e, 0xc4, 0x75, 0x38, 0xf5, 0x91, 0x1e, 0x5b, 0xa5, - 0x5e, 0x07, 0x35, 0x93, 0x0b, 0x69, 0x40, 0xda, 0x2e, 0x75, 0x95, 0xad, 0xa2, 0x5e, 0x15, 0x84, - 0x1d, 0xaa, 0xde, 0x01, 0x35, 0x29, 0x81, 0x63, 0xb5, 0xcb, 0x5c, 0xea, 0xeb, 0x8f, 0x3f, 0xdb, - 0xbc, 0xf2, 0xe9, 0x67, 0x9b, 0xa5, 0x77, 0x1d, 0x8f, 0x3e, 0xf9, 0xe8, 0x56, 0x5d, 0x6a, 0xc0, - 0x1e, 0xf5, 0xaa, 0xe0, 0xee, 0x5b, 0xea, 0x5d, 0x50, 0x17, 0x86, 0x35, 0x98, 0x5d, 0xda, 0x15, - 0x2e, 0x5b, 0x27, 0x4b, 0xb6, 0x01, 0x67, 0x13, 0x72, 0x91, 0xe8, 0x7f, 0xf5, 0x6b, 0x40, 0x35, - 0x1f, 0xc0, 0xc0, 0x46, 0x96, 0x11, 0x20, 0x68, 0x19, 0x3f, 0x9c, 0x60, 0x0a, 0xdb, 0x2b, 0x5d, - 0x65, 0xab, 0xa4, 0x5f, 0x95, 0xbf, 0xe8, 0x08, 0x5a, 0xdf, 0x63, 0x74, 0x75, 0x07, 0xb4, 0x7c, - 0x38, 0x1d, 0x23, 0x8f, 0x1a, 0x50, 0x98, 0xb2, 0x5d, 0x5d, 0x60, 0xe4, 0xa6, 0x5c, 0x20, 0xa9, - 0xaa, 0x06, 0x1a, 0x7e, 0xe0, 0x8c, 0x61, 0x30, 0x35, 0x88, 0xcf, 0xf4, 0xad, 0x75, 0x95, 0xad, - 0x86, 0x5e, 0x97, 0xc4, 0x81, 0xdf, 0xb7, 0xd4, 0x5d, 0xd0, 0xb1, 0x5d, 0x3c, 0x84, 0xae, 0x71, - 0xe4, 0x04, 0x74, 0x02, 0x5d, 0xc3, 0x0e, 0xf0, 0xc4, 0x37, 0x46, 0x70, 0xec, 0xb8, 0x53, 0xb6, - 0x08, 0xf0, 0x45, 0x1b, 0x82, 0xeb, 0x3d, 0xc1, 0xf4, 0x1d, 0xc6, 0xf3, 0x16, 0x67, 0xe9, 0x5b, - 0xea, 0x1d, 0x50, 0x21, 0x14, 0xd2, 0x09, 0x69, 0xd7, 0xb9, 0x51, 0xba, 0x59, 0x46, 0x11, 0x88, - 0x19, 0x70, 0x3e, 0x5d, 0xf2, 0x6b, 0x3f, 0x2b, 0x48, 0x54, 0xed, 0x23, 0x17, 0x45, 0xa8, 0x7a, - 0x03, 0x54, 0xb1, 0x8f, 0x02, 0x48, 0xf1, 0x62, 0x60, 0x45, 0x9c, 0x33, 0x2c, 0x16, 0x96, 0xc2, - 0x62, 0x31, 0x85, 0xc5, 0x04, 0x54, 0x4a, 0x79, 0xa0, 0xb2, 0xd8, 0xa8, 0xe5, 0x45, 0x46, 0xd5, - 0x7e, 0x54, 0x04, 0xff, 0xcf, 0x4d, 0xf3, 0xae, 0x6f, 0x45, 0x01, 0xd7, 0xf7, 0x46, 0x78, 0x49, - 0xf3, 0x2c, 0x0c, 0xbd, 0x84, 0xba, 0xc5, 0x3c, 0xea, 0x66, 0x03, 0xbb, 0x74, 0x02, 0xb0, 0xbf, - 0x9a, 0x06, 0x36, 0x8f, 0xc3, 0x14, 0x7c, 0x93, 0xb9, 0xa0, 0xb2, 0x54, 0x2e, 0x58, 0xec, 0x89, - 0x95, 0x85, 0x9e, 0xf8, 0x95, 0x02, 0xae, 0x09, 0x90, 0x3a, 0xc4, 0xc4, 0x1e, 0x75, 0xbc, 0x49, - 0x88, 0xd4, 0x84, 0xcd, 0x94, 0x3c, 0x36, 0x5b, 0xe8, 0x8e, 0x6b, 0xa0, 0x12, 0x20, 0x48, 0xb0, - 0x27, 0x91, 0x29, 0x9f, 0x58, 0x76, 0xb3, 0x78, 0xb0, 0xc4, 0xb2, 0x9b, 0x20, 0xec, 0x50, 0xed, - 0x27, 0x95, 0x44, 0x96, 0xbe, 0x3f, 0xfc, 0x01, 0x32, 0xa9, 0x7a, 0x1b, 0xac, 0xf0, 0xfc, 0x77, - 0x0a, 0xbc, 0x84, 0x8c, 0x9f, 0x7f, 0x34, 0x6d, 0x82, 0x3a, 0xe6, 0xe2, 0x08, 0x86, 0x92, 0x60, - 0x10, 0xa4, 0x34, 0xfe, 0x2a, 0x79, 0x6c, 0x79, 0x07, 0xd4, 0xe4, 0xd6, 0xd2, 0x9f, 0x8b, 0x56, - 0x0a, 0xee, 0xbe, 0x95, 0xce, 0x90, 0xd5, 0x74, 0x86, 0x7c, 0x05, 0xac, 0xfa, 0x70, 0xea, 0x62, - 0x68, 0x19, 0xc4, 0x79, 0x1f, 0xf1, 0x24, 0x5a, 0xd2, 0xeb, 0x92, 0x36, 0x70, 0xde, 0x9f, 0xaf, - 0x5a, 0x60, 0x29, 0xa4, 0xbe, 0x02, 0x56, 0x19, 0xb8, 0x58, 0x58, 0xf0, 0xfa, 0x52, 0xe7, 0x06, - 0xaa, 0x4b, 0x1a, 0x2f, 0x20, 0x89, 0xc2, 0xb6, 0x9a, 0x2a, 0x6c, 0x61, 0x12, 0x6e, 0x9c, 0x9c, - 0x84, 0x05, 0x20, 0x92, 0x49, 0x58, 0xfd, 0x2e, 0x68, 0x05, 0xc8, 0x9a, 0x78, 0x16, 0xf4, 0xcc, - 0xa9, 0x78, 0x79, 0xf3, 0x64, 0x15, 0xf4, 0x88, 0x95, 0xab, 0xd0, 0x0c, 0x12, 0xcf, 0xf3, 0x55, - 0xb2, 0x95, 0xbb, 0x4a, 0xbe, 0x0c, 0x6a, 0xe6, 0x03, 0x64, 0x3e, 0x24, 0x93, 0x31, 0x69, 0x5f, - 0xed, 0x16, 0xb7, 0x56, 0xf5, 0x19, 0x41, 0x7d, 0x1d, 0x5c, 0x73, 0xb1, 0x99, 0x0a, 0x67, 0xc7, - 0x6a, 0xaf, 0x71, 0xcf, 0xfd, 0x1f, 0xff, 0x35, 0x1e, 0xc6, 0x7d, 0x4b, 0xfb, 0x97, 0x02, 0x5e, - 0x12, 0x51, 0x01, 0x3d, 0x13, 0xb9, 0x89, 0xd8, 0x38, 0xa7, 0x64, 0x3a, 0x87, 0xf6, 0x62, 0x0a, - 0xed, 0x29, 0xe4, 0x95, 0xd2, 0xc8, 0x4b, 0xe0, 0xba, 0x92, 0x03, 0xd7, 0xac, 0x78, 0xb4, 0xb8, - 0xc6, 0x03, 0x04, 0xdd, 0x0b, 0xd6, 0x34, 0xa1, 0x45, 0x39, 0x4f, 0x74, 0xce, 0x20, 0x5d, 0xc9, - 0x09, 0xe9, 0x6f, 0x80, 0x97, 0x32, 0xd3, 0x7e, 0x94, 0xef, 0xd7, 0xd3, 0xf9, 0xbe, 0x6f, 0x3d, - 0x07, 0x5d, 0xd5, 0x13, 0xd1, 0x95, 0x04, 0x6c, 0x6d, 0x0e, 0xb0, 0xda, 0x87, 0xa1, 0x27, 0xf6, - 0xb0, 0x3f, 0x3d, 0x93, 0x27, 0x6e, 0x82, 0x16, 0x09, 0x4c, 0x23, 0xed, 0x8d, 0x06, 0x09, 0xcc, - 0xdd, 0x99, 0x43, 0x24, 0x5f, 0xda, 0x29, 0x8c, 0xef, 0xfe, 0xcc, 0x2f, 0x37, 0x41, 0xcb, 0x22, - 0x34, 0xb1, 0x9f, 0x48, 0xca, 0x0d, 0x8b, 0xd0, 0xe4, 0x7e, 0x8c, 0x2f, 0xbe, 0x5f, 0x39, 0xe2, - 0x8b, 0xed, 0x77, 0x17, 0x34, 0x62, 0xef, 0x3d, 0x1d, 0x62, 0xeb, 0x91, 0x48, 0xbc, 0xc1, 0x6e, - 0xc4, 0x5e, 0x74, 0xba, 0x54, 0x5e, 0x8f, 0x64, 0x58, 0xd2, 0x7d, 0xda, 0x7f, 0x94, 0x44, 0x0b, - 0x7a, 0x99, 0x82, 0xa5, 0x94, 0x27, 0x58, 0x4e, 0x56, 0xbe, 0x7c, 0xb2, 0xf2, 0x7f, 0x53, 0x64, - 0x93, 0xa9, 0x23, 0x1e, 0x45, 0x97, 0x2c, 0x5b, 0xe4, 0x32, 0xc0, 0x0d, 0x00, 0x46, 0x38, 0x30, - 0x26, 0xbc, 0x5d, 0xe6, 0x4a, 0x57, 0xf5, 0xda, 0x08, 0x07, 0xa2, 0x7f, 0xce, 0xec, 0xe2, 0xa4, - 0xae, 0x73, 0x52, 0x2b, 0x59, 0xad, 0xf1, 0x4c, 0xa8, 0x42, 0x1e, 0xa1, 0x96, 0xea, 0xe2, 0x7e, - 0x5c, 0x48, 0xb4, 0xfe, 0x12, 0xdf, 0xe7, 0xd8, 0xfa, 0x9f, 0xa3, 0x57, 0x92, 0xad, 0x51, 0x79, - 0x99, 0xd6, 0x48, 0xfb, 0xb7, 0x02, 0xae, 0xc6, 0xba, 0x5a, 0x0e, 0xde, 0xdc, 0xa3, 0x87, 0x1b, - 0x00, 0x88, 0x88, 0x88, 0xd9, 0xa0, 0xc6, 0x29, 0x5c, 0xc3, 0x6f, 0x82, 0x6a, 0x14, 0x30, 0xa7, - 0x38, 0xfc, 0xac, 0xd8, 0x32, 0xfb, 0xcf, 0xf5, 0x3b, 0xa5, 0xdc, 0xfd, 0xce, 0x3a, 0x28, 0xa3, - 0x47, 0x34, 0x80, 0x32, 0xa9, 0x8a, 0x07, 0xed, 0xe7, 0xa1, 0xca, 0x22, 0x2b, 0xcd, 0xa9, 0x5c, - 0x58, 0x46, 0xe5, 0xe2, 0xf3, 0x54, 0x2e, 0x9d, 0x5e, 0x65, 0xed, 0x4f, 0x8a, 0x2c, 0x69, 0xf7, - 0x10, 0x3c, 0x92, 0xa2, 0xdd, 0x05, 0xcd, 0x31, 0x1a, 0x0f, 0x51, 0x10, 0x9d, 0xe9, 0x16, 0xb9, - 0xa5, 0x21, 0xf8, 0xc3, 0xc3, 0xde, 0x25, 0xd1, 0xed, 0x9f, 0x05, 0x99, 0x25, 0x44, 0xe8, 0x71, - 0xe5, 0xde, 0xe6, 0x82, 0x7e, 0x41, 0x53, 0x89, 0xf3, 0xd1, 0x4b, 0x3d, 0x08, 0xfd, 0x43, 0x0c, - 0x8a, 0x99, 0x8f, 0xda, 0xe5, 0x6e, 0x71, 0xab, 0x7e, 0xfb, 0xb5, 0x2c, 0xa4, 0x72, 0x03, 0xc4, - 0x54, 0xdf, 0x47, 0x14, 0x3a, 0xae, 0xbe, 0x2a, 0x77, 0x38, 0xc4, 0x3b, 0x96, 0xa5, 0xee, 0x83, - 0xb5, 0xd8, 0x8e, 0x22, 0x77, 0xb5, 0x2b, 0xdd, 0xe2, 0x73, 0x95, 0x6c, 0x45, 0x5b, 0x08, 0x5c, - 0x6b, 0x7f, 0x2e, 0x44, 0x05, 0xc8, 0x43, 0xc7, 0xff, 0x33, 0xe6, 0x9e, 0xcb, 0x0a, 0xe5, 0xdc, - 0x59, 0x61, 0x1f, 0xac, 0x48, 0x53, 0x71, 0x9b, 0xe6, 0x73, 0x54, 0xb8, 0x54, 0xfb, 0x69, 0x58, - 0xf3, 0x52, 0x3c, 0xea, 0xd7, 0x41, 0x45, 0x70, 0x2d, 0x34, 0xae, 0xe4, 0x53, 0xfb, 0xa0, 0x85, - 0x1e, 0xf9, 0x4e, 0x00, 0xa9, 0x83, 0x3d, 0x83, 0x3a, 0x32, 0x8b, 0xd6, 0x6f, 0x6f, 0xf4, 0xc4, - 0x78, 0xba, 0x17, 0x8e, 0xa7, 0x7b, 0x87, 0xe1, 0x78, 0x7a, 0xb7, 0xf4, 0xc1, 0x5f, 0x36, 0x15, - 0xbd, 0x39, 0x5b, 0xc8, 0x7e, 0xd2, 0xfe, 0xa1, 0x24, 0x0a, 0x1c, 0x97, 0xee, 0x4d, 0x96, 0xf7, - 0x5e, 0x6c, 0xaf, 0x67, 0xa7, 0xf2, 0xc7, 0x61, 0x83, 0xf9, 0xb6, 0x13, 0x04, 0x38, 0x38, 0xd3, - 0x8c, 0x33, 0xdf, 0x10, 0x2f, 0xd7, 0xcc, 0x52, 0x03, 0x0d, 0x0b, 0x11, 0x6a, 0x98, 0x0f, 0xa0, - 0xe3, 0xcd, 0xda, 0xc6, 0x3a, 0x23, 0xee, 0x31, 0x5a, 0xdf, 0xd2, 0x7e, 0x1b, 0x1e, 0xa4, 0xe3, - 0xaa, 0xe8, 0x88, 0x4c, 0x5c, 0xca, 0x3a, 0x1d, 0x79, 0x58, 0x53, 0xf8, 0xc2, 0xf0, 0x28, 0x76, - 0xc1, 0x22, 0xff, 0x3d, 0x69, 0xfd, 0x17, 0xb6, 0xbb, 0x3d, 0x8d, 0xae, 0x9f, 0x24, 0xdd, 0x23, - 0x74, 0x3d, 0xab, 0x7b, 0x2e, 0x58, 0xa7, 0xdf, 0x85, 0x8d, 0x90, 0xd0, 0xe9, 0x52, 0xf5, 0x7e, - 0x29, 0xf9, 0x4b, 0x69, 0xf9, 0x7f, 0x1d, 0xa6, 0xe0, 0x98, 0xfc, 0x0b, 0x5c, 0x72, 0x81, 0xd2, - 0x1e, 0x49, 0x00, 0x0d, 0x28, 0x74, 0xd1, 0x01, 0x76, 0x1d, 0x73, 0xba, 0xe7, 0x22, 0xe8, 0x4d, - 0x7c, 0x75, 0x03, 0x54, 0x87, 0x2e, 0x36, 0x1f, 0xbe, 0x33, 0x19, 0x73, 0x79, 0x8b, 0x7a, 0xf4, - 0xcc, 0xca, 0x9d, 0x3c, 0xcd, 0x38, 0xde, 0x08, 0xcb, 0xb2, 0x90, 0x59, 0xee, 0x44, 0xd9, 0x67, - 0x67, 0x19, 0x1d, 0x58, 0xd1, 0xff, 0xda, 0x13, 0x05, 0xac, 0x4b, 0x2b, 0xd9, 0xa2, 0x4e, 0x7c, - 0x81, 0x69, 0x32, 0xd7, 0x5d, 0xc7, 0xab, 0x60, 0xcd, 0x22, 0xd4, 0xc8, 0x9a, 0xdd, 0x35, 0x2d, - 0x42, 0x0f, 0x66, 0xe3, 0x3b, 0xed, 0x37, 0x0a, 0xd8, 0x88, 0x8d, 0x1d, 0x2f, 0xbb, 0x6a, 0x0c, - 0xaa, 0xed, 0xd8, 0x30, 0x40, 0xc8, 0x8b, 0x2e, 0xab, 0xb4, 0x1f, 0x16, 0xc0, 0xcb, 0x72, 0xb0, - 0x36, 0xf6, 0x19, 0x90, 0x2e, 0x3d, 0x74, 0x16, 0xdf, 0x45, 0x95, 0x16, 0x5e, 0xb5, 0xbe, 0x0a, - 0xd6, 0x48, 0x60, 0xce, 0xc1, 0x4f, 0xa4, 0xcd, 0x26, 0x09, 0xcc, 0x38, 0xfc, 0x0c, 0x50, 0x97, - 0x23, 0x60, 0x7a, 0x08, 0x6d, 0x16, 0xbf, 0xe1, 0x97, 0x01, 0x72, 0xc2, 0x11, 0x3d, 0xab, 0x6f, - 0x80, 0x12, 0x85, 0x36, 0x91, 0x81, 0xdb, 0xcd, 0x1e, 0xfb, 0xcb, 0xee, 0x14, 0xda, 0x44, 0xe7, - 0xdc, 0xda, 0x2f, 0x0b, 0x12, 0x2f, 0xf1, 0x31, 0xc5, 0x9e, 0xb8, 0xaf, 0x58, 0xd2, 0xfa, 0xcb, - 0x0f, 0x5a, 0xce, 0x7e, 0xff, 0x34, 0x7f, 0xcf, 0x53, 0x4e, 0xdf, 0xf3, 0x24, 0x46, 0xbd, 0x95, - 0xf9, 0xbb, 0x89, 0x36, 0x58, 0x39, 0x42, 0x01, 0x71, 0xb0, 0xc7, 0x27, 0x97, 0x45, 0x3d, 0x7c, - 0xd4, 0x3e, 0x29, 0x82, 0xcd, 0x93, 0x2c, 0x35, 0x98, 0x98, 0x26, 0x3b, 0x00, 0xbf, 0x90, 0x06, - 0x4b, 0xdc, 0x58, 0x95, 0xd3, 0x37, 0x56, 0xaf, 0x81, 0x35, 0x3f, 0x40, 0x47, 0x46, 0xc2, 0xb0, - 0x15, 0x6e, 0xd8, 0x16, 0xfb, 0xe1, 0x20, 0x66, 0xdc, 0x2d, 0x70, 0xd5, 0x43, 0xc7, 0x49, 0x56, - 0xf1, 0x71, 0x44, 0xd3, 0x43, 0xc7, 0x71, 0xce, 0xaf, 0x80, 0x26, 0xdf, 0x75, 0xe6, 0x8b, 0x2a, - 0xf7, 0x45, 0x83, 0x51, 0xf7, 0x22, 0x7f, 0x7c, 0x19, 0x34, 0xd8, 0x86, 0xf3, 0xc3, 0xf9, 0x55, - 0x0f, 0x1d, 0xef, 0x65, 0x39, 0x0d, 0x24, 0x9c, 0xc6, 0xca, 0xb0, 0x98, 0x25, 0x5a, 0x06, 0xa4, - 0xfc, 0x3a, 0xae, 0xa8, 0xd7, 0x24, 0x65, 0x87, 0xb2, 0x92, 0xd5, 0x89, 0x65, 0xf7, 0xcf, 0x2f, - 0x06, 0x2e, 0xb0, 0x23, 0xd3, 0x3e, 0x2d, 0x80, 0xeb, 0x61, 0xd2, 0x10, 0x69, 0xf4, 0x2d, 0x17, - 0x1f, 0xeb, 0x90, 0xa2, 0x7b, 0xce, 0xd8, 0x39, 0x37, 0x8d, 0x32, 0xbe, 0x75, 0x29, 0xe6, 0xfc, - 0xd6, 0xe5, 0x5b, 0x60, 0x55, 0xbe, 0x43, 0x74, 0x86, 0xa5, 0x05, 0xeb, 0xa5, 0x44, 0xf7, 0x79, - 0x7f, 0x68, 0x81, 0xd6, 0xc8, 0xc5, 0xc7, 0x06, 0xab, 0x77, 0x86, 0xcb, 0x34, 0x95, 0x17, 0x55, - 0xdf, 0x96, 0x66, 0xbb, 0x69, 0x3b, 0xf4, 0xc1, 0x64, 0xd8, 0x33, 0xf1, 0x58, 0x7e, 0xaf, 0x25, - 0xff, 0xdc, 0x22, 0xd6, 0x43, 0xf9, 0x9d, 0x54, 0x9f, 0x1b, 0x16, 0xc8, 0xb7, 0xf5, 0x3d, 0xaa, - 0x37, 0x46, 0x71, 0xe3, 0x69, 0xbf, 0x08, 0x11, 0x93, 0x61, 0xd9, 0x41, 0x66, 0x37, 0x9e, 0x9e, - 0x44, 0xdf, 0x00, 0xc0, 0x21, 0x42, 0x44, 0x24, 0x02, 0xbe, 0xaa, 0xd7, 0x1c, 0x72, 0x4f, 0x10, - 0xce, 0x50, 0x4e, 0x7f, 0xaf, 0x80, 0x1b, 0x5c, 0xb8, 0x43, 0x6c, 0xdb, 0x2e, 0x1a, 0x1c, 0xec, - 0x10, 0xd6, 0xab, 0xd9, 0x1c, 0xed, 0x36, 0x43, 0xf3, 0x69, 0xa6, 0xe4, 0xb3, 0x97, 0x17, 0x72, - 0x56, 0x46, 0xe2, 0x1b, 0x90, 0xf0, 0x31, 0x92, 0x2d, 0x42, 0x8e, 0xbd, 0xd3, 0xb0, 0x1c, 0x02, - 0x87, 0x2e, 0x12, 0xba, 0x54, 0xf5, 0x0d, 0xe2, 0xcf, 0x8b, 0xb5, 0x2f, 0x39, 0x76, 0xfb, 0x8f, - 0x9f, 0x76, 0x94, 0x8f, 0x9f, 0x76, 0x94, 0xbf, 0x3e, 0xed, 0x28, 0x1f, 0x3c, 0xeb, 0x5c, 0xf9, - 0xf8, 0x59, 0xe7, 0xca, 0x1f, 0x9f, 0x75, 0xae, 0x7c, 0x7f, 0x3b, 0xe6, 0xbc, 0xa1, 0x37, 0xbc, - 0xc5, 0x1b, 0xe0, 0xed, 0xd8, 0xf7, 0x6e, 0x8f, 0x92, 0x5f, 0xbc, 0x0d, 0x2b, 0x7c, 0x90, 0xf1, - 0xfa, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x8a, 0x53, 0xc0, 0xdd, 0x27, 0x00, 0x00, + // 2097 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5a, 0xcd, 0x8f, 0xe4, 0x46, + 0x15, 0x5f, 0xf7, 0xd7, 0x74, 0xbf, 0x9e, 0xee, 0xde, 0x31, 0xc3, 0xa6, 0x99, 0xcd, 0xf6, 0x74, + 0x8c, 0x58, 0x26, 0x11, 0x3b, 0x83, 0x36, 0x01, 0xad, 0x04, 0xd2, 0x6a, 0x3e, 0x12, 0xd4, 0x62, + 0x93, 0x1d, 0xdc, 0x93, 0x1c, 0xb8, 0x58, 0xd5, 0x76, 0x8d, 0xd7, 0xac, 0xdb, 0x65, 0x5c, 0xd5, + 0x33, 0xdb, 0xf9, 0x07, 0xb8, 0x80, 0x14, 0x09, 0x21, 0x01, 0x07, 0xae, 0x20, 0x71, 0xe1, 0x90, + 0x2b, 0x9c, 0xf7, 0x98, 0x2c, 0x97, 0x10, 0xa4, 0x80, 0x76, 0x85, 0xf8, 0x90, 0x10, 0x9c, 0x39, + 0x21, 0x57, 0x95, 0xdd, 0x76, 0xbb, 0x67, 0x7b, 0xdc, 0x9b, 0xc9, 0xcc, 0xe6, 0x34, 0xe3, 0xd7, + 0xaf, 0xca, 0xef, 0xe3, 0xf7, 0x3e, 0xea, 0x95, 0x61, 0xdd, 0x0e, 0x30, 0xf6, 0x0e, 0x1d, 0xec, + 0x5a, 0x5b, 0x94, 0x91, 0x00, 0xd9, 0x78, 0x0b, 0x1f, 0x61, 0x8f, 0xd1, 0x4d, 0x3f, 0x20, 0x8c, + 0xa8, 0xea, 0x84, 0x61, 0x53, 0x32, 0xac, 0x7d, 0xc9, 0x24, 0x74, 0x48, 0xa8, 0xc1, 0x39, 0xb6, + 0xc4, 0x83, 0x60, 0x5f, 0x5b, 0xb5, 0x89, 0x4d, 0x04, 0x3d, 0xfc, 0x4f, 0x52, 0xd7, 0x6d, 0x42, + 0x6c, 0x17, 0x6f, 0xf1, 0xa7, 0xc1, 0xe8, 0x70, 0x8b, 0x39, 0x43, 0x4c, 0x19, 0x1a, 0xfa, 0x31, + 0xc3, 0x44, 0x8c, 0x00, 0x53, 0x32, 0x0a, 0x4c, 0xbc, 0xc5, 0xc6, 0x3e, 0xa6, 0x33, 0x18, 0x22, + 0x39, 0x4d, 0x32, 0x1c, 0x12, 0x4f, 0x32, 0x74, 0x66, 0x30, 0x24, 0x36, 0xd0, 0xfe, 0x58, 0x82, + 0x95, 0xd7, 0x43, 0xc5, 0x76, 0x03, 0x8c, 0x18, 0xde, 0x19, 0x99, 0xf7, 0x31, 0x53, 0x37, 0xa1, + 0x4c, 0x8e, 0x3d, 0x1c, 0xb4, 0x95, 0xae, 0xb2, 0x51, 0xdb, 0x69, 0x3f, 0x7a, 0xff, 0xc6, 0xaa, + 0xd4, 0x67, 0xdb, 0xb2, 0x02, 0x4c, 0x69, 0x9f, 0x05, 0x8e, 0x67, 0xeb, 0x82, 0x4d, 0x5d, 0x87, + 0xfa, 0x80, 0xaf, 0x34, 0x3c, 0x34, 0xc4, 0xed, 0x42, 0xb8, 0x4a, 0x07, 0x41, 0x7a, 0x0b, 0x0d, + 0xb1, 0xba, 0x03, 0x70, 0xe4, 0x50, 0x67, 0xe0, 0xb8, 0x0e, 0x1b, 0xb7, 0x8b, 0x5d, 0x65, 0xa3, + 0x79, 0x53, 0xdb, 0xcc, 0xda, 0x70, 0xf3, 0x9d, 0x98, 0xeb, 0x60, 0xec, 0x63, 0x3d, 0xb1, 0x4a, + 0xbd, 0x0a, 0x35, 0x93, 0x0b, 0x69, 0x20, 0xd6, 0x2e, 0x75, 0x95, 0x8d, 0xa2, 0x5e, 0x15, 0x84, + 0x6d, 0xa6, 0xde, 0x82, 0x9a, 0x94, 0xc0, 0xb1, 0xda, 0x65, 0x2e, 0xf5, 0xd5, 0x87, 0x9f, 0xac, + 0x5f, 0xfa, 0xf8, 0x93, 0xf5, 0xd2, 0xdb, 0x8e, 0xc7, 0x1e, 0xbd, 0x7f, 0xa3, 0x2e, 0x35, 0x08, + 0x1f, 0xf5, 0xaa, 0xe0, 0xee, 0x59, 0xea, 0x6d, 0xa8, 0x0b, 0xc3, 0x1a, 0xa1, 0x5d, 0xda, 0x15, + 0x2e, 0x5b, 0x67, 0x96, 0x6c, 0x7d, 0xce, 0x26, 0xe4, 0xa2, 0xf1, 0xff, 0xea, 0xd7, 0x40, 0x35, + 0xef, 0xa1, 0xc0, 0xc6, 0x96, 0x11, 0x60, 0x64, 0x19, 0x3f, 0x1c, 0x11, 0x86, 0xda, 0x4b, 0x5d, + 0x65, 0xa3, 0xa4, 0x5f, 0x96, 0xbf, 0xe8, 0x18, 0x59, 0xdf, 0x0b, 0xe9, 0xea, 0x36, 0xb4, 0x7c, + 0x34, 0x1e, 0x62, 0x8f, 0x19, 0x48, 0x98, 0xb2, 0x5d, 0x9d, 0x63, 0xe4, 0xa6, 0x5c, 0x20, 0xa9, + 0xaa, 0x06, 0x0d, 0x3f, 0x70, 0x86, 0x28, 0x18, 0x1b, 0xd4, 0x0f, 0xf5, 0xad, 0x75, 0x95, 0x8d, + 0x86, 0x5e, 0x97, 0xc4, 0xbe, 0xdf, 0xb3, 0xd4, 0x1d, 0xe8, 0xd8, 0x2e, 0x19, 0x20, 0xd7, 0x38, + 0x72, 0x02, 0x36, 0x42, 0xae, 0x61, 0x07, 0x64, 0xe4, 0x1b, 0x87, 0x68, 0xe8, 0xb8, 0xe3, 0x70, + 0x11, 0xf0, 0x45, 0x6b, 0x82, 0xeb, 0x1d, 0xc1, 0xf4, 0x9d, 0x90, 0xe7, 0x0d, 0xce, 0xd2, 0xb3, + 0xd4, 0x5b, 0x50, 0xa1, 0x0c, 0xb1, 0x11, 0x6d, 0xd7, 0xb9, 0x51, 0xba, 0xb3, 0x8c, 0x22, 0x10, + 0xd3, 0xe7, 0x7c, 0xba, 0xe4, 0xd7, 0x7e, 0x5e, 0x90, 0xa8, 0xda, 0xc3, 0x2e, 0x8e, 0x51, 0xf5, + 0x1a, 0x54, 0x89, 0x8f, 0x03, 0xc4, 0xc8, 0x7c, 0x60, 0xc5, 0x9c, 0x13, 0x2c, 0x16, 0x16, 0xc2, + 0x62, 0x31, 0x83, 0xc5, 0x14, 0x54, 0x4a, 0x79, 0xa0, 0x32, 0xdf, 0xa8, 0xe5, 0x79, 0x46, 0xd5, + 0x7e, 0x54, 0x84, 0x2f, 0x72, 0xd3, 0xbc, 0xed, 0x5b, 0x71, 0xc0, 0xf5, 0xbc, 0x43, 0xb2, 0xa0, + 0x79, 0xe6, 0x86, 0x5e, 0x4a, 0xdd, 0x62, 0x1e, 0x75, 0x67, 0x03, 0xbb, 0x74, 0x02, 0xb0, 0xbf, + 0x9a, 0x05, 0x36, 0x8f, 0xc3, 0x0c, 0x7c, 0xd3, 0xb9, 0xa0, 0xb2, 0x50, 0x2e, 0x98, 0xef, 0x89, + 0xa5, 0xb9, 0x9e, 0xf8, 0x8d, 0x02, 0x57, 0x04, 0x48, 0x1d, 0x6a, 0x12, 0x8f, 0x39, 0xde, 0x28, + 0x42, 0x6a, 0xca, 0x66, 0x4a, 0x1e, 0x9b, 0xcd, 0x75, 0xc7, 0x15, 0xa8, 0x04, 0x18, 0x51, 0xe2, + 0x49, 0x64, 0xca, 0xa7, 0x30, 0xbb, 0x59, 0x3c, 0x58, 0x12, 0xd9, 0x4d, 0x10, 0xb6, 0x99, 0xf6, + 0xd3, 0x4a, 0x2a, 0x4b, 0xdf, 0x1d, 0xfc, 0x00, 0x9b, 0x4c, 0xbd, 0x09, 0x4b, 0x3c, 0xff, 0x9d, + 0x02, 0x2f, 0x11, 0xe3, 0xa7, 0x1f, 0x4d, 0xeb, 0x50, 0x27, 0x5c, 0x1c, 0xc1, 0x50, 0x12, 0x0c, + 0x82, 0x94, 0xc5, 0x5f, 0x25, 0x8f, 0x2d, 0x6f, 0x41, 0x4d, 0x6e, 0x2d, 0xfd, 0x39, 0x6f, 0xa5, + 0xe0, 0xee, 0x59, 0xd9, 0x0c, 0x59, 0xcd, 0x66, 0xc8, 0x97, 0x60, 0xd9, 0x47, 0x63, 0x97, 0x20, + 0xcb, 0xa0, 0xce, 0xbb, 0x98, 0x27, 0xd1, 0x92, 0x5e, 0x97, 0xb4, 0xbe, 0xf3, 0xee, 0x74, 0xd5, + 0x82, 0x85, 0x90, 0xfa, 0x12, 0x2c, 0x87, 0xe0, 0x0a, 0xc3, 0x82, 0xd7, 0x97, 0x3a, 0x37, 0x50, + 0x5d, 0xd2, 0x78, 0x01, 0x49, 0x15, 0xb6, 0xe5, 0x4c, 0x61, 0x8b, 0x92, 0x70, 0xe3, 0xe4, 0x24, + 0x2c, 0x00, 0x91, 0x4e, 0xc2, 0xea, 0x77, 0xa1, 0x15, 0x60, 0x6b, 0xe4, 0x59, 0xc8, 0x33, 0xc7, + 0xe2, 0xe5, 0xcd, 0x93, 0x55, 0xd0, 0x63, 0x56, 0xae, 0x42, 0x33, 0x48, 0x3d, 0x4f, 0x57, 0xc9, + 0x56, 0xee, 0x2a, 0xf9, 0x22, 0xd4, 0xcc, 0x7b, 0xd8, 0xbc, 0x4f, 0x47, 0x43, 0xda, 0xbe, 0xdc, + 0x2d, 0x6e, 0x2c, 0xeb, 0x13, 0x82, 0xfa, 0x2a, 0x5c, 0x71, 0x89, 0x99, 0x09, 0x67, 0xc7, 0x6a, + 0xaf, 0x70, 0xcf, 0x7d, 0x81, 0xff, 0x9a, 0x0c, 0xe3, 0x9e, 0xa5, 0xfd, 0x47, 0x81, 0x17, 0x44, + 0x54, 0x20, 0xcf, 0xc4, 0x6e, 0x2a, 0x36, 0xce, 0x28, 0x99, 0x4e, 0xa1, 0xbd, 0x98, 0x41, 0x7b, + 0x06, 0x79, 0xa5, 0x2c, 0xf2, 0x52, 0xb8, 0xae, 0xe4, 0xc0, 0x75, 0x58, 0x3c, 0x5a, 0x5c, 0xe3, + 0x3e, 0x46, 0xee, 0x39, 0x6b, 0x9a, 0xd2, 0xa2, 0x9c, 0x27, 0x3a, 0x27, 0x90, 0xae, 0xe4, 0x84, + 0xf4, 0x37, 0xe0, 0x85, 0x99, 0x69, 0x3f, 0xce, 0xf7, 0xab, 0xd9, 0x7c, 0xdf, 0xb3, 0x9e, 0x82, + 0xae, 0xea, 0x89, 0xe8, 0x4a, 0x03, 0xb6, 0x36, 0x05, 0x58, 0xed, 0x57, 0x91, 0x27, 0x76, 0x89, + 0x3f, 0x7e, 0x26, 0x4f, 0x5c, 0x87, 0x16, 0x0d, 0x4c, 0x23, 0xeb, 0x8d, 0x06, 0x0d, 0xcc, 0x9d, + 0x89, 0x43, 0x24, 0x5f, 0xd6, 0x29, 0x21, 0xdf, 0xdd, 0x89, 0x5f, 0xae, 0x43, 0xcb, 0xa2, 0x2c, + 0xb5, 0x9f, 0x48, 0xca, 0x0d, 0x8b, 0xb2, 0xf4, 0x7e, 0x21, 0x5f, 0x72, 0xbf, 0x72, 0xcc, 0x97, + 0xd8, 0xef, 0x36, 0x34, 0x12, 0xef, 0x3d, 0x1d, 0x62, 0xeb, 0xb1, 0x48, 0xbc, 0xc1, 0x6e, 0x24, + 0x5e, 0x74, 0xba, 0x54, 0x5e, 0x8f, 0x65, 0x58, 0xd0, 0x7d, 0xda, 0xff, 0x94, 0x54, 0x0b, 0x7a, + 0x91, 0x82, 0xa5, 0x94, 0x27, 0x58, 0x4e, 0x56, 0xbe, 0x7c, 0xb2, 0xf2, 0xff, 0x50, 0x64, 0x93, + 0xa9, 0x63, 0x1e, 0x45, 0x17, 0x2c, 0x5b, 0xe4, 0x32, 0xc0, 0x35, 0x80, 0x43, 0x12, 0x18, 0x23, + 0xde, 0x2e, 0x73, 0xa5, 0xab, 0x7a, 0xed, 0x90, 0x04, 0xa2, 0x7f, 0x9e, 0xd9, 0xc5, 0x49, 0x5d, + 0xa7, 0xa4, 0x56, 0x66, 0xb5, 0xc6, 0x13, 0xa1, 0x0a, 0x79, 0x84, 0x5a, 0xa8, 0x8b, 0xfb, 0x49, + 0x21, 0xd5, 0xfa, 0x4b, 0x7c, 0x9f, 0x61, 0xeb, 0x7f, 0x86, 0x5e, 0x49, 0xb7, 0x46, 0xe5, 0x45, + 0x5a, 0x23, 0xed, 0xbf, 0x0a, 0x5c, 0x4e, 0x74, 0xb5, 0x1c, 0xbc, 0xb9, 0x47, 0x0f, 0xd7, 0x00, + 0x44, 0x44, 0x24, 0x6c, 0x50, 0xe3, 0x14, 0xae, 0xe1, 0x37, 0xa1, 0x1a, 0x07, 0xcc, 0x29, 0x0e, + 0x3f, 0x4b, 0xb6, 0xcc, 0xfe, 0x53, 0xfd, 0x4e, 0x29, 0x77, 0xbf, 0xb3, 0x0a, 0x65, 0xfc, 0x80, + 0x05, 0x48, 0x26, 0x55, 0xf1, 0xa0, 0xfd, 0x22, 0x52, 0x59, 0x64, 0xa5, 0x29, 0x95, 0x0b, 0x8b, + 0xa8, 0x5c, 0x7c, 0x9a, 0xca, 0xa5, 0xd3, 0xab, 0xac, 0xfd, 0x49, 0x91, 0x25, 0xed, 0x0e, 0x46, + 0x47, 0x52, 0xb4, 0xdb, 0xd0, 0x1c, 0xe2, 0xe1, 0x00, 0x07, 0xf1, 0x99, 0x6e, 0x9e, 0x5b, 0x1a, + 0x82, 0x3f, 0x3a, 0xec, 0x5d, 0x10, 0xdd, 0xfe, 0x5d, 0x90, 0x59, 0x42, 0x84, 0x1e, 0x57, 0xee, + 0x4d, 0x2e, 0xe8, 0x67, 0x34, 0x95, 0x38, 0x1b, 0xbd, 0xd4, 0xfd, 0xc8, 0x3f, 0xd4, 0x60, 0x24, + 0xf4, 0x51, 0xbb, 0xdc, 0x2d, 0x6e, 0xd4, 0x6f, 0xbe, 0x32, 0x0b, 0xa9, 0xdc, 0x00, 0x09, 0xd5, + 0xf7, 0x30, 0x43, 0x8e, 0xab, 0x2f, 0xcb, 0x1d, 0x0e, 0xc8, 0xb6, 0x65, 0xa9, 0x7b, 0xb0, 0x92, + 0xd8, 0x51, 0xe4, 0xae, 0x76, 0xa5, 0x5b, 0x7c, 0xaa, 0x92, 0xad, 0x78, 0x0b, 0x81, 0x6b, 0xed, + 0xcf, 0x85, 0xb8, 0x00, 0x79, 0xf8, 0xf8, 0x73, 0x63, 0xee, 0xa9, 0xac, 0x50, 0xce, 0x9d, 0x15, + 0xf6, 0x60, 0x49, 0x9a, 0x8a, 0xdb, 0x34, 0x9f, 0xa3, 0xa2, 0xa5, 0xda, 0xcf, 0xa2, 0x9a, 0x97, + 0xe1, 0x51, 0xbf, 0x0e, 0x15, 0xc1, 0x35, 0xd7, 0xb8, 0x92, 0x4f, 0xed, 0x41, 0x0b, 0x3f, 0xf0, + 0x9d, 0x00, 0x31, 0x87, 0x78, 0x06, 0x73, 0x64, 0x16, 0xad, 0xdf, 0x5c, 0xdb, 0x14, 0xe3, 0xe9, + 0xcd, 0x68, 0x3c, 0xbd, 0x79, 0x10, 0x8d, 0xa7, 0x77, 0x4a, 0xef, 0xfd, 0x65, 0x5d, 0xd1, 0x9b, + 0x93, 0x85, 0xe1, 0x4f, 0xda, 0xbf, 0x94, 0x54, 0x81, 0xe3, 0xd2, 0xbd, 0x1e, 0xe6, 0xbd, 0xe7, + 0xdb, 0xeb, 0xb3, 0x53, 0xf9, 0xc3, 0xa8, 0xc1, 0x7c, 0xd3, 0x09, 0x02, 0x12, 0x3c, 0xd3, 0x8c, + 0x33, 0xdf, 0x10, 0x2f, 0xd7, 0xcc, 0x52, 0x83, 0x86, 0x85, 0x29, 0x33, 0xcc, 0x7b, 0xc8, 0xf1, + 0x26, 0x6d, 0x63, 0x3d, 0x24, 0xee, 0x86, 0xb4, 0x9e, 0xa5, 0xfd, 0x2e, 0x3a, 0x48, 0x27, 0x55, + 0xd1, 0x31, 0x1d, 0xb9, 0x2c, 0xec, 0x74, 0xe4, 0x61, 0x4d, 0xe1, 0x0b, 0xa3, 0xa3, 0xd8, 0x39, + 0x8b, 0xfc, 0xcf, 0xb4, 0xf5, 0x9f, 0xdb, 0xee, 0xf6, 0x34, 0xba, 0x7e, 0x98, 0x76, 0x8f, 0xd0, + 0xf5, 0x59, 0xdd, 0x73, 0xce, 0x3a, 0xfd, 0x3e, 0x6a, 0x84, 0x84, 0x4e, 0x17, 0xaa, 0xf7, 0xcb, + 0xc8, 0x5f, 0xca, 0xca, 0xff, 0xdb, 0x28, 0x05, 0x27, 0xe4, 0x9f, 0xe3, 0x92, 0x73, 0x94, 0xf6, + 0x48, 0x02, 0xa8, 0xcf, 0x90, 0x8b, 0xf7, 0x89, 0xeb, 0x98, 0xe3, 0x5d, 0x17, 0x23, 0x6f, 0xe4, + 0xab, 0x6b, 0x50, 0x1d, 0xb8, 0xc4, 0xbc, 0xff, 0xd6, 0x68, 0xc8, 0xe5, 0x2d, 0xea, 0xf1, 0x73, + 0x58, 0xee, 0xe4, 0x69, 0xc6, 0xf1, 0x0e, 0x89, 0x2c, 0x0b, 0x33, 0xcb, 0x9d, 0x28, 0xfb, 0xe1, + 0x59, 0x46, 0x07, 0x2b, 0xfe, 0x5f, 0xfb, 0x71, 0x01, 0x56, 0xa5, 0x95, 0x6c, 0x51, 0x27, 0x3e, + 0xc3, 0x34, 0x99, 0xeb, 0xae, 0xe3, 0x65, 0x58, 0xb1, 0x28, 0x33, 0x66, 0xcd, 0xee, 0x9a, 0x16, + 0x65, 0xfb, 0xa9, 0xf1, 0x5d, 0xe4, 0xdf, 0x72, 0xce, 0x6b, 0xb1, 0xbf, 0x2b, 0xb0, 0x96, 0x18, + 0x58, 0x5e, 0x78, 0xa3, 0x4c, 0x34, 0x2d, 0xe5, 0xd4, 0xf4, 0x6f, 0x0a, 0xb4, 0x13, 0x03, 0x08, + 0xa1, 0x29, 0xfe, 0xfc, 0xe9, 0xf9, 0x51, 0x01, 0x5e, 0x94, 0x63, 0xc0, 0xa1, 0x1f, 0xc2, 0xfe, + 0xc2, 0xfb, 0x74, 0xfe, 0xcd, 0x59, 0x69, 0xee, 0xc5, 0xf0, 0xcb, 0xb0, 0x42, 0x03, 0x73, 0x2a, + 0x58, 0x44, 0x92, 0x6f, 0xd2, 0xc0, 0x9c, 0x1d, 0x2c, 0x95, 0x9c, 0xa6, 0x35, 0xa0, 0x2e, 0x47, + 0xdd, 0xec, 0x00, 0xd9, 0x61, 0x9e, 0x8a, 0xbe, 0x80, 0x90, 0x93, 0x9c, 0xf8, 0x59, 0x7d, 0x0d, + 0x4a, 0x0c, 0xd9, 0x54, 0x26, 0xa8, 0xee, 0xec, 0xeb, 0x0d, 0xd9, 0x85, 0x23, 0x9b, 0xea, 0x9c, + 0x5b, 0xfb, 0x75, 0x41, 0x62, 0x34, 0x39, 0x8e, 0xd9, 0x15, 0xf7, 0x32, 0x0b, 0xfa, 0x6d, 0xf1, + 0x81, 0xd2, 0xb3, 0xdf, 0xb3, 0x4d, 0xdf, 0x67, 0x95, 0xb3, 0xf7, 0x59, 0xa9, 0x91, 0x76, 0x65, + 0xfa, 0x0e, 0xa6, 0x0d, 0x4b, 0x47, 0x38, 0xa0, 0x0e, 0xf1, 0xf8, 0x84, 0xb6, 0xa8, 0x47, 0x8f, + 0xda, 0x87, 0x45, 0x58, 0x3f, 0xc9, 0x52, 0xfd, 0x91, 0x69, 0x86, 0x07, 0xfd, 0xe7, 0xd2, 0x60, + 0xa9, 0x9b, 0xb9, 0x72, 0xf6, 0x66, 0xee, 0x15, 0x58, 0xf1, 0x03, 0x7c, 0x64, 0xa4, 0x0c, 0x5b, + 0xe1, 0x86, 0x6d, 0x85, 0x3f, 0xec, 0x27, 0x8c, 0xbb, 0x01, 0x97, 0x3d, 0x7c, 0x9c, 0x66, 0x15, + 0x1f, 0x81, 0x34, 0x3d, 0x7c, 0x9c, 0xe4, 0xfc, 0x0a, 0x34, 0xf9, 0xae, 0x13, 0x5f, 0x54, 0xb9, + 0x2f, 0x1a, 0x21, 0x75, 0x37, 0xf6, 0xc7, 0x97, 0xa1, 0x11, 0x6e, 0x38, 0x7d, 0x09, 0xb1, 0xec, + 0xe1, 0xe3, 0xdd, 0x59, 0x4e, 0x83, 0x94, 0xd3, 0xc2, 0x76, 0x43, 0xcc, 0x4c, 0x2d, 0x03, 0x31, + 0x7e, 0xed, 0x58, 0xd4, 0x6b, 0x92, 0xb2, 0xcd, 0xb4, 0x47, 0x0a, 0x74, 0x12, 0xb5, 0xe8, 0xd3, + 0x8b, 0x81, 0x73, 0xec, 0x3c, 0xb5, 0x8f, 0x0b, 0x70, 0x35, 0x4a, 0x1a, 0x22, 0xa9, 0xbc, 0xe1, + 0x92, 0x63, 0x1d, 0x31, 0x7c, 0xc7, 0x19, 0x3a, 0x67, 0xa6, 0xd1, 0x8c, 0x6f, 0x7a, 0x8a, 0x39, + 0xbf, 0xe9, 0xf9, 0x16, 0x2c, 0xcb, 0x77, 0x88, 0x0e, 0xb8, 0x34, 0x67, 0xbd, 0x94, 0xe8, 0x2e, + 0xef, 0x83, 0x2d, 0x68, 0x1d, 0xba, 0xe4, 0xd8, 0x08, 0x6b, 0xac, 0xe1, 0x86, 0x9a, 0xca, 0x0b, + 0xb9, 0x6f, 0x4b, 0xb3, 0x5d, 0xb7, 0x1d, 0x76, 0x6f, 0x34, 0xd8, 0x34, 0xc9, 0x50, 0x7e, 0x97, + 0x26, 0xff, 0xdc, 0xa0, 0xd6, 0x7d, 0xf9, 0x3d, 0x58, 0x8f, 0x1b, 0x16, 0xe4, 0xdb, 0x7a, 0x1e, + 0xd3, 0x1b, 0x87, 0x49, 0xe3, 0x69, 0xbf, 0x8c, 0x10, 0x33, 0xc3, 0xb2, 0xfd, 0x99, 0xa7, 0x8e, + 0xec, 0xc4, 0xfd, 0x1a, 0x80, 0x43, 0x85, 0x88, 0x58, 0x04, 0x7c, 0x55, 0xaf, 0x39, 0xf4, 0x8e, + 0x20, 0x2c, 0x5e, 0xd6, 0xb4, 0x3f, 0x28, 0x70, 0x8d, 0x0b, 0x77, 0x40, 0x6c, 0xdb, 0xc5, 0xfd, + 0xfd, 0x6d, 0x1a, 0xf6, 0xa4, 0x36, 0x47, 0xbb, 0x1d, 0xa2, 0xf9, 0x34, 0xb7, 0x01, 0x93, 0x97, + 0x17, 0x72, 0xd6, 0x54, 0xea, 0x1b, 0x88, 0xf2, 0x71, 0x99, 0x2d, 0x42, 0x2e, 0x7c, 0xa7, 0x61, + 0x39, 0x14, 0x0d, 0x5c, 0x2c, 0x74, 0xa9, 0xea, 0x6b, 0xd4, 0x9f, 0x16, 0x6b, 0x4f, 0x72, 0xec, + 0xf4, 0x1e, 0x3e, 0xee, 0x28, 0x1f, 0x3c, 0xee, 0x28, 0x7f, 0x7d, 0xdc, 0x51, 0xde, 0x7b, 0xd2, + 0xb9, 0xf4, 0xc1, 0x93, 0xce, 0xa5, 0x8f, 0x9e, 0x74, 0x2e, 0x7d, 0x7f, 0x2b, 0xe1, 0xbc, 0x81, + 0x37, 0xb8, 0xc1, 0x1b, 0xfd, 0xad, 0xc4, 0x77, 0x7d, 0x0f, 0xd2, 0x5f, 0xf6, 0x0d, 0x2a, 0x7c, + 0x60, 0xf3, 0xea, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x13, 0xed, 0x46, 0x18, 0xc5, 0x28, 0x00, + 0x00, } func (m *EventCreateBucket) Marshal() (dAtA []byte, err error) { @@ -4685,6 +4723,11 @@ func (m *EventMigrationBucket) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Status != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x28 + } if m.DstPrimarySpId != 0 { i = encodeVarintEvents(dAtA, i, uint64(m.DstPrimarySpId)) i-- @@ -4737,6 +4780,11 @@ func (m *EventCancelMigrationBucket) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l + if m.Status != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x20 + } { size := m.BucketId.Size() i -= size @@ -4784,6 +4832,11 @@ func (m *EventRejectMigrateBucket) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if m.Status != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x20 + } { size := m.BucketId.Size() i -= size @@ -4831,6 +4884,11 @@ func (m *EventCompleteMigrationBucket) MarshalToSizedBuffer(dAtA []byte) (int, e _ = i var l int _ = l + if m.Status != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x30 + } if m.SrcPrimarySpId != 0 { i = encodeVarintEvents(dAtA, i, uint64(m.SrcPrimarySpId)) i-- @@ -6046,6 +6104,9 @@ func (m *EventMigrationBucket) Size() (n int) { if m.DstPrimarySpId != 0 { n += 1 + sovEvents(uint64(m.DstPrimarySpId)) } + if m.Status != 0 { + n += 1 + sovEvents(uint64(m.Status)) + } return n } @@ -6065,6 +6126,9 @@ func (m *EventCancelMigrationBucket) Size() (n int) { } l = m.BucketId.Size() n += 1 + l + sovEvents(uint64(l)) + if m.Status != 0 { + n += 1 + sovEvents(uint64(m.Status)) + } return n } @@ -6084,6 +6148,9 @@ func (m *EventRejectMigrateBucket) Size() (n int) { } l = m.BucketId.Size() n += 1 + l + sovEvents(uint64(l)) + if m.Status != 0 { + n += 1 + sovEvents(uint64(m.Status)) + } return n } @@ -6109,6 +6176,9 @@ func (m *EventCompleteMigrationBucket) Size() (n int) { if m.SrcPrimarySpId != 0 { n += 1 + sovEvents(uint64(m.SrcPrimarySpId)) } + if m.Status != 0 { + n += 1 + sovEvents(uint64(m.Status)) + } return n } @@ -11829,6 +11899,25 @@ func (m *EventMigrationBucket) Unmarshal(dAtA []byte) error { break } } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= BucketStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -11977,6 +12066,25 @@ func (m *EventCancelMigrationBucket) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= BucketStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -12125,6 +12233,25 @@ func (m *EventRejectMigrateBucket) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= BucketStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -12311,6 +12438,25 @@ func (m *EventCompleteMigrationBucket) Unmarshal(dAtA []byte) error { break } } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= BucketStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) diff --git a/x/storage/types/expected_keepers.go b/x/storage/types/expected_keepers.go index 890758c6b..5cddd04ae 100644 --- a/x/storage/types/expected_keepers.go +++ b/x/storage/types/expected_keepers.go @@ -50,6 +50,8 @@ type PaymentKeeper interface { UpdateStreamRecordByAddr(ctx sdk.Context, change *paymenttypes.StreamRecordChange) (ret *paymenttypes.StreamRecord, err error) GetStreamRecord(ctx sdk.Context, account sdk.AccAddress) (ret *paymenttypes.StreamRecord, found bool) MergeOutFlows(flows []paymenttypes.OutFlow) []paymenttypes.OutFlow + GetAllStreamRecord(ctx sdk.Context) (list []paymenttypes.StreamRecord) + GetOutFlows(ctx sdk.Context, addr sdk.AccAddress) []paymenttypes.OutFlow } type PermissionKeeper interface { diff --git a/x/storage/types/expected_keepers_mocks.go b/x/storage/types/expected_keepers_mocks.go index ff4f05972..67aae3609 100644 --- a/x/storage/types/expected_keepers_mocks.go +++ b/x/storage/types/expected_keepers_mocks.go @@ -5,6 +5,7 @@ package types import ( + context "context" big "math/big" reflect "reflect" time "time" @@ -300,6 +301,34 @@ func (mr *MockPaymentKeeperMockRecorder) ApplyUserFlowsList(ctx, userFlows inter return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ApplyUserFlowsList", reflect.TypeOf((*MockPaymentKeeper)(nil).ApplyUserFlowsList), ctx, userFlows) } +// GetAllStreamRecord mocks base method. +func (m *MockPaymentKeeper) GetAllStreamRecord(ctx types3.Context) []types.StreamRecord { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAllStreamRecord", ctx) + ret0, _ := ret[0].([]types.StreamRecord) + return ret0 +} + +// GetAllStreamRecord indicates an expected call of GetAllStreamRecord. +func (mr *MockPaymentKeeperMockRecorder) GetAllStreamRecord(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllStreamRecord", reflect.TypeOf((*MockPaymentKeeper)(nil).GetAllStreamRecord), ctx) +} + +// GetOutFlows mocks base method. +func (m *MockPaymentKeeper) GetOutFlows(ctx types3.Context, addr types3.AccAddress) []types.OutFlow { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOutFlows", ctx, addr) + ret0, _ := ret[0].([]types.OutFlow) + return ret0 +} + +// GetOutFlows indicates an expected call of GetOutFlows. +func (mr *MockPaymentKeeperMockRecorder) GetOutFlows(ctx, addr interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOutFlows", reflect.TypeOf((*MockPaymentKeeper)(nil).GetOutFlows), ctx, addr) +} + // GetStreamRecord mocks base method. func (m *MockPaymentKeeper) GetStreamRecord(ctx types3.Context, account types3.AccAddress) (*types.StreamRecord, bool) { m.ctrl.T.Helper() @@ -1164,3 +1193,244 @@ func (mr *MockStorageKeeperMockRecorder) ValidatePrincipal(ctx, resOwner, princi mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidatePrincipal", reflect.TypeOf((*MockStorageKeeper)(nil).ValidatePrincipal), ctx, resOwner, principal) } + +// MockPaymentMsgServer is a mock of PaymentMsgServer interface. +type MockPaymentMsgServer struct { + ctrl *gomock.Controller + recorder *MockPaymentMsgServerMockRecorder +} + +// MockPaymentMsgServerMockRecorder is the mock recorder for MockPaymentMsgServer. +type MockPaymentMsgServerMockRecorder struct { + mock *MockPaymentMsgServer +} + +// NewMockPaymentMsgServer creates a new mock instance. +func NewMockPaymentMsgServer(ctrl *gomock.Controller) *MockPaymentMsgServer { + mock := &MockPaymentMsgServer{ctrl: ctrl} + mock.recorder = &MockPaymentMsgServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockPaymentMsgServer) EXPECT() *MockPaymentMsgServerMockRecorder { + return m.recorder +} + +// CreatePaymentAccount mocks base method. +func (m *MockPaymentMsgServer) CreatePaymentAccount(arg0 context.Context, arg1 *types.MsgCreatePaymentAccount) (*types.MsgCreatePaymentAccountResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreatePaymentAccount", arg0, arg1) + ret0, _ := ret[0].(*types.MsgCreatePaymentAccountResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreatePaymentAccount indicates an expected call of CreatePaymentAccount. +func (mr *MockPaymentMsgServerMockRecorder) CreatePaymentAccount(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreatePaymentAccount", reflect.TypeOf((*MockPaymentMsgServer)(nil).CreatePaymentAccount), arg0, arg1) +} + +// Deposit mocks base method. +func (m *MockPaymentMsgServer) Deposit(arg0 context.Context, arg1 *types.MsgDeposit) (*types.MsgDepositResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Deposit", arg0, arg1) + ret0, _ := ret[0].(*types.MsgDepositResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Deposit indicates an expected call of Deposit. +func (mr *MockPaymentMsgServerMockRecorder) Deposit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Deposit", reflect.TypeOf((*MockPaymentMsgServer)(nil).Deposit), arg0, arg1) +} + +// DisableRefund mocks base method. +func (m *MockPaymentMsgServer) DisableRefund(arg0 context.Context, arg1 *types.MsgDisableRefund) (*types.MsgDisableRefundResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DisableRefund", arg0, arg1) + ret0, _ := ret[0].(*types.MsgDisableRefundResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DisableRefund indicates an expected call of DisableRefund. +func (mr *MockPaymentMsgServerMockRecorder) DisableRefund(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DisableRefund", reflect.TypeOf((*MockPaymentMsgServer)(nil).DisableRefund), arg0, arg1) +} + +// Withdraw mocks base method. +func (m *MockPaymentMsgServer) Withdraw(arg0 context.Context, arg1 *types.MsgWithdraw) (*types.MsgWithdrawResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Withdraw", arg0, arg1) + ret0, _ := ret[0].(*types.MsgWithdrawResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Withdraw indicates an expected call of Withdraw. +func (mr *MockPaymentMsgServerMockRecorder) Withdraw(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Withdraw", reflect.TypeOf((*MockPaymentMsgServer)(nil).Withdraw), arg0, arg1) +} + +// MockStorageMsgServer is a mock of StorageMsgServer interface. +type MockStorageMsgServer struct { + ctrl *gomock.Controller + recorder *MockStorageMsgServerMockRecorder +} + +// MockStorageMsgServerMockRecorder is the mock recorder for MockStorageMsgServer. +type MockStorageMsgServerMockRecorder struct { + mock *MockStorageMsgServer +} + +// NewMockStorageMsgServer creates a new mock instance. +func NewMockStorageMsgServer(ctrl *gomock.Controller) *MockStorageMsgServer { + mock := &MockStorageMsgServer{ctrl: ctrl} + mock.recorder = &MockStorageMsgServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockStorageMsgServer) EXPECT() *MockStorageMsgServerMockRecorder { + return m.recorder +} + +// CancelMigrateBucket mocks base method. +func (m *MockStorageMsgServer) CancelMigrateBucket(arg0 context.Context, arg1 *MsgCancelMigrateBucket) (*MsgCancelMigrateBucketResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CancelMigrateBucket", arg0, arg1) + ret0, _ := ret[0].(*MsgCancelMigrateBucketResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CancelMigrateBucket indicates an expected call of CancelMigrateBucket. +func (mr *MockStorageMsgServerMockRecorder) CancelMigrateBucket(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CancelMigrateBucket", reflect.TypeOf((*MockStorageMsgServer)(nil).CancelMigrateBucket), arg0, arg1) +} + +// CopyObject mocks base method. +func (m *MockStorageMsgServer) CopyObject(arg0 context.Context, arg1 *MsgCopyObject) (*MsgCopyObjectResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CopyObject", arg0, arg1) + ret0, _ := ret[0].(*MsgCopyObjectResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CopyObject indicates an expected call of CopyObject. +func (mr *MockStorageMsgServerMockRecorder) CopyObject(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CopyObject", reflect.TypeOf((*MockStorageMsgServer)(nil).CopyObject), arg0, arg1) +} + +// MigrateBucket mocks base method. +func (m *MockStorageMsgServer) MigrateBucket(arg0 context.Context, arg1 *MsgMigrateBucket) (*MsgMigrateBucketResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MigrateBucket", arg0, arg1) + ret0, _ := ret[0].(*MsgMigrateBucketResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MigrateBucket indicates an expected call of MigrateBucket. +func (mr *MockStorageMsgServerMockRecorder) MigrateBucket(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MigrateBucket", reflect.TypeOf((*MockStorageMsgServer)(nil).MigrateBucket), arg0, arg1) +} + +// SetBucketFlowRateLimit mocks base method. +func (m *MockStorageMsgServer) SetBucketFlowRateLimit(arg0 context.Context, arg1 *MsgSetBucketFlowRateLimit) (*MsgSetBucketFlowRateLimitResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBucketFlowRateLimit", arg0, arg1) + ret0, _ := ret[0].(*MsgSetBucketFlowRateLimitResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetBucketFlowRateLimit indicates an expected call of SetBucketFlowRateLimit. +func (mr *MockStorageMsgServerMockRecorder) SetBucketFlowRateLimit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBucketFlowRateLimit", reflect.TypeOf((*MockStorageMsgServer)(nil).SetBucketFlowRateLimit), arg0, arg1) +} + +// SetTag mocks base method. +func (m *MockStorageMsgServer) SetTag(arg0 context.Context, arg1 *MsgSetTag) (*MsgSetTagResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTag", arg0, arg1) + ret0, _ := ret[0].(*MsgSetTagResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetTag indicates an expected call of SetTag. +func (mr *MockStorageMsgServerMockRecorder) SetTag(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTag", reflect.TypeOf((*MockStorageMsgServer)(nil).SetTag), arg0, arg1) +} + +// ToggleSPAsDelegatedAgent mocks base method. +func (m *MockStorageMsgServer) ToggleSPAsDelegatedAgent(arg0 context.Context, arg1 *MsgToggleSPAsDelegatedAgent) (*MsgToggleSPAsDelegatedAgentResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ToggleSPAsDelegatedAgent", arg0, arg1) + ret0, _ := ret[0].(*MsgToggleSPAsDelegatedAgentResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ToggleSPAsDelegatedAgent indicates an expected call of ToggleSPAsDelegatedAgent. +func (mr *MockStorageMsgServerMockRecorder) ToggleSPAsDelegatedAgent(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ToggleSPAsDelegatedAgent", reflect.TypeOf((*MockStorageMsgServer)(nil).ToggleSPAsDelegatedAgent), arg0, arg1) +} + +// UpdateBucketInfo mocks base method. +func (m *MockStorageMsgServer) UpdateBucketInfo(arg0 context.Context, arg1 *MsgUpdateBucketInfo) (*MsgUpdateBucketInfoResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateBucketInfo", arg0, arg1) + ret0, _ := ret[0].(*MsgUpdateBucketInfoResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateBucketInfo indicates an expected call of UpdateBucketInfo. +func (mr *MockStorageMsgServerMockRecorder) UpdateBucketInfo(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateBucketInfo", reflect.TypeOf((*MockStorageMsgServer)(nil).UpdateBucketInfo), arg0, arg1) +} + +// UpdateGroupExtra mocks base method. +func (m *MockStorageMsgServer) UpdateGroupExtra(arg0 context.Context, arg1 *MsgUpdateGroupExtra) (*MsgUpdateGroupExtraResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateGroupExtra", arg0, arg1) + ret0, _ := ret[0].(*MsgUpdateGroupExtraResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateGroupExtra indicates an expected call of UpdateGroupExtra. +func (mr *MockStorageMsgServerMockRecorder) UpdateGroupExtra(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGroupExtra", reflect.TypeOf((*MockStorageMsgServer)(nil).UpdateGroupExtra), arg0, arg1) +} + +// UpdateObjectInfo mocks base method. +func (m *MockStorageMsgServer) UpdateObjectInfo(arg0 context.Context, arg1 *MsgUpdateObjectInfo) (*MsgUpdateObjectInfoResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateObjectInfo", arg0, arg1) + ret0, _ := ret[0].(*MsgUpdateObjectInfoResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateObjectInfo indicates an expected call of UpdateObjectInfo. +func (mr *MockStorageMsgServerMockRecorder) UpdateObjectInfo(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateObjectInfo", reflect.TypeOf((*MockStorageMsgServer)(nil).UpdateObjectInfo), arg0, arg1) +}