From 6e8fb98951feee0379d4a7c37b4fe25d5faf3189 Mon Sep 17 00:00:00 2001 From: dylanhuang Date: Tue, 8 Aug 2023 14:58:58 +0800 Subject: [PATCH 1/2] feat: group member expiration (#374) * feat: group member expiration * fix: missing group members id for query function * fix: post check if the operator has not been expired * fix: allow add group member without expiration from corss-chain package * chore: add export_validator to localup.sh * chore: fix upgrade name * chore: fix proto format * fix: resolve comments * chore: add annotation to maxTimeStampSeconds * chore: refine the maxTimeStamp * chore: fix go.sum * fix: remove NagquUpgrade * refactor: group member's expiration time process flow * chore: fix lint and proto error * chore: gen swagger * chore: fix e2e * chore: fix comments * chore: fix mockgen version * chore: fix swagger * chore: fix e2e test * fix: correct the VerifyPolicy * fixup! fix: correct the VerifyPolicy --- .github/workflows/buf.yml | 4 + Makefile | 1 + deployment/localup/localup.sh | 16 + deployment/readme.md | 11 + e2e/tests/permission_test.go | 45 +- e2e/tests/storage_test.go | 97 +- go.mod | 13 +- go.sum | 29 +- proto/greenfield/permission/types.proto | 5 + proto/greenfield/storage/events.proto | 36 +- proto/greenfield/storage/tx.proto | 36 +- swagger/static/swagger.yaml | 14 + x/permission/keeper/keeper.go | 24 +- x/permission/types/types.pb.go | 119 +- x/storage/client/cli/flags.go | 1 - x/storage/client/cli/tx.go | 130 ++- x/storage/keeper/cross_app_group.go | 52 +- x/storage/keeper/grpc_query.go | 1 + x/storage/keeper/keeper.go | 84 +- x/storage/keeper/msg_server.go | 47 +- x/storage/types/crosschain.go | 47 +- x/storage/types/errors.go | 50 +- x/storage/types/events.pb.go | 978 +++++++++++++---- x/storage/types/expected_keepers.go | 5 +- x/storage/types/expected_keepers_mocks.go | 46 +- x/storage/types/message.go | 100 +- x/storage/types/message_test.go | 53 +- x/storage/types/options.go | 16 +- x/storage/types/tx.pb.go | 1219 ++++++++++++++++----- 29 files changed, 2574 insertions(+), 705 deletions(-) diff --git a/.github/workflows/buf.yml b/.github/workflows/buf.yml index 00e3c809b..67052077c 100644 --- a/.github/workflows/buf.yml +++ b/.github/workflows/buf.yml @@ -14,6 +14,9 @@ on: jobs: protobuf-check: + strategy: + matrix: + go-version: [1.20.x] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -26,6 +29,7 @@ jobs: - name: Test protobuf changes generates new go files run: | export PATH="$PATH:$(go env GOPATH)/bin" + go mod tidy make tools proto-gen-check - name: Test protobuf swagger changes run: | diff --git a/Makefile b/Makefile index f9653fbf1..08d2fb68b 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ format: tools: go install github.com/cosmos/gogoproto/protoc-gen-gocosmos go install github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway + go install github.com/golang/mock/mockgen@v1.6.0 proto-gen: cd proto && buf generate && cp -r github.com/bnb-chain/greenfield/x/* ../x && cp -r github.com/bnb-chain/greenfield/types/* ../types && rm -rf github.com && go mod tidy diff --git a/deployment/localup/localup.sh b/deployment/localup/localup.sh index f4fe16708..c3627c2c1 100644 --- a/deployment/localup/localup.sh +++ b/deployment/localup/localup.sh @@ -248,6 +248,18 @@ function generate_sp_genesis { ${bin} collect-spgentxs --gentx-dir ${workspace}/.local/validator0/config/gensptx --home ${workspace}/.local/validator0 } +function export_validator { + size=$1 + + for ((i = 0; i < ${size}; i++)); do + bls_priv_key=("$(echo "y" | ${bin} keys export validator_bls${i} --unarmored-hex --unsafe --keyring-backend test --home ${workspace}/.local/validator${i})") + relayer_key=("$(echo "y" | ${bin} keys export relayer${i} --unarmored-hex --unsafe --keyring-backend test --home ${workspace}/.local/relayer${i})") + + echo "validator_bls${i} bls_priv_key: ${bls_priv_key}" + echo "relayer${i} relayer_key: ${relayer_key}" + done +} + function export_sps { size=$1 sp_size=1 @@ -312,6 +324,10 @@ generate) export_sps) export_sps $SIZE $SP_SIZE ;; + +export_validator) + export_validator $SIZE + ;; start) echo "===== start ====" start $SIZE diff --git a/deployment/readme.md b/deployment/readme.md index 546995e53..8fbc86068 100644 --- a/deployment/readme.md +++ b/deployment/readme.md @@ -86,6 +86,17 @@ bash ./deployment/localup/localup.sh stop 3. Send Tx ```bash +VALIDATOR=$(./build/bin/gnfd keys show validator0 -a --home ./deployment/localup/.local/validator0 --keyring-backend test) +GROUP_NAME="admin2" + +./build/bin/gnfd tx storage create-group $GROUP_NAME --from validator0 --home ./deployment/localup/.local/validator0 --keyring-backend test --node http://localhost:26750 -b sync + +./build/bin/gnfd tx storage update-group-member $GROUP_NAME "0xfABDd8b607201667fE54054CB4AD9068Afa2993e,0xba8dde27ddc0f39041a1d9a4efd24b5b5d81fe17" "1691118864,2691118864" "" --from validator0 --home ./deployment/localup/.local/validator0 --keyring-backend test --node http://localhost:26750 -b sync +./build/bin/gnfd tx storage renew-group-member $GROUP_NAME 0xfABDd8b607201667fE54054CB4AD9068Afa2993e 1791118864 --from validator0 --home ./deployment/localup/.local/validator0 --keyring-backend test --node http://localhost:26750 -b sync + +./build/bin/gnfd q storage head-group-member $VALIDATOR $GROUP_NAME 0xfABDd8b607201667fE54054CB4AD9068Afa2993e --node http://localhost:26750 +./build/bin/gnfd q storage head-group-member $VALIDATOR $GROUP_NAME 0xba8dde27ddc0f39041a1d9a4efd24b5b5d81fe17 --node http://localhost:26750 + ./build/bin/gnfd tx bank send validator0 0x32Ff14Fa1547314b95991976DB432F9Aa648A423 500000000000000000000BNB --home ./deployment/localup/.local/validator0 --keyring-backend test --node http://localhost:26750 -b sync ``` diff --git a/e2e/tests/permission_test.go b/e2e/tests/permission_test.go index aad76dd6e..3829058f3 100644 --- a/e2e/tests/permission_test.go +++ b/e2e/tests/permission_test.go @@ -671,9 +671,15 @@ func (s *StorageTestSuite) TestGrantsPermissionToGroup() { // Create Group testGroupName := "testGroup" - msgCreateGroup := storagetypes.NewMsgCreateGroup(user[0].GetAddr(), testGroupName, []sdk.AccAddress{user[1].GetAddr()}, "") + msgCreateGroup := storagetypes.NewMsgCreateGroup(user[0].GetAddr(), testGroupName, "") s.SendTxBlock(user[0], msgCreateGroup) + membersToAdd := []*storagetypes.MsgGroupMember{ + {Member: user[1].GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}} + membersToDelete := []sdk.AccAddress{} + msgUpdateGroupMember := storagetypes.NewMsgUpdateGroupMember(user[0].GetAddr(), user[0].GetAddr(), testGroupName, membersToAdd, membersToDelete) + s.SendTxBlock(user[0], msgUpdateGroupMember) + // Head Group headGroupRequest := storagetypes.QueryHeadGroupRequest{GroupOwner: user[0].GetAddr().String(), GroupName: testGroupName} headGroupResponse, err := s.Client.HeadGroup(ctx, &headGroupRequest) @@ -1168,10 +1174,14 @@ func (s *StorageTestSuite) TestDeleteGroupPolicy() { // Create Group testGroupName := "testGroup" - msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, - []sdk.AccAddress{user[1].GetAddr(), user[2].GetAddr(), user[3].GetAddr()}, - "") + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, "") s.SendTxBlock(owner, msgCreateGroup) + membersToAdd := []*storagetypes.MsgGroupMember{ + {Member: user[1].GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}, + {Member: user[2].GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}} + membersToDelete := []sdk.AccAddress{} + msgUpdateGroupMember := storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), testGroupName, membersToAdd, membersToDelete) + s.SendTxBlock(owner, msgUpdateGroupMember) // Head Group headGroupRequest := storagetypes.QueryHeadGroupRequest{GroupOwner: owner.GetAddr().String(), GroupName: testGroupName} @@ -1219,8 +1229,13 @@ func (s *StorageTestSuite) TestStalePermissionForGroupGC() { // Create Group testGroupName := "testGroup" - msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, []sdk.AccAddress{user[0].GetAddr(), user[1].GetAddr(), user[2].GetAddr()}, "") + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, "") s.SendTxBlock(owner, msgCreateGroup) + membersToAdd := []*storagetypes.MsgGroupMember{ + {Member: user[1].GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}} + membersToDelete := []sdk.AccAddress{} + msgUpdateGroupMember := storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), testGroupName, membersToAdd, membersToDelete) + s.SendTxBlock(owner, msgUpdateGroupMember) // Head Group headGroupRequest := storagetypes.QueryHeadGroupRequest{GroupOwner: owner.GetAddr().String(), GroupName: testGroupName} @@ -1316,10 +1331,14 @@ func (s *StorageTestSuite) TestGroupMembersAndPolicyGC() { // Create Group testGroupName := "testGroup" - msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, - []sdk.AccAddress{user[1].GetAddr(), user[2].GetAddr(), user[3].GetAddr()}, - "") + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, "") s.SendTxBlock(owner, msgCreateGroup) + membersToAdd := []*storagetypes.MsgGroupMember{ + {Member: user[1].GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}, + {Member: user[2].GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}} + membersToDelete := []sdk.AccAddress{} + msgUpdateGroupMember := storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), testGroupName, membersToAdd, membersToDelete) + s.SendTxBlock(owner, msgUpdateGroupMember) // Head Group headGroupRequest := storagetypes.QueryHeadGroupRequest{GroupOwner: owner.GetAddr().String(), GroupName: testGroupName} @@ -1489,10 +1508,14 @@ func (s *StorageTestSuite) TestUpdateGroupExtraWithPermission() { // Create Group testGroupName := "testGroup" - msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, - []sdk.AccAddress{user[1].GetAddr(), user[2].GetAddr(), user[3].GetAddr()}, - "") + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, "") s.SendTxBlock(owner, msgCreateGroup) + membersToAdd := []*storagetypes.MsgGroupMember{ + {Member: user[1].GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}, + {Member: user[2].GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}} + membersToDelete := []sdk.AccAddress{} + msgUpdateGroupMember := storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), testGroupName, membersToAdd, membersToDelete) + s.SendTxBlock(owner, msgUpdateGroupMember) // Head Group headGroupRequest := storagetypes.QueryHeadGroupRequest{GroupOwner: owner.GetAddr().String(), GroupName: testGroupName} diff --git a/e2e/tests/storage_test.go b/e2e/tests/storage_test.go index 49bb2ab90..8c491658e 100644 --- a/e2e/tests/storage_test.go +++ b/e2e/tests/storage_test.go @@ -276,7 +276,7 @@ func (s *StorageTestSuite) TestCreateGroup() { groupName := storageutils.GenRandomGroupName() // 1. CreateGroup - msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, []sdk.AccAddress{member.GetAddr()}, "") + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, "") s.SendTxBlock(owner, msgCreateGroup) s.T().Logf("CerateGroup success, owner: %s, group name: %s", owner.GetAddr().String(), groupName) @@ -300,7 +300,14 @@ func (s *StorageTestSuite) TestCreateGroup() { s.Require().NoError(err) s.Require().GreaterOrEqual(len(queryListGroupResp.GroupInfos), 1) - // 3. HeadGroupMember + // 4. UpdateGroupMember(add) + membersToAdd := []*storagetypes.MsgGroupMember{ + {Member: member.GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}} + membersToDelete := []sdk.AccAddress{} + msgUpdateGroupMember := storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), groupName, membersToAdd, membersToDelete) + s.SendTxBlock(owner, msgUpdateGroupMember) + + // 4-1. HeadGroupMember(add) queryHeadGroupMemberReq := storagetypes.QueryHeadGroupMemberRequest{ Member: member.GetAddr().String(), GroupName: groupName, @@ -310,14 +317,15 @@ func (s *StorageTestSuite) TestCreateGroup() { s.Require().NoError(err) s.Require().Equal(queryHeadGroupMemberResp.GroupMember.GroupId, queryHeadGroupResp.GroupInfo.Id) - // 4. UpdateGroupMember + // 5. UpdateGroupMember(delete) member2 := s.GenAndChargeAccounts(1, 1000000)[0] - membersToAdd := []sdk.AccAddress{member2.GetAddr()} - membersToDelete := []sdk.AccAddress{member.GetAddr()} - msgUpdateGroupMember := storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), groupName, membersToAdd, membersToDelete) + membersToAdd = []*storagetypes.MsgGroupMember{ + {Member: member2.GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}} + membersToDelete = []sdk.AccAddress{member.GetAddr()} + msgUpdateGroupMember = storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), groupName, membersToAdd, membersToDelete) s.SendTxBlock(owner, msgUpdateGroupMember) - // 5. HeadGroupMember (delete) + // 5-1. HeadGroupMember (delete) queryHeadGroupMemberReqDelete := storagetypes.QueryHeadGroupMemberRequest{ Member: member.GetAddr().String(), GroupName: groupName, @@ -325,18 +333,9 @@ func (s *StorageTestSuite) TestCreateGroup() { } _, err = s.Client.HeadGroupMember(ctx, &queryHeadGroupMemberReqDelete) s.Require().True(strings.Contains(err.Error(), storagetypes.ErrNoSuchGroupMember.Error())) - // 5. HeadGroupMember (add) - queryHeadGroupMemberReqAdd := storagetypes.QueryHeadGroupMemberRequest{ - Member: member2.GetAddr().String(), - GroupName: groupName, - GroupOwner: owner.GetAddr().String(), - } - queryHeadGroupMemberRespAdd, err := s.Client.HeadGroupMember(ctx, &queryHeadGroupMemberReqAdd) - s.Require().NoError(err) - s.Require().Equal(queryHeadGroupMemberRespAdd.GroupMember.GroupId, queryHeadGroupResp.GroupInfo.Id) // 6. Create a group with the same name - msgCreateGroup = storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, []sdk.AccAddress{member.GetAddr()}, "") + msgCreateGroup = storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, "") s.SendTxBlockWithExpectErrorString(msgCreateGroup, owner, "exists") } @@ -348,9 +347,14 @@ func (s *StorageTestSuite) TestLeaveGroup() { groupName := storageutils.GenRandomGroupName() // 1. CreateGroup - msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, []sdk.AccAddress{member.GetAddr()}, "") + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, "") s.SendTxBlock(owner, msgCreateGroup) s.T().Logf("CerateGroup success, owner: %s, group name: %s", owner.GetAddr().String(), groupName) + membersToAdd := []*storagetypes.MsgGroupMember{ + {Member: member.GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}} + membersToDelete := []sdk.AccAddress{} + msgUpdateGroupMember := storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), groupName, membersToAdd, membersToDelete) + s.SendTxBlock(owner, msgUpdateGroupMember) // 2. HeadGroup queryHeadGroupReq := storagetypes.QueryHeadGroupRequest{GroupOwner: owner.GetAddr().String(), GroupName: groupName} @@ -384,9 +388,10 @@ func (s *StorageTestSuite) TestLeaveGroup() { // 4. UpdateGroupMember member2 := s.GenAndChargeAccounts(1, 1000000)[0] - membersToAdd := []sdk.AccAddress{member2.GetAddr()} - membersToDelete := []sdk.AccAddress{member.GetAddr()} - msgUpdateGroupMember := storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), groupName, membersToAdd, membersToDelete) + membersToAdd = []*storagetypes.MsgGroupMember{ + {Member: member2.GetAddr().String(), ExpirationTime: storagetypes.MaxTimeStamp}} + membersToDelete = []sdk.AccAddress{member.GetAddr()} + msgUpdateGroupMember = storagetypes.NewMsgUpdateGroupMember(owner.GetAddr(), owner.GetAddr(), groupName, membersToAdd, membersToDelete) s.SendTxBlock(owner, msgUpdateGroupMember) // 5. leave group @@ -692,11 +697,10 @@ func (s *StorageTestSuite) TestMirrorGroup() { ctx := context.Background() owner := s.GenAndChargeAccounts(1, 1000000)[0] - member := s.GenAndChargeAccounts(1, 1000000)[0] groupName := storageutils.GenRandomGroupName() // 1. CreateGroup - msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, []sdk.AccAddress{member.GetAddr()}, "") + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, "") s.SendTxBlock(owner, msgCreateGroup) s.T().Logf("CerateGroup success, owner: %s, group name: %s", owner.GetAddr().String(), groupName) @@ -713,7 +717,7 @@ func (s *StorageTestSuite) TestMirrorGroup() { // CreateGroup groupName = storageutils.GenRandomGroupName() - msgCreateGroup = storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, []sdk.AccAddress{member.GetAddr()}, "") + msgCreateGroup = storagetypes.NewMsgCreateGroup(owner.GetAddr(), groupName, "") s.SendTxBlock(owner, msgCreateGroup) // MirrorGroup using name @@ -1488,10 +1492,10 @@ func (s *StorageTestSuite) TestCreateAndUpdateGroupExtraField() { ctx := context.Background() owner := s.GenAndChargeAccounts(1, 1000000)[0] - // Create a group without members + // Create a group testGroupName := "appName/bucketName" extra := "{\"description\":\"no description\",\"imageUrl\":\"www.images.com/image1\"}" - msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, nil, extra) + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, extra) s.SendTxBlock(owner, msgCreateGroup) // Head Group @@ -1532,6 +1536,47 @@ func (s *StorageTestSuite) TestCreateAndUpdateGroupExtraField() { s.T().Logf("GroupInfo: %s", headGroupResponse.GetGroupInfo().String()) } +func (s *StorageTestSuite) TestCreateAndRenewGroup() { + var err error + ctx := context.Background() + owner := s.GenAndChargeAccounts(1, 1000000)[0] + member := s.GenAndChargeAccounts(1, 1000000)[0] + + // Create a group + testGroupName := "appName/bucketName" + extra := "{\"description\":\"no description\",\"imageUrl\":\"www.images.com/image1\"}" + msgCreateGroup := storagetypes.NewMsgCreateGroup(owner.GetAddr(), testGroupName, extra) + s.SendTxBlock(owner, msgCreateGroup) + s.T().Logf("CerateGroup success, owner: %s, group name: %s", owner.GetAddr().String(), testGroupName) + + // Head Group + headGroupRequest := storagetypes.QueryHeadGroupRequest{GroupOwner: owner.GetAddr().String(), GroupName: testGroupName} + headGroupResponse, err := s.Client.HeadGroup(ctx, &headGroupRequest) + s.Require().NoError(err) + s.Require().Equal(headGroupResponse.GroupInfo.GroupName, testGroupName) + s.Require().True(owner.GetAddr().Equals(sdk.MustAccAddressFromHex(headGroupResponse.GroupInfo.Owner))) + s.Require().Equal(headGroupResponse.GroupInfo.Extra, extra) + + // Renew GroupMember + expiration, err := time.Parse(time.RFC3339, "2022-12-31T23:59:59Z") + s.Require().NoError(err) + members := []*storagetypes.MsgGroupMember{ + {Member: member.GetAddr().String(), ExpirationTime: expiration}} + msgUpdateGroupMember := storagetypes.NewMsgRenewGroupMember(owner.GetAddr(), owner.GetAddr(), testGroupName, members) + s.SendTxBlock(owner, msgUpdateGroupMember) + + // Head GroupMember + queryHeadGroupMemberReq := storagetypes.QueryHeadGroupMemberRequest{ + Member: member.GetAddr().String(), + GroupName: testGroupName, + GroupOwner: owner.GetAddr().String(), + } + queryHeadGroupMemberResp, err := s.Client.HeadGroupMember(ctx, &queryHeadGroupMemberReq) + s.Require().NoError(err) + s.Require().Equal(queryHeadGroupMemberResp.GroupMember.GroupId, headGroupResponse.GroupInfo.Id) + s.Require().True(queryHeadGroupMemberResp.GroupMember.ExpirationTime.Equal(expiration)) +} + func (s *StorageTestSuite) TestRejectSealObject() { var err error // CreateBucket diff --git a/go.mod b/go.mod index 30740871a..5e9ff92eb 100644 --- a/go.mod +++ b/go.mod @@ -157,12 +157,13 @@ require ( github.com/zondax/hid v0.9.1 // indirect github.com/zondax/ledger-go v0.14.1 // indirect go.etcd.io/bbolt v1.3.7 // indirect - golang.org/x/crypto v0.9.0 // indirect + golang.org/x/crypto v0.10.0 // indirect golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/net v0.11.0 // indirect + golang.org/x/sys v0.9.0 // indirect + golang.org/x/term v0.9.0 // indirect + golang.org/x/text v0.10.0 // indirect + golang.org/x/tools v0.10.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect @@ -176,7 +177,7 @@ replace ( github.com/cometbft/cometbft => github.com/bnb-chain/greenfield-cometbft v0.0.2-alpha.2 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 v0.2.3-alpha.3.0.20230803020148-9216a6aea390 + github.com/cosmos/cosmos-sdk => github.com/bnb-chain/greenfield-cosmos-sdk v0.2.3-alpha.3.0.20230807083232-9a0d3b09e97f github.com/cosmos/iavl => github.com/bnb-chain/greenfield-iavl v0.20.1-alpha.1 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) diff --git a/go.sum b/go.sum index 82c607fbf..9d042109b 100644 --- a/go.sum +++ b/go.sum @@ -163,8 +163,8 @@ github.com/bnb-chain/greenfield-cometbft v0.0.2-alpha.2 h1:ys9kmgtRx04wcCextE6Cr github.com/bnb-chain/greenfield-cometbft v0.0.2-alpha.2/go.mod h1:EBmwmUdaNbGPyGjf1cMuoN3pAeM2tQu7Lfg95813EAw= 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 v0.2.3-alpha.3.0.20230803020148-9216a6aea390 h1:tuXCEm4WHJ/7mhYM9Nqq5z+Qu96xsSZ6pqw0LE0+Fqo= -github.com/bnb-chain/greenfield-cosmos-sdk v0.2.3-alpha.3.0.20230803020148-9216a6aea390/go.mod h1:hpvg93+VGXHAcv/pVVdp24Ik/9miw4uRh8+tD0DDYas= +github.com/bnb-chain/greenfield-cosmos-sdk v0.2.3-alpha.3.0.20230807083232-9a0d3b09e97f h1:3rBKrvNg2PXJUgkyZMgf2x8l6/7UWD1qGUgOTL7WmAk= +github.com/bnb-chain/greenfield-cosmos-sdk v0.2.3-alpha.3.0.20230807083232-9a0d3b09e97f/go.mod h1:hpvg93+VGXHAcv/pVVdp24Ik/9miw4uRh8+tD0DDYas= github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230425074444-eb5869b05fe9 h1:6fLpmmI0EZvDTfPvI0zy5dBaaTUboHnEkoC5/p/w8TQ= github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230425074444-eb5869b05fe9/go.mod h1:rbc4o84RSEvhf09o2+4Qiazsv0snRJLiEZdk17HeIDw= github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230425074444-eb5869b05fe9 h1:1ZdK+iR1Up02bOa2YTZCml7PBpP//kcdamOcK6aWO/s= @@ -1502,8 +1502,8 @@ golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1548,7 +1548,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1613,8 +1613,8 @@ golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1749,13 +1749,13 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1766,8 +1766,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1842,7 +1842,8 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= +golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= +golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/proto/greenfield/permission/types.proto b/proto/greenfield/permission/types.proto index 7fc819bfb..143e347e1 100644 --- a/proto/greenfield/permission/types.proto +++ b/proto/greenfield/permission/types.proto @@ -71,4 +71,9 @@ message GroupMember { ]; // member is the account address of the member string member = 3 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + // expiration_time defines the expiration time of the group member + google.protobuf.Timestamp expiration_time = 4 [ + (gogoproto.stdtime) = true, + (gogoproto.nullable) = false + ]; } diff --git a/proto/greenfield/storage/events.proto b/proto/greenfield/storage/events.proto index 527da5f34..2f91cd047 100644 --- a/proto/greenfield/storage/events.proto +++ b/proto/greenfield/storage/events.proto @@ -3,6 +3,7 @@ package greenfield.storage; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; import "greenfield/storage/common.proto"; import "greenfield/storage/types.proto"; @@ -284,10 +285,8 @@ message EventCreateGroup { ]; // source_type define the source of the group. CrossChain or Greenfield origin SourceType source_type = 4; - // members define the all the address of the members. - repeated string members = 5 [(cosmos_proto.scalar) = "cosmos.AddressString"]; // extra defines extra info for the group - string extra = 6; + string extra = 5; } // EventDeleteGroup is emitted on MsgDeleteGroup @@ -335,11 +334,40 @@ message EventUpdateGroupMember { (gogoproto.nullable) = false ]; // members_to_add defines all the members to be added to the group - repeated string members_to_add = 5 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + repeated EventGroupMemberDetail members_to_add = 5; // members_to_add defines all the members to be deleted from the group repeated string members_to_delete = 6 [(cosmos_proto.scalar) = "cosmos.AddressString"]; } +message EventRenewGroupMember { + // operator define the account address of operator who update the group member + string operator = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + // owner define the account address of group owner + string owner = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + // group_name define the name of the group + string group_name = 3; + // id define an u256 id for group + string group_id = 4 [ + (cosmos_proto.scalar) = "cosmos.Uint", + (gogoproto.customtype) = "Uint", + (gogoproto.nullable) = false + ]; + // source_type define the source of the group. CrossChain or Greenfield origin + SourceType source_type = 5; + // members define the all the address of the members. + repeated EventGroupMemberDetail members = 6; +} + +message EventGroupMemberDetail { + // member defines the account address of the group member + string member = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + // expiration_time defines the expiration time of the group member + google.protobuf.Timestamp expiration_time = 2 [ + (gogoproto.stdtime) = true, + (gogoproto.nullable) = false + ]; +} + // EventUpdateGroupExtra is emitted on MsgUpdateGroupExtra message EventUpdateGroupExtra { // operator define the account address of operator who update the group member diff --git a/proto/greenfield/storage/tx.proto b/proto/greenfield/storage/tx.proto index 2537a7b70..ef9de2aaf 100644 --- a/proto/greenfield/storage/tx.proto +++ b/proto/greenfield/storage/tx.proto @@ -42,6 +42,7 @@ service Msg { rpc UpdateGroupExtra(MsgUpdateGroupExtra) returns (MsgUpdateGroupExtraResponse); rpc LeaveGroup(MsgLeaveGroup) returns (MsgLeaveGroupResponse); rpc MirrorGroup(MsgMirrorGroup) returns (MsgMirrorGroupResponse); + rpc RenewGroupMember(MsgRenewGroupMember) returns (MsgRenewGroupMemberResponse); // basic operation of policy rpc PutPolicy(MsgPutPolicy) returns (MsgPutPolicyResponse); @@ -274,11 +275,8 @@ message MsgCreateGroup { // group_name defines the name of the group. it's not globally unique. string group_name = 2; - // member_request defines a list of member which to be add or remove - repeated string members = 3 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - // extra defines extra info for the group - string extra = 4; + string extra = 3; } message MsgCreateGroupResponse { @@ -314,7 +312,7 @@ message MsgUpdateGroupMember { string group_name = 3; // members_to_add defines a list of members account address which will be add to the group - repeated string members_to_add = 4 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + repeated MsgGroupMember members_to_add = 4; // members_to_delete defines a list of members account address which will be remove from the group repeated string members_to_delete = 5 [(cosmos_proto.scalar) = "cosmos.AddressString"]; @@ -322,6 +320,34 @@ message MsgUpdateGroupMember { message MsgUpdateGroupMemberResponse {} +message MsgRenewGroupMember { + option (cosmos.msg.v1.signer) = "operator"; + + // operator defines the account address of the operator who has the UpdateGroupMember permission of the group. + string operator = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // group_owner defines the account address of the group owner + string group_owner = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // group_name defines the name of the group which to be updated + string group_name = 3; + + // members defines a list of members which will be renew to the group + repeated MsgGroupMember members = 4; +} + +message MsgRenewGroupMemberResponse {} + +message MsgGroupMember { + // member defines the account address of the group member + string member = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + // expiration_time defines the expiration time of the group member + google.protobuf.Timestamp expiration_time = 2 [ + (gogoproto.stdtime) = true, + (gogoproto.nullable) = false + ]; +} + message MsgUpdateGroupExtra { option (cosmos.msg.v1.signer) = "operator"; diff --git a/swagger/static/swagger.yaml b/swagger/static/swagger.yaml index 3cb9f0a63..a612b7c14 100644 --- a/swagger/static/swagger.yaml +++ b/swagger/static/swagger.yaml @@ -2826,6 +2826,12 @@ paths: member: type: string title: member is the account address of the member + expiration_time: + type: string + format: date-time + title: >- + expiration_time defines the expiration time of the group + member default: description: An unexpected error response. schema: @@ -33135,6 +33141,10 @@ definitions: member: type: string title: member is the account address of the member + expiration_time: + type: string + format: date-time + title: expiration_time defines the expiration time of the group member greenfield.permission.Policy: type: object properties: @@ -34083,6 +34093,10 @@ definitions: member: type: string title: member is the account address of the member + expiration_time: + type: string + format: date-time + title: expiration_time defines the expiration time of the group member greenfield.storage.QueryHeadGroupResponse: type: object properties: diff --git a/x/permission/keeper/keeper.go b/x/permission/keeper/keeper.go index d94e635ff..2a1055407 100644 --- a/x/permission/keeper/keeper.go +++ b/x/permission/keeper/keeper.go @@ -2,6 +2,7 @@ package keeper import ( "fmt" + "time" "cosmossdk.io/math" "github.com/cometbft/cometbft/libs/log" @@ -58,15 +59,16 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } -func (k Keeper) AddGroupMember(ctx sdk.Context, groupID math.Uint, member sdk.AccAddress) error { +func (k Keeper) AddGroupMember(ctx sdk.Context, groupID math.Uint, member sdk.AccAddress, expiration time.Time) error { store := ctx.KVStore(k.storeKey) memberKey := types.GetGroupMemberKey(groupID, member) if store.Has(memberKey) { return storagetypes.ErrGroupMemberAlreadyExists } groupMember := types.GroupMember{ - GroupId: groupID, - Member: member.String(), + GroupId: groupID, + Member: member.String(), + ExpirationTime: expiration, } id := k.groupMemberSeq.NextVal(store) store.Set(memberKey, id.Bytes()) @@ -74,6 +76,16 @@ func (k Keeper) AddGroupMember(ctx sdk.Context, groupID math.Uint, member sdk.Ac return nil } +func (k Keeper) UpdateGroupMember(ctx sdk.Context, groupID math.Uint, member sdk.AccAddress, memberID math.Uint, expiration time.Time) { + store := ctx.KVStore(k.storeKey) + groupMember := types.GroupMember{ + GroupId: groupID, + Member: member.String(), + ExpirationTime: expiration, + } + store.Set(types.GetGroupMemberByIDKey(memberID), k.cdc.MustMarshal(&groupMember)) +} + func (k Keeper) RemoveGroupMember(ctx sdk.Context, groupID math.Uint, member sdk.AccAddress) error { store := ctx.KVStore(k.storeKey) memberKey := types.GetGroupMemberKey(groupID, member) @@ -105,6 +117,7 @@ func (k Keeper) GetGroupMemberByID(ctx sdk.Context, groupMemberID math.Uint) (*t } var groupMember types.GroupMember k.cdc.MustUnmarshal(bz, &groupMember) + groupMember.Id = groupMemberID return &groupMember, true } @@ -283,8 +296,9 @@ func (k Keeper) VerifyPolicy(ctx sdk.Context, resourceID math.Uint, resourceType effect, newPolicy = p.Eval(action, ctx.BlockTime(), opts) if effect != types.EFFECT_UNSPECIFIED { // check the operator is the member of this group - _, memberFound := k.GetGroupMember(ctx, item.GroupId, operator) - if memberFound { + groupMember, memberFound := k.GetGroupMember(ctx, item.GroupId, operator) + if memberFound && groupMember.ExpirationTime.After(ctx.BlockTime().UTC()) { + // check if the operator has been revoked if effect == types.EFFECT_ALLOW { allowed = true } else if effect == types.EFFECT_DENY { diff --git a/x/permission/types/types.pb.go b/x/permission/types/types.pb.go index 341a415a1..d4cdca199 100644 --- a/x/permission/types/types.pb.go +++ b/x/permission/types/types.pb.go @@ -199,6 +199,8 @@ type GroupMember struct { GroupId Uint `protobuf:"bytes,2,opt,name=group_id,json=groupId,proto3,customtype=Uint" json:"group_id"` // member is the account address of the member Member string `protobuf:"bytes,3,opt,name=member,proto3" json:"member,omitempty"` + // expiration_time defines the expiration time of the group member + ExpirationTime time.Time `protobuf:"bytes,4,opt,name=expiration_time,json=expirationTime,proto3,stdtime" json:"expiration_time"` } func (m *GroupMember) Reset() { *m = GroupMember{} } @@ -241,6 +243,13 @@ func (m *GroupMember) GetMember() string { return "" } +func (m *GroupMember) GetExpirationTime() time.Time { + if m != nil { + return m.ExpirationTime + } + return time.Time{} +} + func init() { proto.RegisterType((*Policy)(nil), "greenfield.permission.Policy") proto.RegisterType((*PolicyGroup)(nil), "greenfield.permission.PolicyGroup") @@ -251,40 +260,41 @@ func init() { func init() { proto.RegisterFile("greenfield/permission/types.proto", fileDescriptor_0d2afeea9f743f03) } var fileDescriptor_0d2afeea9f743f03 = []byte{ - // 521 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xcf, 0x6a, 0x13, 0x41, - 0x1c, 0xc7, 0x33, 0x49, 0x1a, 0x93, 0x89, 0x56, 0x18, 0x2a, 0xac, 0x11, 0x36, 0x69, 0x2e, 0x06, + // 530 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x4f, 0x6b, 0x13, 0x41, + 0x18, 0xc6, 0x33, 0x69, 0x1a, 0x93, 0x89, 0x56, 0x18, 0x2a, 0xac, 0x11, 0x36, 0x69, 0x2e, 0x06, 0x24, 0xb3, 0x12, 0x41, 0x3c, 0xa8, 0x68, 0x0e, 0x4a, 0xc0, 0x42, 0xd9, 0xd6, 0x8b, 0x97, 0x90, - 0xdd, 0x9d, 0x6e, 0x07, 0x32, 0x7f, 0x98, 0x99, 0x40, 0xf2, 0x0e, 0x1e, 0xfa, 0x10, 0x3e, 0x42, - 0x9f, 0x41, 0x72, 0x2c, 0x3d, 0x89, 0x87, 0x28, 0xc9, 0x8b, 0xc8, 0xce, 0xee, 0x76, 0x03, 0x56, - 0xab, 0xbd, 0xcd, 0x6f, 0xf6, 0xf3, 0xfd, 0xcd, 0x77, 0xe6, 0x3b, 0x3b, 0x70, 0x3f, 0x56, 0x84, - 0xf0, 0x13, 0x4a, 0xa6, 0x91, 0x27, 0x89, 0x62, 0x54, 0x6b, 0x2a, 0xb8, 0x67, 0x16, 0x92, 0x68, - 0x2c, 0x95, 0x30, 0x02, 0x3d, 0x28, 0x10, 0x5c, 0x20, 0xad, 0x87, 0xa1, 0xd0, 0x4c, 0xe8, 0xb1, - 0x85, 0xbc, 0xb4, 0x48, 0x15, 0xad, 0xbd, 0x58, 0xc4, 0x22, 0x9d, 0x4f, 0x46, 0xd9, 0x6c, 0x3b, - 0x16, 0x22, 0x9e, 0x12, 0xcf, 0x56, 0xc1, 0xec, 0xc4, 0x33, 0x94, 0x11, 0x6d, 0x26, 0x4c, 0x66, - 0x40, 0xf7, 0x7a, 0x2f, 0xa1, 0x60, 0x4c, 0xf0, 0xab, 0x26, 0x05, 0xa3, 0x88, 0x16, 0x33, 0x15, - 0x92, 0x6d, 0xb7, 0xdd, 0xcf, 0x15, 0x58, 0x3b, 0x14, 0x53, 0x1a, 0x2e, 0xd0, 0x13, 0x58, 0xa6, - 0x91, 0x03, 0x3a, 0xa0, 0xd7, 0x18, 0x3e, 0x5a, 0xae, 0xda, 0xa5, 0xef, 0xab, 0x76, 0xf5, 0x23, - 0xe5, 0xe6, 0xf2, 0xbc, 0xdf, 0xcc, 0x0c, 0x27, 0xa5, 0x5f, 0xa6, 0x11, 0x7a, 0x0d, 0x1b, 0x52, - 0x51, 0x1e, 0x52, 0x39, 0x99, 0x3a, 0xe5, 0x0e, 0xe8, 0x35, 0x07, 0x1d, 0x7c, 0xed, 0xce, 0xf1, - 0x61, 0xce, 0xf9, 0x85, 0x04, 0xbd, 0x83, 0xf7, 0x72, 0x3f, 0xe3, 0xc4, 0x8f, 0x53, 0xe9, 0x80, - 0xde, 0xee, 0x60, 0x7f, 0xbb, 0x47, 0x0e, 0x60, 0x3f, 0x1b, 0x1c, 0x2f, 0x24, 0xf1, 0xef, 0xaa, - 0xad, 0x0a, 0xbd, 0x84, 0xcd, 0xab, 0x3e, 0x34, 0x72, 0xaa, 0x37, 0xbb, 0x87, 0x39, 0x3f, 0x8a, - 0xd0, 0x1b, 0x08, 0xb5, 0x99, 0x18, 0xc2, 0x08, 0x37, 0xda, 0xd9, 0xe9, 0x54, 0xfe, 0xb2, 0x8d, - 0xa3, 0x1c, 0xf4, 0xb7, 0x34, 0xe8, 0x00, 0xde, 0x27, 0x73, 0x49, 0xd5, 0xc4, 0x50, 0xc1, 0xc7, - 0x49, 0x44, 0x4e, 0xcd, 0x9e, 0x46, 0x0b, 0xa7, 0xf9, 0xe1, 0x3c, 0x3f, 0x7c, 0x9c, 0xe7, 0x37, - 0xac, 0x2f, 0x57, 0x6d, 0x70, 0xf6, 0xa3, 0x0d, 0xfc, 0xdd, 0x42, 0x9c, 0x7c, 0xee, 0x7e, 0x05, - 0xb0, 0x99, 0xc6, 0xf1, 0x5e, 0x89, 0x99, 0x44, 0xaf, 0xe0, 0x0e, 0x35, 0x84, 0x69, 0x07, 0x58, - 0x6f, 0x8f, 0xff, 0x74, 0xc4, 0x85, 0x04, 0x8f, 0x0c, 0x61, 0x7e, 0xaa, 0x6a, 0xcd, 0x61, 0x35, - 0x29, 0xd1, 0x0b, 0xd8, 0x90, 0x16, 0x19, 0xff, 0x5b, 0xc2, 0xf5, 0x94, 0x1e, 0x45, 0xe8, 0x39, - 0xac, 0xc7, 0x49, 0xdb, 0x44, 0x58, 0xbe, 0x59, 0x78, 0xc7, 0xc2, 0xa3, 0xa8, 0xfb, 0x05, 0xc0, - 0xa6, 0xf5, 0x73, 0x40, 0x58, 0x40, 0xd4, 0xff, 0x5d, 0xae, 0x5b, 0x2e, 0x8a, 0x9e, 0xc2, 0x1a, - 0xb3, 0xcb, 0xd9, 0xdb, 0xd4, 0x18, 0x3a, 0x97, 0xe7, 0xfd, 0xbd, 0x8c, 0x7c, 0x1b, 0x45, 0x8a, - 0x68, 0x7d, 0x64, 0x14, 0xe5, 0xb1, 0x9f, 0x71, 0xc3, 0x0f, 0xcb, 0xb5, 0x0b, 0x2e, 0xd6, 0x2e, - 0xf8, 0xb9, 0x76, 0xc1, 0xd9, 0xc6, 0x2d, 0x5d, 0x6c, 0xdc, 0xd2, 0xb7, 0x8d, 0x5b, 0xfa, 0x34, - 0x88, 0xa9, 0x39, 0x9d, 0x05, 0x38, 0x14, 0xcc, 0x0b, 0x78, 0xd0, 0x0f, 0x4f, 0x27, 0x94, 0x7b, - 0x5b, 0xbf, 0xd3, 0xfc, 0xb7, 0x07, 0x20, 0xa8, 0xd9, 0xac, 0x9f, 0xfd, 0x0a, 0x00, 0x00, 0xff, - 0xff, 0x6a, 0x25, 0x5b, 0x0a, 0x26, 0x04, 0x00, 0x00, + 0xdd, 0x9d, 0x6e, 0x07, 0x32, 0x7f, 0x98, 0x99, 0x40, 0xf2, 0x1d, 0x3c, 0xf4, 0xc3, 0xf4, 0x33, + 0x48, 0x8e, 0xa5, 0x27, 0xf1, 0x10, 0x25, 0xf9, 0x08, 0x7e, 0x01, 0xd9, 0xd9, 0xdd, 0x6e, 0xc0, + 0x68, 0xab, 0xb7, 0x79, 0x27, 0xbf, 0xe7, 0x7d, 0x9f, 0x99, 0x67, 0xb2, 0xf0, 0x20, 0x56, 0x84, + 0xf0, 0x53, 0x4a, 0x26, 0x91, 0x27, 0x89, 0x62, 0x54, 0x6b, 0x2a, 0xb8, 0x67, 0xe6, 0x92, 0x68, + 0x2c, 0x95, 0x30, 0x02, 0x3d, 0x28, 0x10, 0x5c, 0x20, 0xcd, 0x87, 0xa1, 0xd0, 0x4c, 0xe8, 0x91, + 0x85, 0xbc, 0xb4, 0x48, 0x15, 0xcd, 0xfd, 0x58, 0xc4, 0x22, 0xdd, 0x4f, 0x56, 0xd9, 0x6e, 0x2b, + 0x16, 0x22, 0x9e, 0x10, 0xcf, 0x56, 0xc1, 0xf4, 0xd4, 0x33, 0x94, 0x11, 0x6d, 0xc6, 0x4c, 0x66, + 0x40, 0x67, 0xbb, 0x97, 0x50, 0x30, 0x26, 0xf8, 0x75, 0x93, 0x82, 0x51, 0x44, 0x8b, 0xa9, 0x0a, + 0xc9, 0xa6, 0xdb, 0xce, 0xe7, 0x1d, 0x58, 0x3d, 0x12, 0x13, 0x1a, 0xce, 0xd1, 0x13, 0x58, 0xa6, + 0x91, 0x03, 0xda, 0xa0, 0x5b, 0x1f, 0x3c, 0x5a, 0x2c, 0x5b, 0xa5, 0x6f, 0xcb, 0x56, 0xe5, 0x23, + 0xe5, 0xe6, 0xea, 0xa2, 0xd7, 0xc8, 0x0c, 0x27, 0xa5, 0x5f, 0xa6, 0x11, 0x7a, 0x0d, 0xeb, 0x52, + 0x51, 0x1e, 0x52, 0x39, 0x9e, 0x38, 0xe5, 0x36, 0xe8, 0x36, 0xfa, 0x6d, 0xbc, 0xf5, 0xe4, 0xf8, + 0x28, 0xe7, 0xfc, 0x42, 0x82, 0xde, 0xc1, 0x7b, 0xb9, 0x9f, 0x51, 0xe2, 0xc7, 0xd9, 0x69, 0x83, + 0xee, 0x5e, 0xff, 0x60, 0xb3, 0x47, 0x0e, 0x60, 0x3f, 0x5b, 0x9c, 0xcc, 0x25, 0xf1, 0xef, 0xaa, + 0x8d, 0x0a, 0xbd, 0x84, 0x8d, 0xeb, 0x3e, 0x34, 0x72, 0x2a, 0x37, 0xbb, 0x87, 0x39, 0x3f, 0x8c, + 0xd0, 0x1b, 0x08, 0xb5, 0x19, 0x1b, 0xc2, 0x08, 0x37, 0xda, 0xd9, 0x6d, 0xef, 0xfc, 0xe5, 0x18, + 0xc7, 0x39, 0xe8, 0x6f, 0x68, 0xd0, 0x21, 0xbc, 0x4f, 0x66, 0x92, 0xaa, 0xb1, 0xa1, 0x82, 0x8f, + 0x92, 0x88, 0x9c, 0xaa, 0xbd, 0x8d, 0x26, 0x4e, 0xf3, 0xc3, 0x79, 0x7e, 0xf8, 0x24, 0xcf, 0x6f, + 0x50, 0x5b, 0x2c, 0x5b, 0xe0, 0xfc, 0x7b, 0x0b, 0xf8, 0x7b, 0x85, 0x38, 0xf9, 0xb9, 0xf3, 0x05, + 0xc0, 0x46, 0x1a, 0xc7, 0x7b, 0x25, 0xa6, 0x12, 0xbd, 0x82, 0xbb, 0xd4, 0x10, 0xa6, 0x1d, 0x60, + 0xbd, 0x3d, 0xfe, 0xd3, 0x15, 0x17, 0x12, 0x3c, 0x34, 0x84, 0xf9, 0xa9, 0xaa, 0x39, 0x83, 0x95, + 0xa4, 0x44, 0x2f, 0x60, 0x5d, 0x5a, 0x64, 0x74, 0xbb, 0x84, 0x6b, 0x29, 0x3d, 0x8c, 0xd0, 0x73, + 0x58, 0x8b, 0x93, 0xb6, 0x89, 0xb0, 0x7c, 0xb3, 0xf0, 0x8e, 0x85, 0x87, 0x51, 0xe7, 0x27, 0x80, + 0x0d, 0xeb, 0xe7, 0x90, 0xb0, 0x80, 0xa8, 0x7f, 0x7b, 0x5c, 0xff, 0x39, 0x14, 0x3d, 0x85, 0x55, + 0x66, 0xc7, 0xd9, 0xd7, 0x54, 0x1f, 0x38, 0x57, 0x17, 0xbd, 0xfd, 0x8c, 0x7c, 0x1b, 0x45, 0x8a, + 0x68, 0x7d, 0x6c, 0x14, 0xe5, 0xb1, 0x9f, 0x71, 0xdb, 0xe2, 0xab, 0xdc, 0x2a, 0xbe, 0xd2, 0xb6, + 0xf8, 0x06, 0x1f, 0x16, 0x2b, 0x17, 0x5c, 0xae, 0x5c, 0xf0, 0x63, 0xe5, 0x82, 0xf3, 0xb5, 0x5b, + 0xba, 0x5c, 0xbb, 0xa5, 0xaf, 0x6b, 0xb7, 0xf4, 0xa9, 0x1f, 0x53, 0x73, 0x36, 0x0d, 0x70, 0x28, + 0x98, 0x17, 0xf0, 0xa0, 0x17, 0x9e, 0x8d, 0x29, 0xf7, 0x36, 0xfe, 0x9d, 0xb3, 0xdf, 0xbe, 0x27, + 0x41, 0xd5, 0xce, 0x7e, 0xf6, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x13, 0x3a, 0x0a, 0xc5, 0x75, 0x04, + 0x00, 0x00, } func (m *Policy) Marshal() (dAtA []byte, err error) { @@ -471,6 +481,14 @@ func (m *GroupMember) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + n3, err3 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.ExpirationTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.ExpirationTime):]) + if err3 != nil { + return 0, err3 + } + i -= n3 + i = encodeVarintTypes(dAtA, i, uint64(n3)) + i-- + dAtA[i] = 0x22 if len(m.Member) > 0 { i -= len(m.Member) copy(dAtA[i:], m.Member) @@ -584,6 +602,8 @@ func (m *GroupMember) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.ExpirationTime) + n += 1 + l + sovTypes(uint64(l)) return n } @@ -1167,6 +1187,39 @@ func (m *GroupMember) Unmarshal(dAtA []byte) error { } m.Member = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpirationTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.ExpirationTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/x/storage/client/cli/flags.go b/x/storage/client/cli/flags.go index 6597fee89..20b510800 100644 --- a/x/storage/client/cli/flags.go +++ b/x/storage/client/cli/flags.go @@ -27,7 +27,6 @@ const ( FlagObjectName = "object-name" FlagGroupId = "group-id" FlagGroupName = "group-name" - FlagMemberList = "members" FlagExtra = "extra" ) diff --git a/x/storage/client/cli/tx.go b/x/storage/client/cli/tx.go index 62c193b2c..38b7013e1 100644 --- a/x/storage/client/cli/tx.go +++ b/x/storage/client/cli/tx.go @@ -2,10 +2,12 @@ package cli import ( "encoding/hex" + "errors" "fmt" "math/big" "strconv" "strings" + "time" cmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client" @@ -52,6 +54,7 @@ func GetTxCmd() *cobra.Command { CmdDeleteGroup(), CmdUpdateGroupMember(), CmdUpdateGroupExtra(), + CmdRenewGroupMember(), CmdLeaveGroup(), CmdMirrorGroup(), ) @@ -522,7 +525,6 @@ func CmdCreateGroup() *cobra.Command { Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) (err error) { argGroupName := args[0] - argMemberList, _ := cmd.Flags().GetString(FlagMemberList) extra, _ := cmd.Flags().GetString(FlagExtra) clientCtx, err := client.GetClientTxContext(cmd) @@ -530,21 +532,9 @@ func CmdCreateGroup() *cobra.Command { return err } - var memberAddrs []sdk.AccAddress - if argMemberList != "" { - members := strings.Split(argMemberList, ",") - for _, member := range members { - memberAddr, err := sdk.AccAddressFromHexUnsafe(member) - if err != nil { - return err - } - memberAddrs = append(memberAddrs, memberAddr) - } - } msg := types.NewMsgCreateGroup( clientCtx.GetFromAddress(), argGroupName, - memberAddrs, extra, ) if err := msg.ValidateBasic(); err != nil { @@ -555,7 +545,6 @@ func CmdCreateGroup() *cobra.Command { } cmd.Flags().String(FlagExtra, "", "extra info for the group") - cmd.Flags().String(FlagMemberList, "", "init members of the group") flags.AddTxFlagsToCmd(cmd) return cmd @@ -628,41 +617,62 @@ func CmdLeaveGroup() *cobra.Command { func CmdUpdateGroupMember() *cobra.Command { cmd := &cobra.Command{ - Use: "update-group-member [group-name] [member-to-add] [member-to-delete]", - Short: "Update the member of the group you own, split member addresses by ,", - Args: cobra.ExactArgs(3), + Use: "update-group-member [group-name] [member-to-add] [member-expiration-to-add] [member-to-delete]", + Short: "Update the member of the group you own, split member addresses and expiration(UNIX timestamp) by ,", + Args: cobra.ExactArgs(4), RunE: func(cmd *cobra.Command, args []string) (err error) { argGroupName := args[0] argMemberToAdd := args[1] - argMemberToDelete := args[2] - + argMemberExpirationToAdd := args[2] + argMemberToDelete := args[3] clientCtx, err := client.GetClientTxContext(cmd) if err != nil { return err } - var memberAddrsToAdd []sdk.AccAddress membersToAdd := strings.Split(argMemberToAdd, ",") - for _, member := range membersToAdd { - memberAddr, err := sdk.AccAddressFromHexUnsafe(member) - if err != nil { - return err + memberExpirationStr := strings.Split(argMemberExpirationToAdd, ",") + if len(memberExpirationStr) != len(membersToAdd) { + return errors.New("[member-to-add] and [member-expiration-to-add] should have the same length") + } + + msgGroupMemberToAdd := make([]*types.MsgGroupMember, 0, len(argMemberToAdd)) + if len(membersToAdd) > 0 { + for i := range membersToAdd { + if len(membersToAdd[i]) > 0 { + _, err := sdk.AccAddressFromHexUnsafe(membersToAdd[i]) + if err != nil { + return err + } + expiration, err := strconv.ParseInt(memberExpirationStr[i], 10, 64) + if err != nil { + return err + } + msgGroupMemberToAdd = append(msgGroupMemberToAdd, &types.MsgGroupMember{ + Member: membersToAdd[i], + ExpirationTime: time.Unix(expiration, 0).UTC(), + }) + } } - memberAddrsToAdd = append(memberAddrsToAdd, memberAddr) } + var memberAddrsToDelete []sdk.AccAddress - membersToDelete := strings.Split(argMemberToDelete, ",") - for _, member := range membersToDelete { - memberAddr, err := sdk.AccAddressFromHexUnsafe(member) - if err != nil { - return err + if len(argMemberToDelete) == 0 { + membersToDelete := strings.Split(argMemberToDelete, ",") + for _, member := range membersToDelete { + if len(member) > 0 { + memberAddr, err := sdk.AccAddressFromHexUnsafe(member) + if err != nil { + return err + } + memberAddrsToDelete = append(memberAddrsToDelete, memberAddr) + } } - memberAddrsToDelete = append(memberAddrsToDelete, memberAddr) } msg := types.NewMsgUpdateGroupMember( clientCtx.GetFromAddress(), clientCtx.GetFromAddress(), argGroupName, - memberAddrsToAdd, + msgGroupMemberToAdd, memberAddrsToDelete, ) if err := msg.ValidateBasic(); err != nil { @@ -677,6 +687,62 @@ func CmdUpdateGroupMember() *cobra.Command { return cmd } +func CmdRenewGroupMember() *cobra.Command { + cmd := &cobra.Command{ + Use: "renew-group-member [group-name] [member] [member-expiration]", + Short: "renew the member of the group you own, split member-addresses and member-expiration(UNIX timestamp) by ,", + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) (err error) { + argGroupName := args[0] + argMember := args[1] + argMemberExpiration := args[2] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + memberExpirationStr := strings.Split(argMemberExpiration, ",") + members := strings.Split(argMember, ",") + + if len(memberExpirationStr) != len(members) { + return errors.New("member and member-expiration should have the same length") + } + + msgGroupMember := make([]*types.MsgGroupMember, 0, len(argMember)) + for i := range members { + _, err := sdk.AccAddressFromHexUnsafe(members[i]) + if err != nil { + return err + } + expiration, err := strconv.ParseInt(memberExpirationStr[i], 10, 64) + if err != nil { + return err + } + msgGroupMember = append(msgGroupMember, &types.MsgGroupMember{ + Member: members[i], + ExpirationTime: time.Unix(expiration, 0), + }) + } + + msg := types.NewMsgRenewGroupMember( + clientCtx.GetFromAddress(), + clientCtx.GetFromAddress(), + argGroupName, + msgGroupMember, + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + func CmdUpdateGroupExtra() *cobra.Command { cmd := &cobra.Command{ Use: "update-group-extra [group-name] [extra]", diff --git a/x/storage/keeper/cross_app_group.go b/x/storage/keeper/cross_app_group.go index 77b8e27a0..0a23a1253 100644 --- a/x/storage/keeper/cross_app_group.go +++ b/x/storage/keeper/cross_app_group.go @@ -336,21 +336,13 @@ func (app *GroupApp) handleUpdateGroupMemberSynPackage(ctx sdk.Context, header * } } - options := types.UpdateGroupMemberOptions{ - SourceType: types.SOURCE_TYPE_BSC_CROSS_CHAIN, - } - if updateGroupPackage.OperationType == types.OperationAddGroupMember { - options.MembersToAdd = updateGroupPackage.GetMembers() - } else { - options.MembersToDelete = updateGroupPackage.GetMembers() + switch updateGroupPackage.OperationType { + case types.OperationAddGroupMember, types.OperationDeleteGroupMember: + err = app.handleAddOrDeleteGroupMemberOperation(ctx, groupInfo, updateGroupPackage) + case types.OperationRenewGroupMember: + err = app.handleRenewGroupOperation(ctx, groupInfo, updateGroupPackage) } - err = app.storageKeeper.UpdateGroupMember( - ctx, - updateGroupPackage.Operator, - groupInfo, - options, - ) if err != nil { return sdk.ExecuteResult{ Payload: types.UpdateGroupMemberAckPackage{ @@ -374,6 +366,40 @@ func (app *GroupApp) handleUpdateGroupMemberSynPackage(ctx sdk.Context, header * } } +func (app *GroupApp) handleAddOrDeleteGroupMemberOperation(ctx sdk.Context, groupInfo *types.GroupInfo, updateGroupPackage *types.UpdateGroupMemberSynPackage) error { + options := types.UpdateGroupMemberOptions{ + SourceType: types.SOURCE_TYPE_BSC_CROSS_CHAIN, + } + if updateGroupPackage.OperationType == types.OperationAddGroupMember { + options.MembersToAdd = updateGroupPackage.GetMembers() + options.MembersExpirationToAdd = updateGroupPackage.GetMemberExpiration() + } else { + options.MembersToDelete = updateGroupPackage.GetMembers() + } + + return app.storageKeeper.UpdateGroupMember( + ctx, + updateGroupPackage.Operator, + groupInfo, + options, + ) +} + +func (app *GroupApp) handleRenewGroupOperation(ctx sdk.Context, groupInfo *types.GroupInfo, updateGroupPackage *types.UpdateGroupMemberSynPackage) error { + options := types.RenewGroupMemberOptions{ + SourceType: types.SOURCE_TYPE_BSC_CROSS_CHAIN, + Members: updateGroupPackage.GetMembers(), + MembersExpiration: updateGroupPackage.GetMemberExpiration(), + } + + return app.storageKeeper.RenewGroupMember( + ctx, + updateGroupPackage.Operator, + groupInfo, + options, + ) +} + func (app *GroupApp) handleUpdateGroupMemberAckPackage(ctx sdk.Context, header *sdk.CrossChainAppContext, createGroupPackage *types.UpdateGroupMemberAckPackage) sdk.ExecuteResult { app.storageKeeper.Logger(ctx).Error("received update group member ack package ") diff --git a/x/storage/keeper/grpc_query.go b/x/storage/keeper/grpc_query.go index ea2aa50a7..e866773f4 100644 --- a/x/storage/keeper/grpc_query.go +++ b/x/storage/keeper/grpc_query.go @@ -558,6 +558,7 @@ func (k Keeper) HeadGroupMember(goCtx context.Context, req *types.QueryHeadGroup if !found { return nil, types.ErrNoSuchGroupMember } + return &types.QueryHeadGroupMemberResponse{GroupMember: groupMember}, nil } diff --git a/x/storage/keeper/keeper.go b/x/storage/keeper/keeper.go index 20b6e1676..2372197d1 100644 --- a/x/storage/keeper/keeper.go +++ b/x/storage/keeper/keeper.go @@ -1254,23 +1254,11 @@ func (k Keeper) CreateGroup( store.Set(groupKey, k.groupSeq.EncodeSequence(groupInfo.Id)) store.Set(types.GetGroupByIDKey(groupInfo.Id), gbz) - // need to limit the size of Msg.Members to avoid taking too long to execute the msg - for _, member := range opts.Members { - memberAddress, err := sdk.AccAddressFromHexUnsafe(member) - if err != nil { - return sdkmath.ZeroUint(), err - } - err = k.permKeeper.AddGroupMember(ctx, groupInfo.Id, memberAddress) - if err != nil { - return sdkmath.Uint{}, err - } - } if err := ctx.EventManager().EmitTypedEvents(&types.EventCreateGroup{ Owner: groupInfo.Owner, GroupName: groupInfo.GroupName, GroupId: groupInfo.Id, SourceType: groupInfo.SourceType, - Members: opts.Members, Extra: opts.Extra, }); err != nil { return sdkmath.ZeroUint(), err @@ -1386,15 +1374,26 @@ func (k Keeper) UpdateGroupMember(ctx sdk.Context, operator sdk.AccAddress, grou operator.String(), groupInfo.GroupName, groupInfo.Owner) } - for _, member := range opts.MembersToAdd { - memberAcc, err := sdk.AccAddressFromHexUnsafe(member) + addedMembersDetailEvent := make([]*types.EventGroupMemberDetail, 0, len(opts.MembersToAdd)) + for i := range opts.MembersToAdd { + memberAcc, err := sdk.AccAddressFromHexUnsafe(opts.MembersToAdd[i]) if err != nil { return err } - err = k.permKeeper.AddGroupMember(ctx, groupInfo.Id, memberAcc) + + groupMemberDetailEvent := &types.EventGroupMemberDetail{ + Member: opts.MembersToAdd[i], + ExpirationTime: types.MaxTimeStamp, + } + + memberExpiration := opts.MembersExpirationToAdd[i].UTC() + groupMemberDetailEvent.ExpirationTime = memberExpiration + err = k.permKeeper.AddGroupMember(ctx, groupInfo.Id, memberAcc, memberExpiration) if err != nil { return err } + + addedMembersDetailEvent = append(addedMembersDetailEvent, groupMemberDetailEvent) } for _, member := range opts.MembersToDelete { @@ -1413,7 +1412,7 @@ func (k Keeper) UpdateGroupMember(ctx sdk.Context, operator sdk.AccAddress, grou Owner: groupInfo.Owner, GroupName: groupInfo.GroupName, GroupId: groupInfo.Id, - MembersToAdd: opts.MembersToAdd, + MembersToAdd: addedMembersDetailEvent, MembersToDelete: opts.MembersToDelete, }); err != nil { return err @@ -1421,8 +1420,59 @@ func (k Keeper) UpdateGroupMember(ctx sdk.Context, operator sdk.AccAddress, grou return nil } -func (k Keeper) UpdateGroupExtra(ctx sdk.Context, operator sdk.AccAddress, groupInfo *types.GroupInfo, extra string) error { +func (k Keeper) RenewGroupMember(ctx sdk.Context, operator sdk.AccAddress, groupInfo *types.GroupInfo, opts types.RenewGroupMemberOptions) error { + if groupInfo.SourceType != opts.SourceType { + return types.ErrSourceTypeMismatch + } + + // check permission + effect := k.VerifyGroupPermission(ctx, groupInfo, operator, permtypes.ACTION_UPDATE_GROUP_MEMBER) + if effect != permtypes.EFFECT_ALLOW { + return types.ErrAccessDenied.Wrapf( + "The operator(%s) has no UpdateGroupMember permission of the group(%s), operator(%s)", + operator.String(), groupInfo.GroupName, groupInfo.Owner) + } + + eventMembersDetail := make([]*types.EventGroupMemberDetail, 0, len(opts.Members)) + for i := range opts.Members { + member := opts.Members[i] + memberExpiration := opts.MembersExpiration[i].UTC() + memberAcc, err := sdk.AccAddressFromHexUnsafe(member) + if err != nil { + return err + } + groupMember, found := k.permKeeper.GetGroupMember(ctx, groupInfo.Id, memberAcc) + if !found { + err = k.permKeeper.AddGroupMember(ctx, groupInfo.Id, memberAcc, memberExpiration) + if err != nil { + return err + } + } else { + k.permKeeper.UpdateGroupMember(ctx, groupInfo.Id, memberAcc, groupMember.Id, memberExpiration) + } + + eventMembersDetail = append(eventMembersDetail, &types.EventGroupMemberDetail{ + Member: member, + ExpirationTime: memberExpiration, + }) + } + + if err := ctx.EventManager().EmitTypedEvents(&types.EventRenewGroupMember{ + Operator: operator.String(), + Owner: groupInfo.Owner, + GroupName: groupInfo.GroupName, + GroupId: groupInfo.Id, + SourceType: groupInfo.SourceType, + Members: eventMembersDetail, + }); err != nil { + return err + } + + return nil +} + +func (k Keeper) UpdateGroupExtra(ctx sdk.Context, operator sdk.AccAddress, groupInfo *types.GroupInfo, extra string) error { // check permission effect := k.VerifyGroupPermission(ctx, groupInfo, operator, permtypes.ACTION_UPDATE_GROUP_EXTRA) if effect != permtypes.EFFECT_ALLOW { diff --git a/x/storage/keeper/msg_server.go b/x/storage/keeper/msg_server.go index cd7277471..8ea4ef613 100644 --- a/x/storage/keeper/msg_server.go +++ b/x/storage/keeper/msg_server.go @@ -2,6 +2,7 @@ package keeper import ( "context" + "time" errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" @@ -232,7 +233,7 @@ func (k msgServer) CreateGroup(goCtx context.Context, msg *types.MsgCreateGroup) ownerAcc := sdk.MustAccAddressFromHex(msg.Creator) - id, err := k.Keeper.CreateGroup(ctx, ownerAcc, msg.GroupName, storagetypes.CreateGroupOptions{Members: msg.Members, Extra: msg.Extra}) + id, err := k.Keeper.CreateGroup(ctx, ownerAcc, msg.GroupName, storagetypes.CreateGroupOptions{Extra: msg.Extra}) if err != nil { return nil, err } @@ -280,10 +281,17 @@ func (k msgServer) UpdateGroupMember(goCtx context.Context, msg *types.MsgUpdate if !found { return nil, types.ErrNoSuchGroup } + membersToAdd := make([]string, 0, len(msg.MembersToAdd)) + membersExpirationToAdd := make([]time.Time, 0, len(msg.MembersToAdd)) + for i := range msg.MembersToAdd { + membersToAdd = append(membersToAdd, msg.MembersToAdd[i].GetMember()) + membersExpirationToAdd = append(membersExpirationToAdd, msg.MembersToAdd[i].GetExpirationTime()) + } err := k.Keeper.UpdateGroupMember(ctx, operator, groupInfo, storagetypes.UpdateGroupMemberOptions{ - SourceType: types.SOURCE_TYPE_ORIGIN, - MembersToAdd: msg.MembersToAdd, - MembersToDelete: msg.MembersToDelete, + SourceType: types.SOURCE_TYPE_ORIGIN, + MembersToAdd: membersToAdd, + MembersExpirationToAdd: membersExpirationToAdd, + MembersToDelete: msg.MembersToDelete, }) if err != nil { return nil, err @@ -292,6 +300,37 @@ func (k msgServer) UpdateGroupMember(goCtx context.Context, msg *types.MsgUpdate return &types.MsgUpdateGroupMemberResponse{}, nil } +func (k msgServer) RenewGroupMember(goCtx context.Context, msg *types.MsgRenewGroupMember) (*types.MsgRenewGroupMemberResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + operator := sdk.MustAccAddressFromHex(msg.Operator) + + groupOwner := sdk.MustAccAddressFromHex(msg.GroupOwner) + + groupInfo, found := k.GetGroupInfo(ctx, groupOwner, msg.GroupName) + if !found { + return nil, types.ErrNoSuchGroup + } + + members := make([]string, 0, len(msg.Members)) + membersExpiration := make([]time.Time, 0, len(msg.Members)) + for i := range msg.Members { + members = append(members, msg.Members[i].GetMember()) + membersExpiration = append(membersExpiration, msg.Members[i].GetExpirationTime()) + } + + err := k.Keeper.RenewGroupMember(ctx, operator, groupInfo, storagetypes.RenewGroupMemberOptions{ + SourceType: types.SOURCE_TYPE_ORIGIN, + Members: members, + MembersExpiration: membersExpiration, + }) + if err != nil { + return nil, err + } + + return &types.MsgRenewGroupMemberResponse{}, nil +} + func (k msgServer) UpdateGroupExtra(goCtx context.Context, msg *types.MsgUpdateGroupExtra) (*types.MsgUpdateGroupExtraResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) diff --git a/x/storage/types/crosschain.go b/x/storage/types/crosschain.go index e43b2650b..f19333182 100644 --- a/x/storage/types/crosschain.go +++ b/x/storage/types/crosschain.go @@ -2,6 +2,7 @@ package types import ( "math/big" + time "time" "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" @@ -873,22 +874,25 @@ func (p DeleteGroupAckPackage) MustSerialize() []byte { const ( OperationAddGroupMember uint8 = 0 OperationDeleteGroupMember uint8 = 1 + OperationRenewGroupMember uint8 = 2 ) type UpdateGroupMemberSynPackage struct { - Operator sdk.AccAddress - GroupId *big.Int - OperationType uint8 - Members []sdk.AccAddress - ExtraData []byte + Operator sdk.AccAddress + GroupId *big.Int + OperationType uint8 + Members []sdk.AccAddress + ExtraData []byte + MemberExpiration []uint64 } type UpdateGroupMemberSynPackageStruct struct { - Operator common.Address - GroupId *big.Int - OperationType uint8 - Members []common.Address - ExtraData []byte + Operator common.Address + GroupId *big.Int + OperationType uint8 + Members []common.Address + ExtraData []byte + MemberExpiration []uint64 } var ( @@ -898,6 +902,7 @@ var ( {Name: "OperationType", Type: "uint8"}, {Name: "Members", Type: "address[]"}, {Name: "ExtraData", Type: "bytes"}, + {Name: "MemberExpiration", Type: "uint64[]"}, }) updateGroupMemberSynPackageArgs = abi.Arguments{ @@ -913,6 +918,14 @@ func (p UpdateGroupMemberSynPackage) GetMembers() []string { return members } +func (p UpdateGroupMemberSynPackage) GetMemberExpiration() []time.Time { + memberExpiration := make([]time.Time, 0, len(p.MemberExpiration)) + for _, expiration := range p.MemberExpiration { + memberExpiration = append(memberExpiration, time.Unix(int64(expiration), 0)) + } + return memberExpiration +} + func (p UpdateGroupMemberSynPackage) MustSerialize() []byte { totalMember := len(p.Members) members := make([]common.Address, totalMember) @@ -926,6 +939,7 @@ func (p UpdateGroupMemberSynPackage) MustSerialize() []byte { p.OperationType, members, p.ExtraData, + p.MemberExpiration, }) if err != nil { panic("encode update group member syn package error") @@ -934,7 +948,7 @@ func (p UpdateGroupMemberSynPackage) MustSerialize() []byte { } func (p UpdateGroupMemberSynPackage) ValidateBasic() error { - if p.OperationType != OperationAddGroupMember && p.OperationType != OperationDeleteGroupMember { + if p.OperationType != OperationAddGroupMember && p.OperationType != OperationDeleteGroupMember && p.OperationType != OperationRenewGroupMember { return ErrInvalidOperationType } @@ -950,19 +964,25 @@ func (p UpdateGroupMemberSynPackage) ValidateBasic() error { return sdkerrors.ErrInvalidAddress } } + + if (p.OperationType == OperationRenewGroupMember || p.OperationType == OperationAddGroupMember) && + len(p.Members) != len(p.MemberExpiration) { + return ErrInvalidGroupMemberExpiration + } + return nil } func DeserializeUpdateGroupMemberSynPackage(serializedPackage []byte) (interface{}, error) { unpacked, err := updateGroupMemberSynPackageArgs.Unpack(serializedPackage) if err != nil { - return nil, errors.Wrapf(ErrInvalidCrossChainPackage, "deserialize delete bucket ack package failed") + return nil, errors.Wrapf(ErrInvalidCrossChainPackage, "deserialize update group member sun package failed") } unpackedStruct := abi.ConvertType(unpacked[0], UpdateGroupMemberSynPackageStruct{}) pkgStruct, ok := unpackedStruct.(UpdateGroupMemberSynPackageStruct) if !ok { - return nil, errors.Wrapf(ErrInvalidCrossChainPackage, "reflect delete bucket ack package failed") + return nil, errors.Wrapf(ErrInvalidCrossChainPackage, "reflect update group member sun package failed") } totalMember := len(pkgStruct.Members) @@ -976,6 +996,7 @@ func DeserializeUpdateGroupMemberSynPackage(serializedPackage []byte) (interface pkgStruct.OperationType, members, pkgStruct.ExtraData, + pkgStruct.MemberExpiration, } return &tp, nil } diff --git a/x/storage/types/errors.go b/x/storage/types/errors.go index 9fb387674..282eebbab 100644 --- a/x/storage/types/errors.go +++ b/x/storage/types/errors.go @@ -6,31 +6,31 @@ import ( // x/storage module sentinel errors var ( - ErrNoSuchBucket = errors.Register(ModuleName, 1100, "No such bucket") - ErrNoSuchObject = errors.Register(ModuleName, 1101, "No such object") - ErrNoSuchGroup = errors.Register(ModuleName, 1102, "No such group") - ErrNoSuchGroupMember = errors.Register(ModuleName, 1103, "No such group member") - ErrBucketAlreadyExists = errors.Register(ModuleName, 1104, "Bucket already exists") - ErrObjectAlreadyExists = errors.Register(ModuleName, 1105, "Object already exists") - ErrGroupAlreadyExists = errors.Register(ModuleName, 1106, "Group already exists") - ErrAccessDenied = errors.Register(ModuleName, 1107, "Access denied") - ErrObjectAlreadySealed = errors.Register(ModuleName, 1108, "Object already sealed") - ErrBucketNotEmpty = errors.Register(ModuleName, 1109, "Bucket is not empty") - ErrGroupMemberAlreadyExists = errors.Register(ModuleName, 1110, "Group member already exists") - ErrNoSuchStorageProvider = errors.Register(ModuleName, 1111, "No such storage provider") - ErrObjectNotCreated = errors.Register(ModuleName, 1112, "Object not created") - ErrObjectNotSealed = errors.Register(ModuleName, 1113, "Object not sealed") - ErrSourceTypeMismatch = errors.Register(ModuleName, 1114, "Object source type mismatch") - ErrTooLargeObject = errors.Register(ModuleName, 1115, "Object payload size is too large") - ErrInvalidApproval = errors.Register(ModuleName, 1116, "Invalid approval of sp") - ErrChargeFailed = errors.Register(ModuleName, 1117, "charge failed error") - ErrInvalidVisibility = errors.Register(ModuleName, 1118, "Invalid type of visibility") - ErrUpdateQuotaFailed = errors.Register(ModuleName, 1119, "Update quota failed") - - ErrNoSuchPolicy = errors.Register(ModuleName, 1120, "No such Policy") - - ErrInvalidRedundancyType = errors.Register(ModuleName, 1122, "Invalid redundancy type") - ErrInvalidGlobalVirtualGroup = errors.Register(ModuleName, 1123, "invalid global virtual group") + ErrNoSuchBucket = errors.Register(ModuleName, 1100, "No such bucket") + ErrNoSuchObject = errors.Register(ModuleName, 1101, "No such object") + ErrNoSuchGroup = errors.Register(ModuleName, 1102, "No such group") + ErrNoSuchGroupMember = errors.Register(ModuleName, 1103, "No such group member") + ErrBucketAlreadyExists = errors.Register(ModuleName, 1104, "Bucket already exists") + ErrObjectAlreadyExists = errors.Register(ModuleName, 1105, "Object already exists") + ErrGroupAlreadyExists = errors.Register(ModuleName, 1106, "Group already exists") + ErrAccessDenied = errors.Register(ModuleName, 1107, "Access denied") + ErrObjectAlreadySealed = errors.Register(ModuleName, 1108, "Object already sealed") + ErrBucketNotEmpty = errors.Register(ModuleName, 1109, "Bucket is not empty") + ErrGroupMemberAlreadyExists = errors.Register(ModuleName, 1110, "Group member already exists") + ErrNoSuchStorageProvider = errors.Register(ModuleName, 1111, "No such storage provider") + ErrObjectNotCreated = errors.Register(ModuleName, 1112, "Object not created") + ErrObjectNotSealed = errors.Register(ModuleName, 1113, "Object not sealed") + ErrSourceTypeMismatch = errors.Register(ModuleName, 1114, "Object source type mismatch") + ErrTooLargeObject = errors.Register(ModuleName, 1115, "Object payload size is too large") + ErrInvalidApproval = errors.Register(ModuleName, 1116, "Invalid approval of sp") + ErrChargeFailed = errors.Register(ModuleName, 1117, "charge failed error") + ErrInvalidVisibility = errors.Register(ModuleName, 1118, "Invalid type of visibility") + ErrUpdateQuotaFailed = errors.Register(ModuleName, 1119, "Update quota failed") + ErrNoSuchPolicy = errors.Register(ModuleName, 1120, "No such Policy") + ErrInvalidRedundancyType = errors.Register(ModuleName, 1122, "Invalid redundancy type") + ErrInvalidGlobalVirtualGroup = errors.Register(ModuleName, 1123, "invalid global virtual group") + ErrRenewGroupMemberNotAllow = errors.Register(ModuleName, 1124, "Renew group member not allow") + ErrInvalidGroupMemberExpiration = errors.Register(ModuleName, 1125, "invalid group member with expiration") ErrInvalidCrossChainPackage = errors.Register(ModuleName, 3000, "invalid cross chain package") ErrAlreadyMirrored = errors.Register(ModuleName, 3001, "resource is already mirrored") diff --git a/x/storage/types/events.pb.go b/x/storage/types/events.pb.go index 9a23d9396..65f08ec77 100644 --- a/x/storage/types/events.pb.go +++ b/x/storage/types/events.pb.go @@ -8,15 +8,19 @@ import ( _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" math_bits "math/bits" + time "time" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +var _ = time.Kitchen // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. @@ -1091,10 +1095,8 @@ type EventCreateGroup struct { GroupId Uint `protobuf:"bytes,3,opt,name=group_id,json=groupId,proto3,customtype=Uint" json:"group_id"` // source_type define the source of the group. CrossChain or Greenfield origin SourceType SourceType `protobuf:"varint,4,opt,name=source_type,json=sourceType,proto3,enum=greenfield.storage.SourceType" json:"source_type,omitempty"` - // members define the all the address of the members. - Members []string `protobuf:"bytes,5,rep,name=members,proto3" json:"members,omitempty"` // extra defines extra info for the group - Extra string `protobuf:"bytes,6,opt,name=extra,proto3" json:"extra,omitempty"` + Extra string `protobuf:"bytes,5,opt,name=extra,proto3" json:"extra,omitempty"` } func (m *EventCreateGroup) Reset() { *m = EventCreateGroup{} } @@ -1151,13 +1153,6 @@ func (m *EventCreateGroup) GetSourceType() SourceType { return SOURCE_TYPE_ORIGIN } -func (m *EventCreateGroup) GetMembers() []string { - if m != nil { - return m.Members - } - return nil -} - func (m *EventCreateGroup) GetExtra() string { if m != nil { return m.Extra @@ -1299,7 +1294,7 @@ type EventUpdateGroupMember struct { // id define an u256 id for group GroupId Uint `protobuf:"bytes,4,opt,name=group_id,json=groupId,proto3,customtype=Uint" json:"group_id"` // members_to_add defines all the members to be added to the group - MembersToAdd []string `protobuf:"bytes,5,rep,name=members_to_add,json=membersToAdd,proto3" json:"members_to_add,omitempty"` + MembersToAdd []*EventGroupMemberDetail `protobuf:"bytes,5,rep,name=members_to_add,json=membersToAdd,proto3" json:"members_to_add,omitempty"` // members_to_add defines all the members to be deleted from the group MembersToDelete []string `protobuf:"bytes,6,rep,name=members_to_delete,json=membersToDelete,proto3" json:"members_to_delete,omitempty"` } @@ -1358,7 +1353,7 @@ func (m *EventUpdateGroupMember) GetGroupName() string { return "" } -func (m *EventUpdateGroupMember) GetMembersToAdd() []string { +func (m *EventUpdateGroupMember) GetMembersToAdd() []*EventGroupMemberDetail { if m != nil { return m.MembersToAdd } @@ -1372,6 +1367,143 @@ func (m *EventUpdateGroupMember) GetMembersToDelete() []string { return nil } +type EventRenewGroupMember struct { + // operator define the account address of operator who update the group member + Operator string `protobuf:"bytes,1,opt,name=operator,proto3" json:"operator,omitempty"` + // owner define the account address of group owner + Owner string `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + // group_name define the name of the group + GroupName string `protobuf:"bytes,3,opt,name=group_name,json=groupName,proto3" json:"group_name,omitempty"` + // id define an u256 id for group + GroupId Uint `protobuf:"bytes,4,opt,name=group_id,json=groupId,proto3,customtype=Uint" json:"group_id"` + // source_type define the source of the group. CrossChain or Greenfield origin + SourceType SourceType `protobuf:"varint,5,opt,name=source_type,json=sourceType,proto3,enum=greenfield.storage.SourceType" json:"source_type,omitempty"` + // members define the all the address of the members. + Members []*EventGroupMemberDetail `protobuf:"bytes,6,rep,name=members,proto3" json:"members,omitempty"` +} + +func (m *EventRenewGroupMember) Reset() { *m = EventRenewGroupMember{} } +func (m *EventRenewGroupMember) String() string { return proto.CompactTextString(m) } +func (*EventRenewGroupMember) ProtoMessage() {} +func (*EventRenewGroupMember) Descriptor() ([]byte, []int) { + return fileDescriptor_946dcba4f763ddc4, []int{16} +} +func (m *EventRenewGroupMember) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventRenewGroupMember) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventRenewGroupMember.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 *EventRenewGroupMember) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventRenewGroupMember.Merge(m, src) +} +func (m *EventRenewGroupMember) XXX_Size() int { + return m.Size() +} +func (m *EventRenewGroupMember) XXX_DiscardUnknown() { + xxx_messageInfo_EventRenewGroupMember.DiscardUnknown(m) +} + +var xxx_messageInfo_EventRenewGroupMember proto.InternalMessageInfo + +func (m *EventRenewGroupMember) GetOperator() string { + if m != nil { + return m.Operator + } + return "" +} + +func (m *EventRenewGroupMember) GetOwner() string { + if m != nil { + return m.Owner + } + return "" +} + +func (m *EventRenewGroupMember) GetGroupName() string { + if m != nil { + return m.GroupName + } + return "" +} + +func (m *EventRenewGroupMember) GetSourceType() SourceType { + if m != nil { + return m.SourceType + } + return SOURCE_TYPE_ORIGIN +} + +func (m *EventRenewGroupMember) GetMembers() []*EventGroupMemberDetail { + if m != nil { + return m.Members + } + return nil +} + +type EventGroupMemberDetail struct { + // member defines the account address of the group member + Member string `protobuf:"bytes,1,opt,name=member,proto3" json:"member,omitempty"` + // expiration_time defines the expiration time of the group member + ExpirationTime time.Time `protobuf:"bytes,2,opt,name=expiration_time,json=expirationTime,proto3,stdtime" json:"expiration_time"` +} + +func (m *EventGroupMemberDetail) Reset() { *m = EventGroupMemberDetail{} } +func (m *EventGroupMemberDetail) String() string { return proto.CompactTextString(m) } +func (*EventGroupMemberDetail) ProtoMessage() {} +func (*EventGroupMemberDetail) Descriptor() ([]byte, []int) { + return fileDescriptor_946dcba4f763ddc4, []int{17} +} +func (m *EventGroupMemberDetail) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventGroupMemberDetail) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventGroupMemberDetail.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 *EventGroupMemberDetail) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventGroupMemberDetail.Merge(m, src) +} +func (m *EventGroupMemberDetail) XXX_Size() int { + return m.Size() +} +func (m *EventGroupMemberDetail) XXX_DiscardUnknown() { + xxx_messageInfo_EventGroupMemberDetail.DiscardUnknown(m) +} + +var xxx_messageInfo_EventGroupMemberDetail proto.InternalMessageInfo + +func (m *EventGroupMemberDetail) GetMember() string { + if m != nil { + return m.Member + } + return "" +} + +func (m *EventGroupMemberDetail) GetExpirationTime() time.Time { + if m != nil { + return m.ExpirationTime + } + return time.Time{} +} + // EventUpdateGroupExtra is emitted on MsgUpdateGroupExtra type EventUpdateGroupExtra struct { // operator define the account address of operator who update the group member @@ -1390,7 +1522,7 @@ func (m *EventUpdateGroupExtra) Reset() { *m = EventUpdateGroupExtra{} } func (m *EventUpdateGroupExtra) String() string { return proto.CompactTextString(m) } func (*EventUpdateGroupExtra) ProtoMessage() {} func (*EventUpdateGroupExtra) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{16} + return fileDescriptor_946dcba4f763ddc4, []int{18} } func (m *EventUpdateGroupExtra) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1463,7 +1595,7 @@ func (m *EventMirrorBucket) Reset() { *m = EventMirrorBucket{} } func (m *EventMirrorBucket) String() string { return proto.CompactTextString(m) } func (*EventMirrorBucket) ProtoMessage() {} func (*EventMirrorBucket) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{17} + return fileDescriptor_946dcba4f763ddc4, []int{19} } func (m *EventMirrorBucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1529,7 +1661,7 @@ func (m *EventMirrorBucketResult) Reset() { *m = EventMirrorBucketResult func (m *EventMirrorBucketResult) String() string { return proto.CompactTextString(m) } func (*EventMirrorBucketResult) ProtoMessage() {} func (*EventMirrorBucketResult) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{18} + return fileDescriptor_946dcba4f763ddc4, []int{20} } func (m *EventMirrorBucketResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1597,7 +1729,7 @@ func (m *EventMirrorObject) Reset() { *m = EventMirrorObject{} } func (m *EventMirrorObject) String() string { return proto.CompactTextString(m) } func (*EventMirrorObject) ProtoMessage() {} func (*EventMirrorObject) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{19} + return fileDescriptor_946dcba4f763ddc4, []int{21} } func (m *EventMirrorObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1672,7 +1804,7 @@ func (m *EventMirrorObjectResult) Reset() { *m = EventMirrorObjectResult func (m *EventMirrorObjectResult) String() string { return proto.CompactTextString(m) } func (*EventMirrorObjectResult) ProtoMessage() {} func (*EventMirrorObjectResult) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{20} + return fileDescriptor_946dcba4f763ddc4, []int{22} } func (m *EventMirrorObjectResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1745,7 +1877,7 @@ func (m *EventMirrorGroup) Reset() { *m = EventMirrorGroup{} } func (m *EventMirrorGroup) String() string { return proto.CompactTextString(m) } func (*EventMirrorGroup) ProtoMessage() {} func (*EventMirrorGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{21} + return fileDescriptor_946dcba4f763ddc4, []int{23} } func (m *EventMirrorGroup) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1811,7 +1943,7 @@ func (m *EventMirrorGroupResult) Reset() { *m = EventMirrorGroupResult{} func (m *EventMirrorGroupResult) String() string { return proto.CompactTextString(m) } func (*EventMirrorGroupResult) ProtoMessage() {} func (*EventMirrorGroupResult) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{22} + return fileDescriptor_946dcba4f763ddc4, []int{24} } func (m *EventMirrorGroupResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1871,7 +2003,7 @@ func (m *EventStalePolicyCleanup) Reset() { *m = EventStalePolicyCleanup func (m *EventStalePolicyCleanup) String() string { return proto.CompactTextString(m) } func (*EventStalePolicyCleanup) ProtoMessage() {} func (*EventStalePolicyCleanup) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{23} + return fileDescriptor_946dcba4f763ddc4, []int{25} } func (m *EventStalePolicyCleanup) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1930,7 +2062,7 @@ func (m *EventMigrationBucket) Reset() { *m = EventMigrationBucket{} } func (m *EventMigrationBucket) String() string { return proto.CompactTextString(m) } func (*EventMigrationBucket) ProtoMessage() {} func (*EventMigrationBucket) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{24} + return fileDescriptor_946dcba4f763ddc4, []int{26} } func (m *EventMigrationBucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1994,7 +2126,7 @@ func (m *EventCancelMigrationBucket) Reset() { *m = EventCancelMigration func (m *EventCancelMigrationBucket) String() string { return proto.CompactTextString(m) } func (*EventCancelMigrationBucket) ProtoMessage() {} func (*EventCancelMigrationBucket) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{25} + return fileDescriptor_946dcba4f763ddc4, []int{27} } func (m *EventCancelMigrationBucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2055,7 +2187,7 @@ func (m *EventCompleteMigrationBucket) Reset() { *m = EventCompleteMigra func (m *EventCompleteMigrationBucket) String() string { return proto.CompactTextString(m) } func (*EventCompleteMigrationBucket) ProtoMessage() {} func (*EventCompleteMigrationBucket) Descriptor() ([]byte, []int) { - return fileDescriptor_946dcba4f763ddc4, []int{26} + return fileDescriptor_946dcba4f763ddc4, []int{28} } func (m *EventCompleteMigrationBucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2129,6 +2261,8 @@ func init() { proto.RegisterType((*EventDeleteGroup)(nil), "greenfield.storage.EventDeleteGroup") proto.RegisterType((*EventLeaveGroup)(nil), "greenfield.storage.EventLeaveGroup") proto.RegisterType((*EventUpdateGroupMember)(nil), "greenfield.storage.EventUpdateGroupMember") + proto.RegisterType((*EventRenewGroupMember)(nil), "greenfield.storage.EventRenewGroupMember") + proto.RegisterType((*EventGroupMemberDetail)(nil), "greenfield.storage.EventGroupMemberDetail") proto.RegisterType((*EventUpdateGroupExtra)(nil), "greenfield.storage.EventUpdateGroupExtra") proto.RegisterType((*EventMirrorBucket)(nil), "greenfield.storage.EventMirrorBucket") proto.RegisterType((*EventMirrorBucketResult)(nil), "greenfield.storage.EventMirrorBucketResult") @@ -2145,103 +2279,109 @@ func init() { func init() { proto.RegisterFile("greenfield/storage/events.proto", fileDescriptor_946dcba4f763ddc4) } var fileDescriptor_946dcba4f763ddc4 = []byte{ - // 1525 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0xbf, 0x6f, 0xdb, 0x46, - 0x1b, 0x36, 0x25, 0x4a, 0xb6, 0x4f, 0x96, 0x14, 0xf3, 0xf3, 0x97, 0xe8, 0x73, 0xf2, 0xc9, 0x0a, - 0x87, 0xd4, 0x01, 0x1a, 0x1b, 0x48, 0xda, 0x22, 0x53, 0x03, 0xdb, 0x49, 0x0b, 0xa1, 0xcd, 0x8f, - 0x52, 0x49, 0x86, 0x2e, 0xc4, 0x89, 0x3c, 0xcb, 0x6c, 0x48, 0x1e, 0x7b, 0x77, 0x72, 0xa3, 0xfc, - 0x03, 0x9d, 0x0a, 0x74, 0x6c, 0x97, 0x4e, 0x1d, 0x0a, 0x14, 0x05, 0x3a, 0x64, 0xed, 0x9e, 0x6e, - 0x69, 0xba, 0xf4, 0x07, 0x10, 0x14, 0xc9, 0x94, 0x2e, 0xdd, 0x3b, 0x15, 0xbc, 0x3b, 0x51, 0xa4, - 0x28, 0x87, 0xa6, 0x52, 0xc7, 0xce, 0x26, 0xbe, 0x7a, 0xee, 0xf8, 0xbe, 0xcf, 0x3d, 0xef, 0x7b, - 0xef, 0x1d, 0xc1, 0x4a, 0x8f, 0x20, 0xe4, 0x6f, 0x3b, 0xc8, 0xb5, 0xd7, 0x29, 0xc3, 0x04, 0xf6, - 0xd0, 0x3a, 0xda, 0x45, 0x3e, 0xa3, 0x6b, 0x01, 0xc1, 0x0c, 0x6b, 0xda, 0x08, 0xb0, 0x26, 0x01, - 0xcb, 0xff, 0xb3, 0x30, 0xf5, 0x30, 0x35, 0x39, 0x62, 0x5d, 0x3c, 0x08, 0xf8, 0xf2, 0x52, 0x0f, - 0xf7, 0xb0, 0xb0, 0x87, 0xbf, 0xa4, 0x75, 0xd2, 0x5b, 0x2c, 0xec, 0x79, 0xd8, 0x97, 0x80, 0xe6, - 0x04, 0x00, 0x1b, 0x04, 0x48, 0x4e, 0xab, 0xff, 0xac, 0x82, 0xc5, 0x2b, 0xa1, 0x5b, 0x5b, 0x04, - 0x41, 0x86, 0x36, 0xfb, 0xd6, 0x1d, 0xc4, 0xb4, 0x35, 0x50, 0xc2, 0x9f, 0xf8, 0x88, 0x34, 0x94, - 0x96, 0xb2, 0x3a, 0xbf, 0xd9, 0x78, 0x74, 0xff, 0xdc, 0x92, 0xf4, 0x66, 0xc3, 0xb6, 0x09, 0xa2, - 0xb4, 0xc3, 0x88, 0xe3, 0xf7, 0x0c, 0x01, 0xd3, 0x56, 0x40, 0xa5, 0xcb, 0x47, 0x9a, 0x3e, 0xf4, - 0x50, 0xa3, 0x10, 0x8e, 0x32, 0x80, 0x30, 0x5d, 0x83, 0x1e, 0xd2, 0x36, 0x01, 0xd8, 0x75, 0xa8, - 0xd3, 0x75, 0x5c, 0x87, 0x0d, 0x1a, 0xc5, 0x96, 0xb2, 0x5a, 0x3b, 0xaf, 0xaf, 0xa5, 0x19, 0x58, - 0xbb, 0x1d, 0xa1, 0x6e, 0x0e, 0x02, 0x64, 0xc4, 0x46, 0x69, 0x27, 0xc1, 0xbc, 0xc5, 0x9d, 0x34, - 0x21, 0x6b, 0xa8, 0x2d, 0x65, 0xb5, 0x68, 0xcc, 0x09, 0xc3, 0x06, 0xd3, 0x2e, 0x82, 0x79, 0xe9, - 0x81, 0x63, 0x37, 0x4a, 0xdc, 0xeb, 0x93, 0x0f, 0x1e, 0xaf, 0xcc, 0xfc, 0xf6, 0x78, 0x45, 0xbd, - 0xe5, 0xf8, 0xec, 0xd1, 0xfd, 0x73, 0x15, 0x19, 0x41, 0xf8, 0x68, 0xcc, 0x09, 0x74, 0xdb, 0xd6, - 0x2e, 0x81, 0x0a, 0xc5, 0x7d, 0x62, 0x21, 0x33, 0xe4, 0xa5, 0x51, 0xe6, 0xbe, 0x35, 0x27, 0xf9, - 0xd6, 0xe1, 0x30, 0xe1, 0x17, 0x8d, 0x7e, 0x6b, 0xaf, 0x03, 0xcd, 0xda, 0x81, 0xa4, 0x87, 0x6c, - 0x93, 0x20, 0x68, 0x9b, 0x1f, 0xf7, 0x31, 0x83, 0x8d, 0xd9, 0x96, 0xb2, 0xaa, 0x1a, 0xc7, 0xe4, - 0x3f, 0x06, 0x82, 0xf6, 0x07, 0xa1, 0x5d, 0xdb, 0x00, 0xf5, 0x00, 0x0e, 0x3c, 0xe4, 0x33, 0x13, - 0x0a, 0x2a, 0x1b, 0x73, 0x19, 0x24, 0xd7, 0xe4, 0x00, 0x69, 0xd5, 0x74, 0x50, 0x0d, 0x88, 0xe3, - 0x41, 0x32, 0x30, 0x69, 0x10, 0xc6, 0x3b, 0xdf, 0x52, 0x56, 0xab, 0x46, 0x45, 0x1a, 0x3b, 0x41, - 0xdb, 0xd6, 0x36, 0x41, 0xb3, 0xe7, 0xe2, 0x2e, 0x74, 0xcd, 0x5d, 0x87, 0xb0, 0x3e, 0x74, 0xcd, - 0x1e, 0xc1, 0xfd, 0xc0, 0xdc, 0x86, 0x9e, 0xe3, 0x0e, 0xc2, 0x41, 0x80, 0x0f, 0x5a, 0x16, 0xa8, - 0xdb, 0x02, 0xf4, 0x6e, 0x88, 0x79, 0x87, 0x43, 0xda, 0xb6, 0x76, 0x11, 0x94, 0x29, 0x83, 0xac, - 0x4f, 0x1b, 0x15, 0x4e, 0x4a, 0x6b, 0x12, 0x29, 0x42, 0x31, 0x1d, 0x8e, 0x33, 0x24, 0x5e, 0xff, - 0xa2, 0x20, 0x55, 0x75, 0x19, 0xb9, 0x28, 0x52, 0xd5, 0x1b, 0x60, 0x0e, 0x07, 0x88, 0x40, 0x86, - 0xb3, 0x85, 0x15, 0x21, 0x47, 0x5a, 0x2c, 0x4c, 0xa5, 0xc5, 0x62, 0x4a, 0x8b, 0x09, 0xa9, 0xa8, - 0x79, 0xa4, 0x92, 0x4d, 0x6a, 0x29, 0x8b, 0x54, 0xfd, 0xd3, 0x22, 0xf8, 0x2f, 0xa7, 0xe6, 0x56, - 0x60, 0x47, 0x09, 0xd7, 0xf6, 0xb7, 0xf1, 0x94, 0xf4, 0x64, 0xa6, 0x5e, 0x22, 0xdc, 0x62, 0x9e, - 0x70, 0x27, 0x0b, 0x5b, 0xdd, 0x43, 0xd8, 0xaf, 0xa5, 0x85, 0xcd, 0xf3, 0x30, 0x25, 0xdf, 0x64, - 0x2d, 0x28, 0x4f, 0x55, 0x0b, 0xb2, 0x57, 0x62, 0x36, 0x73, 0x25, 0xbe, 0x51, 0xc0, 0x71, 0x21, - 0x52, 0x87, 0x5a, 0xd8, 0x67, 0x8e, 0xdf, 0x1f, 0x2a, 0x35, 0xc1, 0x99, 0x92, 0x87, 0xb3, 0xcc, - 0xe5, 0x38, 0x0e, 0xca, 0x04, 0x41, 0x8a, 0x7d, 0xa9, 0x4c, 0xf9, 0x14, 0x56, 0x37, 0x9b, 0x27, - 0x4b, 0xac, 0xba, 0x09, 0xc3, 0x06, 0xd3, 0x1f, 0x97, 0x12, 0x55, 0xfa, 0x7a, 0xf7, 0x23, 0x64, - 0x31, 0xed, 0x3c, 0x98, 0xe5, 0xf5, 0x6f, 0x1f, 0x7a, 0x19, 0x02, 0xff, 0xfd, 0x6c, 0x5a, 0x01, - 0x15, 0xcc, 0xdd, 0x11, 0x00, 0x55, 0x00, 0x84, 0x29, 0xad, 0xbf, 0x72, 0x1e, 0x2e, 0x2f, 0x82, - 0x79, 0x39, 0xb5, 0x5c, 0xcf, 0xac, 0x91, 0x02, 0xdd, 0xb6, 0xd3, 0x15, 0x72, 0x2e, 0x5d, 0x21, - 0x4f, 0x83, 0x85, 0x00, 0x0e, 0x5c, 0x0c, 0x6d, 0x93, 0x3a, 0xf7, 0x10, 0x2f, 0xa2, 0xaa, 0x51, - 0x91, 0xb6, 0x8e, 0x73, 0x6f, 0x7c, 0xd7, 0x02, 0x53, 0x29, 0xf5, 0x34, 0x58, 0x08, 0xc5, 0x15, - 0xa6, 0x05, 0xdf, 0x5f, 0x2a, 0x9c, 0xa0, 0x8a, 0xb4, 0xf1, 0x0d, 0x24, 0xb1, 0xb1, 0x2d, 0xa4, - 0x36, 0xb6, 0x61, 0x11, 0xae, 0xee, 0x5d, 0x84, 0x85, 0x20, 0x92, 0x45, 0x58, 0x7b, 0x0f, 0xd4, - 0x09, 0xb2, 0xfb, 0xbe, 0x0d, 0x7d, 0x6b, 0x20, 0x5e, 0x5e, 0xdb, 0x3b, 0x04, 0x23, 0x82, 0xf2, - 0x10, 0x6a, 0x24, 0xf1, 0x3c, 0xbe, 0x4b, 0xd6, 0x73, 0xef, 0x92, 0xa7, 0xc0, 0xbc, 0xb5, 0x83, - 0xac, 0x3b, 0xb4, 0xef, 0xd1, 0xc6, 0xb1, 0x56, 0x71, 0x75, 0xc1, 0x18, 0x19, 0xf4, 0xbf, 0x14, - 0x70, 0x42, 0x08, 0x1c, 0xfa, 0x16, 0x72, 0x13, 0x32, 0x3f, 0xa0, 0xba, 0x38, 0x26, 0xdc, 0x62, - 0x4a, 0xb8, 0x29, 0x11, 0xa9, 0x69, 0x11, 0x25, 0x24, 0x5a, 0xce, 0x21, 0x51, 0xfd, 0x59, 0x01, - 0xd4, 0x79, 0xc4, 0x1d, 0x04, 0xdd, 0x43, 0x8e, 0x34, 0x11, 0x45, 0x29, 0x4f, 0xa2, 0x8d, 0xd4, - 0x59, 0xce, 0xa9, 0xce, 0x37, 0xc1, 0x89, 0x89, 0x15, 0x3c, 0x2a, 0xdd, 0x4b, 0xe9, 0xd2, 0xdd, - 0xb6, 0xb5, 0x0b, 0xe0, 0xb8, 0x8b, 0xad, 0x49, 0xa3, 0x44, 0x8a, 0xff, 0x87, 0xff, 0x9b, 0x1c, - 0x34, 0xe2, 0x7a, 0x0b, 0x07, 0x83, 0x17, 0xe2, 0xfa, 0x0c, 0xa8, 0x53, 0x62, 0x99, 0x69, 0xbe, - 0xab, 0x94, 0x58, 0x9b, 0x23, 0xca, 0x25, 0x2e, 0x4d, 0x7b, 0x88, 0xbb, 0x3e, 0x62, 0xfe, 0x0c, - 0xa8, 0xdb, 0x94, 0x25, 0xe6, 0x13, 0x15, 0xb4, 0x6a, 0x53, 0x96, 0x9c, 0x2f, 0xc4, 0xc5, 0xe7, - 0x2b, 0x45, 0xb8, 0xd8, 0x7c, 0x97, 0x40, 0x35, 0xf6, 0xde, 0xfd, 0x69, 0xb2, 0x12, 0xb9, 0xc4, - 0xbb, 0xe1, 0x6a, 0xec, 0x45, 0xfb, 0xab, 0xbb, 0x95, 0xc8, 0x87, 0xb6, 0xad, 0xff, 0xad, 0x24, - 0x5a, 0xbf, 0xa3, 0xa4, 0x6c, 0x35, 0x8f, 0xb2, 0xf7, 0x16, 0x5a, 0x69, 0x6f, 0xa1, 0xfd, 0xa8, - 0xc8, 0xe6, 0xce, 0x40, 0x5c, 0xf2, 0x47, 0x2c, 0xb5, 0xf3, 0x10, 0x30, 0xb1, 0x3d, 0x92, 0xc1, - 0x8c, 0xb9, 0xa5, 0x4c, 0xea, 0x39, 0x47, 0x6f, 0x2d, 0xe4, 0xa1, 0x7d, 0xaa, 0xf6, 0xe8, 0xb3, - 0x42, 0xa2, 0xa7, 0x96, 0x5a, 0x3c, 0xc0, 0x9e, 0xfa, 0x00, 0x75, 0x97, 0xec, 0x39, 0x4a, 0xd3, - 0xf4, 0x1c, 0xfa, 0xd7, 0x05, 0x70, 0x2c, 0xd6, 0x2e, 0x72, 0x75, 0xe6, 0x3e, 0xd3, 0xff, 0x1f, - 0x00, 0x21, 0xf9, 0x18, 0x07, 0xf3, 0xdc, 0xc2, 0x23, 0x7c, 0x0b, 0xcc, 0x45, 0x19, 0xb1, 0x8f, - 0x53, 0xc5, 0x6c, 0x4f, 0x16, 0xf0, 0xb1, 0x46, 0x42, 0xcd, 0xdd, 0x48, 0x9c, 0x07, 0xb3, 0x1e, - 0xf2, 0xba, 0x88, 0x84, 0xe7, 0x8b, 0xe2, 0xf3, 0xbb, 0x5e, 0x09, 0xd4, 0x96, 0x40, 0x09, 0xdd, - 0x65, 0x04, 0x8a, 0x72, 0x68, 0x88, 0x07, 0xfd, 0x4b, 0x45, 0xd2, 0x24, 0x4a, 0xd5, 0x18, 0x4d, - 0x85, 0x69, 0x68, 0x2a, 0x3e, 0x8f, 0x26, 0x75, 0xff, 0x34, 0xe9, 0xbf, 0x2a, 0x72, 0xcb, 0x7a, - 0x1f, 0xc1, 0x5d, 0xe9, 0xda, 0x25, 0x50, 0x13, 0x01, 0x45, 0x07, 0xac, 0xac, 0xa5, 0xac, 0x0a, - 0xfc, 0xf0, 0xe4, 0x75, 0x44, 0x62, 0xfb, 0xbd, 0x20, 0x2b, 0x8b, 0x48, 0x57, 0x1e, 0xdc, 0x55, - 0xee, 0xe8, 0x4b, 0xba, 0x22, 0x38, 0x98, 0xb8, 0xb4, 0xb7, 0x87, 0xeb, 0x43, 0x4d, 0x86, 0xc3, - 0x35, 0xca, 0x14, 0xe8, 0x82, 0xc4, 0xdf, 0xc4, 0x1b, 0xb6, 0xad, 0x5d, 0x06, 0x8b, 0xb1, 0xf1, - 0xa2, 0xba, 0x35, 0xca, 0x19, 0x53, 0xd4, 0xa3, 0x29, 0x84, 0x8a, 0xf5, 0x3f, 0x95, 0x44, 0x31, - 0xe4, 0xec, 0x5e, 0x09, 0xf5, 0xfe, 0x6a, 0x93, 0x1b, 0xa5, 0x70, 0x29, 0x9e, 0xc2, 0x0f, 0x86, - 0xdd, 0xc6, 0x55, 0x87, 0x10, 0x4c, 0x5e, 0xe8, 0xa2, 0x29, 0xdf, 0x4d, 0x4a, 0xae, 0x8b, 0x23, - 0x1d, 0x54, 0x6d, 0x44, 0x99, 0x69, 0xed, 0x40, 0xc7, 0x1f, 0xf5, 0x10, 0x95, 0xd0, 0xb8, 0x15, - 0xda, 0xda, 0xb6, 0xfe, 0xfd, 0xf0, 0x08, 0x14, 0x0f, 0xc5, 0x40, 0xb4, 0xef, 0xb2, 0x70, 0x57, - 0x94, 0x6d, 0xb6, 0xc2, 0x07, 0x0e, 0x9b, 0xe8, 0x43, 0x76, 0xf9, 0x59, 0x92, 0xfd, 0x57, 0xb6, - 0xd7, 0xdb, 0x4f, 0xac, 0x3f, 0x25, 0x97, 0x47, 0xc4, 0xfa, 0xa2, 0xcb, 0x73, 0xc8, 0x31, 0xfd, - 0x30, 0xdc, 0x00, 0x45, 0x4c, 0x47, 0xaa, 0x4f, 0x48, 0xf9, 0xaf, 0xa6, 0xfd, 0xff, 0x76, 0xd8, - 0xa2, 0xc6, 0xfc, 0xcf, 0x58, 0x92, 0x43, 0xf4, 0x76, 0x57, 0x0a, 0xa8, 0xc3, 0xa0, 0x8b, 0x6e, - 0x60, 0xd7, 0xb1, 0x06, 0x5b, 0x2e, 0x82, 0x7e, 0x3f, 0xd0, 0x96, 0xc1, 0x5c, 0xd7, 0xc5, 0xd6, - 0x9d, 0x6b, 0x7d, 0x8f, 0xfb, 0x5b, 0x34, 0xa2, 0xe7, 0xb0, 0x61, 0x92, 0x9d, 0xaf, 0xe3, 0x6f, - 0x63, 0xee, 0x72, 0x65, 0x72, 0xc3, 0x24, 0x36, 0x80, 0xb0, 0xef, 0x35, 0x80, 0x1d, 0xfd, 0xd6, - 0x1f, 0x29, 0x60, 0x49, 0xb2, 0xd4, 0x23, 0x90, 0x39, 0xd8, 0x7f, 0x89, 0x65, 0x32, 0xd7, 0x85, - 0xf3, 0x59, 0xb0, 0x18, 0x1e, 0x3e, 0x27, 0xdd, 0xba, 0xd4, 0x6c, 0xca, 0x6e, 0x8c, 0x2e, 0x5e, - 0xf4, 0xef, 0x14, 0xb0, 0x1c, 0xbb, 0x30, 0x3a, 0xea, 0xa1, 0xe9, 0x5f, 0x15, 0xc0, 0x29, 0x79, - 0x05, 0xe1, 0x05, 0xe1, 0xd2, 0x1c, 0xf9, 0xc5, 0xc8, 0xbe, 0x62, 0x57, 0x33, 0xbf, 0x20, 0x9d, - 0x05, 0x8b, 0x94, 0x58, 0x63, 0x0b, 0x2a, 0x0a, 0x51, 0x8d, 0x12, 0x2b, 0xb6, 0xa0, 0x9b, 0xed, - 0x07, 0x4f, 0x9a, 0xca, 0xc3, 0x27, 0x4d, 0xe5, 0x8f, 0x27, 0x4d, 0xe5, 0xf3, 0xa7, 0xcd, 0x99, - 0x87, 0x4f, 0x9b, 0x33, 0xbf, 0x3c, 0x6d, 0xce, 0x7c, 0xb8, 0xde, 0x73, 0xd8, 0x4e, 0xbf, 0xbb, - 0x66, 0x61, 0x6f, 0xbd, 0xeb, 0x77, 0xcf, 0xf1, 0x1c, 0x5b, 0x8f, 0x7d, 0xd7, 0xbc, 0x9b, 0xfc, - 0xb2, 0xd9, 0x2d, 0xf3, 0x4f, 0x9b, 0x17, 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0x30, 0xf3, 0x5c, - 0x69, 0x83, 0x1d, 0x00, 0x00, + // 1631 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xcd, 0x73, 0xdb, 0x44, + 0x1f, 0x8e, 0xfc, 0x15, 0x67, 0x1d, 0xdb, 0x8d, 0xde, 0xbc, 0xa9, 0xdf, 0xb4, 0xaf, 0xe3, 0xea, + 0x50, 0x52, 0x86, 0xda, 0x4c, 0x0a, 0x4c, 0x6f, 0x9d, 0x7c, 0x14, 0xc6, 0x03, 0xfd, 0x40, 0x69, + 0x7b, 0xe0, 0xa2, 0x59, 0x4b, 0x1b, 0x47, 0x54, 0xd2, 0x8a, 0xdd, 0x75, 0x5a, 0xf7, 0x1f, 0xe0, + 0xc4, 0x4c, 0x8f, 0x70, 0xe1, 0xcc, 0x0c, 0xc3, 0x0c, 0x87, 0x5e, 0xb9, 0x97, 0x5b, 0x29, 0x17, + 0x3e, 0x66, 0x0a, 0xd3, 0x9e, 0xca, 0x0c, 0x03, 0x67, 0x4e, 0x8c, 0x76, 0xd7, 0xb2, 0x64, 0x39, + 0x75, 0x94, 0x92, 0x26, 0xe5, 0x66, 0xad, 0x9f, 0x5d, 0xfd, 0x7e, 0xcf, 0x3e, 0xfb, 0xec, 0x6f, + 0x57, 0x60, 0xa9, 0x4b, 0x10, 0xf2, 0xb6, 0x6c, 0xe4, 0x58, 0x2d, 0xca, 0x30, 0x81, 0x5d, 0xd4, + 0x42, 0x3b, 0xc8, 0x63, 0xb4, 0xe9, 0x13, 0xcc, 0xb0, 0xaa, 0x0e, 0x01, 0x4d, 0x09, 0x58, 0xfc, + 0x9f, 0x89, 0xa9, 0x8b, 0xa9, 0xc1, 0x11, 0x2d, 0xf1, 0x20, 0xe0, 0x8b, 0xf3, 0x5d, 0xdc, 0xc5, + 0xa2, 0x3d, 0xf8, 0x25, 0x5b, 0x97, 0xba, 0x18, 0x77, 0x1d, 0xd4, 0xe2, 0x4f, 0x9d, 0xde, 0x56, + 0x8b, 0xd9, 0x2e, 0xa2, 0x0c, 0xba, 0x7e, 0x08, 0x48, 0x86, 0x61, 0x62, 0xd7, 0xc5, 0x9e, 0x04, + 0xd4, 0xc7, 0x00, 0x58, 0xdf, 0x47, 0xf2, 0xbd, 0xda, 0xf7, 0x39, 0x30, 0x77, 0x31, 0x88, 0x7b, + 0x9d, 0x20, 0xc8, 0xd0, 0x5a, 0xcf, 0xbc, 0x89, 0x98, 0xda, 0x04, 0x79, 0x7c, 0xcb, 0x43, 0xa4, + 0xa6, 0x34, 0x94, 0xe5, 0x99, 0xb5, 0xda, 0xc3, 0x7b, 0x67, 0xe7, 0x65, 0xb8, 0xab, 0x96, 0x45, + 0x10, 0xa5, 0x9b, 0x8c, 0xd8, 0x5e, 0x57, 0x17, 0x30, 0x75, 0x09, 0x94, 0x3a, 0xbc, 0xa7, 0xe1, + 0x41, 0x17, 0xd5, 0x32, 0x41, 0x2f, 0x1d, 0x88, 0xa6, 0xcb, 0xd0, 0x45, 0xea, 0x1a, 0x00, 0x3b, + 0x36, 0xb5, 0x3b, 0xb6, 0x63, 0xb3, 0x7e, 0x2d, 0xdb, 0x50, 0x96, 0x2b, 0x2b, 0x5a, 0x33, 0x49, + 0x51, 0xf3, 0x46, 0x88, 0xba, 0xd6, 0xf7, 0x91, 0x1e, 0xe9, 0xa5, 0x9e, 0x00, 0x33, 0x26, 0x0f, + 0xd2, 0x80, 0xac, 0x96, 0x6b, 0x28, 0xcb, 0x59, 0xbd, 0x28, 0x1a, 0x56, 0x99, 0x7a, 0x1e, 0xcc, + 0xc8, 0x08, 0x6c, 0xab, 0x96, 0xe7, 0x51, 0x9f, 0xb8, 0xff, 0x68, 0x69, 0xea, 0xa7, 0x47, 0x4b, + 0xb9, 0xeb, 0xb6, 0xc7, 0x1e, 0xde, 0x3b, 0x5b, 0x92, 0x19, 0x04, 0x8f, 0x7a, 0x51, 0xa0, 0xdb, + 0x96, 0x7a, 0x01, 0x94, 0x28, 0xee, 0x11, 0x13, 0x19, 0x01, 0x2f, 0xb5, 0x02, 0x8f, 0xad, 0x3e, + 0x2e, 0xb6, 0x4d, 0x0e, 0x13, 0x71, 0xd1, 0xf0, 0xb7, 0xfa, 0x1a, 0x50, 0xcd, 0x6d, 0x48, 0xba, + 0xc8, 0x32, 0x08, 0x82, 0x96, 0xf1, 0x51, 0x0f, 0x33, 0x58, 0x9b, 0x6e, 0x28, 0xcb, 0x39, 0xfd, + 0x98, 0xfc, 0x47, 0x47, 0xd0, 0x7a, 0x3f, 0x68, 0x57, 0x57, 0x41, 0xd5, 0x87, 0x7d, 0x17, 0x79, + 0xcc, 0x80, 0x82, 0xca, 0x5a, 0x71, 0x02, 0xc9, 0x15, 0xd9, 0x41, 0xb6, 0xaa, 0x1a, 0x28, 0xfb, + 0xc4, 0x76, 0x21, 0xe9, 0x1b, 0xd4, 0x0f, 0xf2, 0x9d, 0x69, 0x28, 0xcb, 0x65, 0xbd, 0x24, 0x1b, + 0x37, 0xfd, 0xb6, 0xa5, 0xae, 0x81, 0x7a, 0xd7, 0xc1, 0x1d, 0xe8, 0x18, 0x3b, 0x36, 0x61, 0x3d, + 0xe8, 0x18, 0x5d, 0x82, 0x7b, 0xbe, 0xb1, 0x05, 0x5d, 0xdb, 0xe9, 0x07, 0x9d, 0x00, 0xef, 0xb4, + 0x28, 0x50, 0x37, 0x04, 0xe8, 0x9d, 0x00, 0xf3, 0x36, 0x87, 0xb4, 0x2d, 0xf5, 0x3c, 0x28, 0x50, + 0x06, 0x59, 0x8f, 0xd6, 0x4a, 0x9c, 0x94, 0xc6, 0x38, 0x52, 0x84, 0x62, 0x36, 0x39, 0x4e, 0x97, + 0x78, 0xed, 0xd3, 0x8c, 0x54, 0xd5, 0x06, 0x72, 0x50, 0xa8, 0xaa, 0x37, 0x40, 0x11, 0xfb, 0x88, + 0x40, 0x86, 0x27, 0x0b, 0x2b, 0x44, 0x0e, 0xb5, 0x98, 0xd9, 0x97, 0x16, 0xb3, 0x09, 0x2d, 0xc6, + 0xa4, 0x92, 0x4b, 0x23, 0x95, 0xc9, 0xa4, 0xe6, 0x27, 0x91, 0xaa, 0x7d, 0x9c, 0x05, 0xff, 0xe5, + 0xd4, 0x5c, 0xf7, 0xad, 0x70, 0xc1, 0xb5, 0xbd, 0x2d, 0xbc, 0x4f, 0x7a, 0x26, 0x2e, 0xbd, 0x58, + 0xba, 0xd9, 0x34, 0xe9, 0x8e, 0x17, 0x76, 0x6e, 0x17, 0x61, 0xbf, 0x92, 0x14, 0x36, 0x5f, 0x87, + 0x09, 0xf9, 0xc6, 0xbd, 0xa0, 0xb0, 0x2f, 0x2f, 0x98, 0x3c, 0x13, 0xd3, 0x13, 0x67, 0xe2, 0x0b, + 0x05, 0x2c, 0x08, 0x91, 0xda, 0xd4, 0xc4, 0x1e, 0xb3, 0xbd, 0xde, 0x40, 0xa9, 0x31, 0xce, 0x94, + 0x34, 0x9c, 0x4d, 0x9c, 0x8e, 0x05, 0x50, 0x20, 0x08, 0x52, 0xec, 0x49, 0x65, 0xca, 0xa7, 0xc0, + 0xdd, 0x2c, 0xbe, 0x58, 0x22, 0xee, 0x26, 0x1a, 0x56, 0x99, 0xf6, 0x28, 0x1f, 0x73, 0xe9, 0x2b, + 0x9d, 0x0f, 0x91, 0xc9, 0xd4, 0x15, 0x30, 0xcd, 0xfd, 0x6f, 0x0f, 0x7a, 0x19, 0x00, 0xff, 0xf9, + 0xd5, 0xb4, 0x04, 0x4a, 0x98, 0x87, 0x23, 0x00, 0x39, 0x01, 0x10, 0x4d, 0x49, 0xfd, 0x15, 0xd2, + 0x70, 0x79, 0x1e, 0xcc, 0xc8, 0xa1, 0xe5, 0x7c, 0x4e, 0xea, 0x29, 0xd0, 0x6d, 0x2b, 0xe9, 0x90, + 0xc5, 0xa4, 0x43, 0x9e, 0x02, 0xb3, 0x3e, 0xec, 0x3b, 0x18, 0x5a, 0x06, 0xb5, 0xef, 0x20, 0x6e, + 0xa2, 0x39, 0xbd, 0x24, 0xdb, 0x36, 0xed, 0x3b, 0xa3, 0xbb, 0x16, 0xd8, 0x97, 0x52, 0x4f, 0x81, + 0xd9, 0x40, 0x5c, 0xc1, 0xb2, 0xe0, 0xfb, 0x4b, 0x89, 0x13, 0x54, 0x92, 0x6d, 0x7c, 0x03, 0x89, + 0x6d, 0x6c, 0xb3, 0x89, 0x8d, 0x6d, 0x60, 0xc2, 0xe5, 0xdd, 0x4d, 0x58, 0x08, 0x22, 0x6e, 0xc2, + 0xea, 0xbb, 0xa0, 0x4a, 0x90, 0xd5, 0xf3, 0x2c, 0xe8, 0x99, 0x7d, 0xf1, 0xf2, 0xca, 0xee, 0x29, + 0xe8, 0x21, 0x94, 0xa7, 0x50, 0x21, 0xb1, 0xe7, 0xd1, 0x5d, 0xb2, 0x9a, 0x7a, 0x97, 0x3c, 0x09, + 0x66, 0xcc, 0x6d, 0x64, 0xde, 0xa4, 0x3d, 0x97, 0xd6, 0x8e, 0x35, 0xb2, 0xcb, 0xb3, 0xfa, 0xb0, + 0x41, 0xfb, 0x43, 0x01, 0xc7, 0x85, 0xc0, 0xa1, 0x67, 0x22, 0x27, 0x26, 0xf3, 0x03, 0xf2, 0xc5, + 0x11, 0xe1, 0x66, 0x13, 0xc2, 0x4d, 0x88, 0x28, 0x97, 0x14, 0x51, 0x4c, 0xa2, 0x85, 0x14, 0x12, + 0xd5, 0x9e, 0x66, 0x40, 0x95, 0x67, 0xbc, 0x89, 0xa0, 0x73, 0xc8, 0x99, 0xc6, 0xb2, 0xc8, 0xa7, + 0x59, 0x68, 0x43, 0x75, 0x16, 0x52, 0xaa, 0xf3, 0x4d, 0x70, 0x7c, 0xac, 0x83, 0x87, 0xd6, 0x3d, + 0x9f, 0xb4, 0xee, 0xb6, 0xa5, 0x9e, 0x03, 0x0b, 0x0e, 0x36, 0xc7, 0xf5, 0x12, 0x4b, 0xfc, 0x3f, + 0xfc, 0xdf, 0x78, 0xa7, 0x21, 0xd7, 0xeb, 0xd8, 0xef, 0x3f, 0x17, 0xd7, 0xa7, 0x41, 0x95, 0x12, + 0xd3, 0x48, 0xf2, 0x5d, 0xa6, 0xc4, 0x5c, 0x1b, 0x52, 0x2e, 0x71, 0x49, 0xda, 0x03, 0xdc, 0x95, + 0x21, 0xf3, 0xa7, 0x41, 0xd5, 0xa2, 0x2c, 0x36, 0x9e, 0x70, 0xd0, 0xb2, 0x45, 0x59, 0x7c, 0xbc, + 0x00, 0x17, 0x1d, 0x2f, 0x1f, 0xe2, 0x22, 0xe3, 0x5d, 0x00, 0xe5, 0xc8, 0x7b, 0xf7, 0xa6, 0xc9, + 0x52, 0x18, 0x12, 0xaf, 0x86, 0xcb, 0x91, 0x17, 0xed, 0xcd, 0x77, 0x4b, 0x61, 0x0c, 0x6d, 0x4b, + 0xfb, 0x4b, 0x89, 0x95, 0x7e, 0x47, 0x49, 0xd9, 0xb9, 0x34, 0xca, 0xde, 0x5d, 0x68, 0xf9, 0xdd, + 0x85, 0xf6, 0xad, 0x22, 0x8b, 0x3b, 0x1d, 0x71, 0xc9, 0x1f, 0xb1, 0xa5, 0x9d, 0x86, 0x80, 0xb1, + 0xe5, 0x91, 0x4c, 0x66, 0x24, 0x2c, 0x65, 0x5c, 0xcd, 0x39, 0x7c, 0x6b, 0x26, 0x0d, 0xed, 0xfb, + 0x2a, 0x8f, 0x3e, 0xc9, 0xc4, 0x6a, 0x6a, 0xa9, 0xc5, 0x03, 0xac, 0xa9, 0x0f, 0x50, 0x77, 0xf1, + 0x9a, 0x23, 0xbf, 0x9f, 0x9a, 0x43, 0xfb, 0x53, 0x01, 0xc7, 0x22, 0xe5, 0x22, 0x57, 0x67, 0xea, + 0x33, 0xfd, 0xff, 0x01, 0x10, 0x92, 0x8f, 0x70, 0x30, 0xc3, 0x5b, 0x78, 0x86, 0x6f, 0x81, 0x62, + 0xb8, 0x22, 0xf6, 0x70, 0xaa, 0x98, 0xee, 0x4a, 0x03, 0x1f, 0x29, 0x24, 0x72, 0xa9, 0x0b, 0x89, + 0x79, 0x90, 0x47, 0xb7, 0x19, 0x81, 0xd2, 0x00, 0xc5, 0x83, 0xf6, 0xd9, 0x20, 0x65, 0x61, 0x3b, + 0x23, 0x29, 0x67, 0xf6, 0x93, 0x72, 0xf6, 0x59, 0x29, 0xe7, 0xf6, 0x9e, 0xb2, 0xf6, 0xa3, 0x22, + 0xb7, 0x9f, 0xf7, 0x10, 0xdc, 0x91, 0xa1, 0x5d, 0x00, 0x15, 0x17, 0xb9, 0x1d, 0x44, 0xc2, 0xc3, + 0xd2, 0xa4, 0x69, 0x29, 0x0b, 0xfc, 0xe0, 0x14, 0x75, 0x44, 0x72, 0xfb, 0x3d, 0x23, 0x5d, 0x42, + 0x2c, 0x3d, 0x9e, 0xdc, 0x25, 0x1e, 0xe8, 0x0b, 0x3a, 0xee, 0x1f, 0x4c, 0x5e, 0xea, 0xd5, 0xc1, + 0xfc, 0x50, 0x83, 0xe1, 0x60, 0x8e, 0x6a, 0xf9, 0x46, 0x76, 0xb9, 0xb4, 0xf2, 0xea, 0x38, 0xa5, + 0x72, 0x02, 0x22, 0xa9, 0x6f, 0x20, 0x06, 0x6d, 0x47, 0x9f, 0x95, 0x23, 0x5c, 0xc3, 0xab, 0x96, + 0xa5, 0x6e, 0x80, 0xb9, 0xc8, 0x88, 0xc2, 0xbb, 0x6a, 0x85, 0x46, 0xf6, 0x99, 0x49, 0x56, 0xc3, + 0x21, 0x84, 0xae, 0xb5, 0x9f, 0x33, 0xe1, 0x0e, 0xe3, 0xa1, 0x5b, 0xff, 0x1a, 0xba, 0x47, 0x5c, + 0x21, 0x9f, 0xda, 0x15, 0x36, 0xc0, 0xb4, 0xa4, 0x8a, 0x73, 0x9a, 0x6e, 0xa2, 0x06, 0x5d, 0x03, + 0x17, 0x59, 0x18, 0x8f, 0x51, 0x5f, 0x07, 0x05, 0x81, 0x9a, 0x48, 0xae, 0xc4, 0xa9, 0x97, 0x40, + 0x15, 0xdd, 0xf6, 0x6d, 0x02, 0x99, 0x8d, 0x3d, 0x83, 0xd9, 0xd2, 0x45, 0x4b, 0x2b, 0x8b, 0x4d, + 0x71, 0xad, 0xdb, 0x1c, 0x5c, 0xeb, 0x36, 0xaf, 0x0d, 0xae, 0x75, 0xd7, 0x8a, 0x01, 0x5d, 0x77, + 0x7f, 0x59, 0x52, 0xf4, 0xca, 0xb0, 0x73, 0xf0, 0xb7, 0xf6, 0x9b, 0x12, 0xdb, 0xe4, 0x78, 0x84, + 0x17, 0x03, 0xef, 0x7b, 0xb9, 0x67, 0x7e, 0xbc, 0x9d, 0xdf, 0x1f, 0x54, 0x91, 0x97, 0x6c, 0x42, + 0x30, 0x79, 0xae, 0x0b, 0xc4, 0x74, 0x37, 0x64, 0xa9, 0x2e, 0x04, 0x35, 0x50, 0xb6, 0x10, 0x65, + 0x86, 0xb9, 0x0d, 0x6d, 0x6f, 0x58, 0x1b, 0x96, 0x82, 0xc6, 0xf5, 0xa0, 0xad, 0x6d, 0x69, 0x5f, + 0x0f, 0x8e, 0xb6, 0xd1, 0x54, 0x74, 0x44, 0x7b, 0x0e, 0x0b, 0xaa, 0x1d, 0x79, 0x7c, 0x52, 0x78, + 0xc7, 0xc1, 0xe1, 0xe8, 0x90, 0x43, 0x7e, 0x1a, 0x67, 0xff, 0xa5, 0xad, 0xe1, 0xf7, 0x92, 0xeb, + 0x77, 0xf1, 0xe9, 0x11, 0xb9, 0x3e, 0xef, 0xf4, 0x1c, 0x72, 0x4e, 0xdf, 0x0c, 0x8a, 0x21, 0x91, + 0xd3, 0x91, 0xaa, 0xff, 0x12, 0xf1, 0xe7, 0x92, 0xf1, 0x7f, 0x39, 0xb0, 0xe1, 0x48, 0xfc, 0x13, + 0xa6, 0xe4, 0x10, 0xa3, 0xdd, 0x91, 0x02, 0xda, 0x64, 0xd0, 0x41, 0x57, 0xb1, 0x63, 0x9b, 0xfd, + 0x75, 0x07, 0x41, 0xaf, 0xe7, 0xab, 0x8b, 0xa0, 0xd8, 0x71, 0xb0, 0x79, 0xf3, 0x72, 0xcf, 0xe5, + 0xf1, 0x66, 0xf5, 0xf0, 0x39, 0xd8, 0xf2, 0xe4, 0x89, 0xc6, 0xf6, 0xb6, 0xb0, 0xdc, 0x1a, 0xc6, + 0x6e, 0x79, 0x62, 0xeb, 0x0f, 0xce, 0x33, 0x3a, 0xb0, 0xc2, 0xdf, 0xda, 0x43, 0x05, 0xcc, 0x4b, + 0x96, 0xba, 0x62, 0x9f, 0x78, 0x81, 0x36, 0x99, 0xea, 0x43, 0xc2, 0x19, 0x30, 0x67, 0x51, 0x66, + 0x8c, 0xbb, 0x4d, 0xab, 0x58, 0x94, 0x5d, 0x1d, 0x5e, 0xa8, 0x69, 0x5f, 0x29, 0x60, 0x31, 0x72, + 0x11, 0x78, 0xd4, 0x53, 0xd3, 0x3e, 0xcf, 0x80, 0x93, 0xf2, 0x6a, 0xc9, 0xf5, 0x83, 0xa9, 0x39, + 0xf2, 0x93, 0x31, 0xf9, 0xd3, 0x49, 0x6e, 0xe2, 0x97, 0xc1, 0x33, 0x60, 0x8e, 0x12, 0x73, 0x64, + 0x42, 0x85, 0x11, 0x55, 0x28, 0x31, 0x23, 0x13, 0xba, 0xd6, 0xbe, 0xff, 0xb8, 0xae, 0x3c, 0x78, + 0x5c, 0x57, 0x7e, 0x7d, 0x5c, 0x57, 0xee, 0x3e, 0xa9, 0x4f, 0x3d, 0x78, 0x52, 0x9f, 0xfa, 0xe1, + 0x49, 0x7d, 0xea, 0x83, 0x56, 0xd7, 0x66, 0xdb, 0xbd, 0x4e, 0xd3, 0xc4, 0x6e, 0xab, 0xe3, 0x75, + 0xce, 0xf2, 0x35, 0xd6, 0x8a, 0x7c, 0xaf, 0xbe, 0x1d, 0xff, 0x62, 0xdd, 0x29, 0xf0, 0x7a, 0xe9, + 0xdc, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x83, 0xef, 0x07, 0x7c, 0x1f, 0x00, 0x00, } func (m *EventCreateBucket) Marshal() (dAtA []byte, err error) { @@ -3092,16 +3232,7 @@ func (m *EventCreateGroup) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Extra) i = encodeVarintEvents(dAtA, i, uint64(len(m.Extra))) i-- - dAtA[i] = 0x32 - } - if len(m.Members) > 0 { - for iNdEx := len(m.Members) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Members[iNdEx]) - copy(dAtA[i:], m.Members[iNdEx]) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Members[iNdEx]))) - i-- - dAtA[i] = 0x2a - } + dAtA[i] = 0x2a } if m.SourceType != 0 { i = encodeVarintEvents(dAtA, i, uint64(m.SourceType)) @@ -3267,9 +3398,14 @@ func (m *EventUpdateGroupMember) MarshalToSizedBuffer(dAtA []byte) (int, error) } if len(m.MembersToAdd) > 0 { for iNdEx := len(m.MembersToAdd) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.MembersToAdd[iNdEx]) - copy(dAtA[i:], m.MembersToAdd[iNdEx]) - i = encodeVarintEvents(dAtA, i, uint64(len(m.MembersToAdd[iNdEx]))) + { + size, err := m.MembersToAdd[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x2a } @@ -3308,6 +3444,117 @@ func (m *EventUpdateGroupMember) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *EventRenewGroupMember) 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 *EventRenewGroupMember) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventRenewGroupMember) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Members) > 0 { + for iNdEx := len(m.Members) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Members[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.SourceType != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.SourceType)) + i-- + dAtA[i] = 0x28 + } + { + size := m.GroupId.Size() + i -= size + if _, err := m.GroupId.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + if len(m.GroupName) > 0 { + i -= len(m.GroupName) + copy(dAtA[i:], m.GroupName) + i = encodeVarintEvents(dAtA, i, uint64(len(m.GroupName))) + i-- + dAtA[i] = 0x1a + } + if len(m.Owner) > 0 { + i -= len(m.Owner) + copy(dAtA[i:], m.Owner) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Owner))) + i-- + dAtA[i] = 0x12 + } + if len(m.Operator) > 0 { + i -= len(m.Operator) + copy(dAtA[i:], m.Operator) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Operator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EventGroupMemberDetail) 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 *EventGroupMemberDetail) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventGroupMemberDetail) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.ExpirationTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.ExpirationTime):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintEvents(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x12 + if len(m.Member) > 0 { + i -= len(m.Member) + copy(dAtA[i:], m.Member) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Member))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *EventUpdateGroupExtra) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4287,12 +4534,6 @@ func (m *EventCreateGroup) Size() (n int) { if m.SourceType != 0 { n += 1 + sovEvents(uint64(m.SourceType)) } - if len(m.Members) > 0 { - for _, s := range m.Members { - l = len(s) - n += 1 + l + sovEvents(uint64(l)) - } - } l = len(m.Extra) if l > 0 { n += 1 + l + sovEvents(uint64(l)) @@ -4363,8 +4604,8 @@ func (m *EventUpdateGroupMember) Size() (n int) { l = m.GroupId.Size() n += 1 + l + sovEvents(uint64(l)) if len(m.MembersToAdd) > 0 { - for _, s := range m.MembersToAdd { - l = len(s) + for _, e := range m.MembersToAdd { + l = e.Size() n += 1 + l + sovEvents(uint64(l)) } } @@ -4377,7 +4618,7 @@ func (m *EventUpdateGroupMember) Size() (n int) { return n } -func (m *EventUpdateGroupExtra) Size() (n int) { +func (m *EventRenewGroupMember) Size() (n int) { if m == nil { return 0 } @@ -4397,49 +4638,96 @@ func (m *EventUpdateGroupExtra) Size() (n int) { } l = m.GroupId.Size() n += 1 + l + sovEvents(uint64(l)) - l = len(m.Extra) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) + if m.SourceType != 0 { + n += 1 + sovEvents(uint64(m.SourceType)) + } + if len(m.Members) > 0 { + for _, e := range m.Members { + l = e.Size() + n += 1 + l + sovEvents(uint64(l)) + } } return n } -func (m *EventMirrorBucket) Size() (n int) { +func (m *EventGroupMemberDetail) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Operator) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.BucketName) + l = len(m.Member) if l > 0 { n += 1 + l + sovEvents(uint64(l)) } - l = m.BucketId.Size() + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.ExpirationTime) n += 1 + l + sovEvents(uint64(l)) - if m.DestChainId != 0 { - n += 1 + sovEvents(uint64(m.DestChainId)) - } return n } -func (m *EventMirrorBucketResult) Size() (n int) { +func (m *EventUpdateGroupExtra) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Status != 0 { - n += 1 + sovEvents(uint64(m.Status)) + l = len(m.Operator) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) } - l = len(m.BucketName) + l = len(m.Owner) if l > 0 { n += 1 + l + sovEvents(uint64(l)) } - l = m.BucketId.Size() + l = len(m.GroupName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = m.GroupId.Size() + n += 1 + l + sovEvents(uint64(l)) + l = len(m.Extra) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + return n +} + +func (m *EventMirrorBucket) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Operator) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.BucketName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = m.BucketId.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.DestChainId != 0 { + n += 1 + sovEvents(uint64(m.DestChainId)) + } + return n +} + +func (m *EventMirrorBucketResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Status != 0 { + n += 1 + sovEvents(uint64(m.Status)) + } + l = len(m.BucketName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = m.BucketId.Size() n += 1 + l + sovEvents(uint64(l)) if m.DestChainId != 0 { n += 1 + sovEvents(uint64(m.DestChainId)) @@ -7595,7 +7883,7 @@ func (m *EventCreateGroup) Unmarshal(dAtA []byte) error { } case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Members", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Extra", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -7623,11 +7911,61 @@ func (m *EventCreateGroup) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Members = append(m.Members, string(dAtA[iNdEx:postIndex])) + m.Extra = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventDeleteGroup) 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 ErrIntOverflowEvents + } + 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: EventDeleteGroup: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventDeleteGroup: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Extra", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Owner", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -7655,7 +7993,73 @@ func (m *EventCreateGroup) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Extra = string(dAtA[iNdEx:postIndex]) + m.Owner = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GroupName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GroupName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GroupId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.GroupId.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -7678,7 +8082,7 @@ func (m *EventCreateGroup) Unmarshal(dAtA []byte) error { } return nil } -func (m *EventDeleteGroup) Unmarshal(dAtA []byte) error { +func (m *EventLeaveGroup) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7701,12 +8105,44 @@ func (m *EventDeleteGroup) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EventDeleteGroup: wiretype end group for non-group") + return fmt.Errorf("proto: EventLeaveGroup: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EventDeleteGroup: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EventLeaveGroup: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MemberAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MemberAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Owner", wireType) @@ -7826,7 +8262,7 @@ func (m *EventDeleteGroup) Unmarshal(dAtA []byte) error { } return nil } -func (m *EventLeaveGroup) Unmarshal(dAtA []byte) error { +func (m *EventUpdateGroupMember) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7849,15 +8285,15 @@ func (m *EventLeaveGroup) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EventLeaveGroup: wiretype end group for non-group") + return fmt.Errorf("proto: EventUpdateGroupMember: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EventLeaveGroup: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EventUpdateGroupMember: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MemberAddress", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -7885,7 +8321,7 @@ func (m *EventLeaveGroup) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.MemberAddress = string(dAtA[iNdEx:postIndex]) + m.Operator = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -7985,6 +8421,72 @@ func (m *EventLeaveGroup) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MembersToAdd", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MembersToAdd = append(m.MembersToAdd, &EventGroupMemberDetail{}) + if err := m.MembersToAdd[len(m.MembersToAdd)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MembersToDelete", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MembersToDelete = append(m.MembersToDelete, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -8006,7 +8508,7 @@ func (m *EventLeaveGroup) Unmarshal(dAtA []byte) error { } return nil } -func (m *EventUpdateGroupMember) Unmarshal(dAtA []byte) error { +func (m *EventRenewGroupMember) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8029,10 +8531,10 @@ func (m *EventUpdateGroupMember) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EventUpdateGroupMember: wiretype end group for non-group") + return fmt.Errorf("proto: EventRenewGroupMember: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EventUpdateGroupMember: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EventRenewGroupMember: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -8166,10 +8668,29 @@ func (m *EventUpdateGroupMember) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceType", wireType) + } + m.SourceType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SourceType |= SourceType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MembersToAdd", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Members", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -8179,27 +8700,79 @@ func (m *EventUpdateGroupMember) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.MembersToAdd = append(m.MembersToAdd, string(dAtA[iNdEx:postIndex])) + m.Members = append(m.Members, &EventGroupMemberDetail{}) + if err := m.Members[len(m.Members)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 6: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventGroupMemberDetail) 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 ErrIntOverflowEvents + } + 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: EventGroupMemberDetail: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventGroupMemberDetail: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MembersToDelete", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Member", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8227,7 +8800,40 @@ func (m *EventUpdateGroupMember) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.MembersToDelete = append(m.MembersToDelete, string(dAtA[iNdEx:postIndex])) + m.Member = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpirationTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.ExpirationTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex diff --git a/x/storage/types/expected_keepers.go b/x/storage/types/expected_keepers.go index 1ff74670e..c9248665a 100644 --- a/x/storage/types/expected_keepers.go +++ b/x/storage/types/expected_keepers.go @@ -2,6 +2,7 @@ package types import ( "math/big" + time "time" "cosmossdk.io/math" sdkmath "cosmossdk.io/math" @@ -54,7 +55,8 @@ type PermissionKeeper interface { resourceID math.Uint) (math.Uint, error) VerifyPolicy(ctx sdk.Context, resourceID math.Uint, resourceType resource.ResourceType, operator sdk.AccAddress, action permtypes.ActionType, opts *permtypes.VerifyOptions) permtypes.Effect - AddGroupMember(ctx sdk.Context, groupID math.Uint, member sdk.AccAddress) error + AddGroupMember(ctx sdk.Context, groupID math.Uint, member sdk.AccAddress, expiration time.Time) error + UpdateGroupMember(ctx sdk.Context, groupID math.Uint, member sdk.AccAddress, memberID math.Uint, expiration time.Time) RemoveGroupMember(ctx sdk.Context, groupID math.Uint, member sdk.AccAddress) error GetPolicyByID(ctx sdk.Context, policyID math.Uint) (*permtypes.Policy, bool) GetPolicyForAccount(ctx sdk.Context, resourceID math.Uint, resourceType resource.ResourceType, addr sdk.AccAddress) (policy *permtypes.Policy, isFound bool) @@ -105,6 +107,7 @@ type StorageKeeper interface { groupName string, opts CreateGroupOptions) (sdkmath.Uint, error) SetGroupInfo(ctx sdk.Context, groupInfo *GroupInfo) UpdateGroupMember(ctx sdk.Context, operator sdk.AccAddress, groupInfo *GroupInfo, opts UpdateGroupMemberOptions) error + RenewGroupMember(ctx sdk.Context, operator sdk.AccAddress, groupInfo *GroupInfo, opts RenewGroupMemberOptions) error GetObjectInfoById(ctx sdk.Context, objectId sdkmath.Uint) (*ObjectInfo, bool) SetObjectInfo(ctx sdk.Context, objectInfo *ObjectInfo) DeleteObject( diff --git a/x/storage/types/expected_keepers_mocks.go b/x/storage/types/expected_keepers_mocks.go index e5a20df47..5ea50af65 100644 --- a/x/storage/types/expected_keepers_mocks.go +++ b/x/storage/types/expected_keepers_mocks.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: expected_keepers.go +// Source: x/storage/types/expected_keepers.go // Package types is a generated GoMock package. package types @@ -7,18 +7,18 @@ package types import ( big "math/big" reflect "reflect" + time "time" math "cosmossdk.io/math" - log "github.com/cometbft/cometbft/libs/log" - types3 "github.com/cosmos/cosmos-sdk/types" - types4 "github.com/cosmos/cosmos-sdk/x/auth/types" - gomock "github.com/golang/mock/gomock" - resource "github.com/bnb-chain/greenfield/types/resource" types "github.com/bnb-chain/greenfield/x/payment/types" types0 "github.com/bnb-chain/greenfield/x/permission/types" types1 "github.com/bnb-chain/greenfield/x/sp/types" types2 "github.com/bnb-chain/greenfield/x/virtualgroup/types" + log "github.com/cometbft/cometbft/libs/log" + types3 "github.com/cosmos/cosmos-sdk/types" + types4 "github.com/cosmos/cosmos-sdk/x/auth/types" + gomock "github.com/golang/mock/gomock" ) // MockAccountKeeper is a mock of AccountKeeper interface. @@ -368,17 +368,17 @@ func (m *MockPermissionKeeper) EXPECT() *MockPermissionKeeperMockRecorder { } // AddGroupMember mocks base method. -func (m *MockPermissionKeeper) AddGroupMember(ctx types3.Context, groupID math.Uint, member types3.AccAddress) error { +func (m *MockPermissionKeeper) AddGroupMember(ctx types3.Context, groupID math.Uint, member types3.AccAddress, expiration time.Time) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AddGroupMember", ctx, groupID, member) + ret := m.ctrl.Call(m, "AddGroupMember", ctx, groupID, member, expiration) ret0, _ := ret[0].(error) return ret0 } // AddGroupMember indicates an expected call of AddGroupMember. -func (mr *MockPermissionKeeperMockRecorder) AddGroupMember(ctx, groupID, member interface{}) *gomock.Call { +func (mr *MockPermissionKeeperMockRecorder) AddGroupMember(ctx, groupID, member, expiration interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddGroupMember", reflect.TypeOf((*MockPermissionKeeper)(nil).AddGroupMember), ctx, groupID, member) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddGroupMember", reflect.TypeOf((*MockPermissionKeeper)(nil).AddGroupMember), ctx, groupID, member, expiration) } // DeletePolicy mocks base method. @@ -587,6 +587,18 @@ func (mr *MockPermissionKeeperMockRecorder) RemoveGroupMember(ctx, groupID, memb return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveGroupMember", reflect.TypeOf((*MockPermissionKeeper)(nil).RemoveGroupMember), ctx, groupID, member) } +// UpdateGroupMember mocks base method. +func (m *MockPermissionKeeper) UpdateGroupMember(ctx types3.Context, groupID math.Uint, member types3.AccAddress, memberID math.Uint, expiration time.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "UpdateGroupMember", ctx, groupID, member, memberID, expiration) +} + +// UpdateGroupMember indicates an expected call of UpdateGroupMember. +func (mr *MockPermissionKeeperMockRecorder) UpdateGroupMember(ctx, groupID, member, memberID, expiration interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGroupMember", reflect.TypeOf((*MockPermissionKeeper)(nil).UpdateGroupMember), ctx, groupID, member, memberID, expiration) +} + // VerifyPolicy mocks base method. func (m *MockPermissionKeeper) VerifyPolicy(ctx types3.Context, resourceID math.Uint, resourceType resource.ResourceType, operator types3.AccAddress, action types0.ActionType, opts *types0.VerifyOptions) types0.Effect { m.ctrl.T.Helper() @@ -946,6 +958,20 @@ func (mr *MockStorageKeeperMockRecorder) Logger(ctx interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Logger", reflect.TypeOf((*MockStorageKeeper)(nil).Logger), ctx) } +// RenewGroupMember mocks base method. +func (m *MockStorageKeeper) RenewGroupMember(ctx types3.Context, operator types3.AccAddress, groupInfo *GroupInfo, opts RenewGroupMemberOptions) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RenewGroupMember", ctx, operator, groupInfo, opts) + ret0, _ := ret[0].(error) + return ret0 +} + +// RenewGroupMember indicates an expected call of RenewGroupMember. +func (mr *MockStorageKeeperMockRecorder) RenewGroupMember(ctx, operator, groupInfo, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RenewGroupMember", reflect.TypeOf((*MockStorageKeeper)(nil).RenewGroupMember), ctx, operator, groupInfo, opts) +} + // SetBucketInfo mocks base method. func (m *MockStorageKeeper) SetBucketInfo(ctx types3.Context, bucketInfo *BucketInfo) { m.ctrl.T.Helper() diff --git a/x/storage/types/message.go b/x/storage/types/message.go index b55a6e44a..ba2675dd4 100644 --- a/x/storage/types/message.go +++ b/x/storage/types/message.go @@ -44,6 +44,7 @@ const ( TypeMsgUpdateGroupMember = "update_group_member" TypeMsgUpdateGroupExtra = "update_group_extra" TypeMsgMirrorGroup = "mirror_group" + TypeMsgRenewGroupMember = "renew_group_member" MaxGroupExtraInfoLimit = 512 @@ -91,6 +92,10 @@ var ( // For params _ sdk.Msg = &MsgUpdateParams{} + + // The max timestamp in underlying package `google.golang.org/protobuf/types/known/timestamppb` is 9999-12-31T23:59:59Z + // https://pkg.go.dev/google.golang.org/protobuf/types/known/timestamppb#Timestamp + MaxTimeStamp, _ = time.Parse(time.RFC3339, "9999-12-31T23:59:59Z") ) // NewMsgCreateBucket creates a new MsgCreateBucket instance. @@ -828,15 +833,10 @@ func (msg *MsgUpdateObjectInfo) ValidateBasic() error { return nil } -func NewMsgCreateGroup(creator sdk.AccAddress, groupName string, membersAcc []sdk.AccAddress, extra string) *MsgCreateGroup { - var members []string - for _, member := range membersAcc { - members = append(members, member.String()) - } +func NewMsgCreateGroup(creator sdk.AccAddress, groupName string, extra string) *MsgCreateGroup { return &MsgCreateGroup{ Creator: creator.String(), GroupName: groupName, - Members: members, Extra: extra, } } @@ -877,9 +877,7 @@ func (msg *MsgCreateGroup) ValidateBasic() error { if err != nil { return gnfderrors.ErrInvalidGroupName.Wrapf("invalid groupName (%s)", err) } - if len(msg.Members) > MaxGroupMemberLimitOnce { - return gnfderrors.ErrInvalidParameter.Wrapf("Once update group member limit exceeded") - } + if len(msg.Extra) > MaxGroupExtraInfoLimit { return errors.Wrapf(gnfderrors.ErrInvalidParameter, "extra is too long with length %d, limit to %d", len(msg.Extra), MaxGroupExtraInfoLimit) } @@ -980,12 +978,9 @@ func (msg *MsgLeaveGroup) ValidateBasic() error { } func NewMsgUpdateGroupMember( - operator sdk.AccAddress, groupOwner sdk.AccAddress, groupName string, membersToAdd []sdk.AccAddress, + operator sdk.AccAddress, groupOwner sdk.AccAddress, groupName string, membersToAdd []*MsgGroupMember, membersToDelete []sdk.AccAddress) *MsgUpdateGroupMember { - var membersAddrToAdd, membersAddrToDelete []string - for _, member := range membersToAdd { - membersAddrToAdd = append(membersAddrToAdd, member.String()) - } + var membersAddrToDelete []string for _, member := range membersToDelete { membersAddrToDelete = append(membersAddrToDelete, member.String()) } @@ -993,7 +988,7 @@ func NewMsgUpdateGroupMember( Operator: operator.String(), GroupOwner: groupOwner.String(), GroupName: groupName, - MembersToAdd: membersAddrToAdd, + MembersToAdd: membersToAdd, MembersToDelete: membersAddrToDelete, } } @@ -1044,10 +1039,14 @@ func (msg *MsgUpdateGroupMember) ValidateBasic() error { return gnfderrors.ErrInvalidParameter.Wrapf("Once update group member limit exceeded") } for _, member := range msg.MembersToAdd { - _, err = sdk.AccAddressFromHexUnsafe(member) + _, err = sdk.AccAddressFromHexUnsafe(member.Member) if err != nil { return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid member address (%s)", err) } + if member.ExpirationTime.UTC().After(MaxTimeStamp) { + return gnfderrors.ErrInvalidParameter.Wrapf("Expiration time is bigger than max timestamp [%s]", MaxTimeStamp) + } + } for _, member := range msg.MembersToDelete { _, err = sdk.AccAddressFromHexUnsafe(member) @@ -1425,3 +1424,72 @@ func (m *MsgUpdateParams) ValidateBasic() error { return nil } + +func NewMsgRenewGroupMember( + operator sdk.AccAddress, groupOwner sdk.AccAddress, groupName string, members []*MsgGroupMember) *MsgRenewGroupMember { + + return &MsgRenewGroupMember{ + Operator: operator.String(), + GroupOwner: groupOwner.String(), + GroupName: groupName, + Members: members, + } +} + +// Route implements the sdk.Msg interface. +func (msg *MsgRenewGroupMember) Route() string { + return RouterKey +} + +// Type implements the sdk.Msg interface. +func (msg *MsgRenewGroupMember) Type() string { + return TypeMsgRenewGroupMember +} + +// GetSigners implements the sdk.Msg interface. +func (msg *MsgRenewGroupMember) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromHexUnsafe(msg.Operator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +// GetSignBytes returns the message bytes to sign over. +func (msg *MsgRenewGroupMember) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +// ValidateBasic implements the sdk.Msg interface. +func (msg *MsgRenewGroupMember) ValidateBasic() error { + _, err := sdk.AccAddressFromHexUnsafe(msg.Operator) + if err != nil { + return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid operator address (%s)", err) + } + + _, err = sdk.AccAddressFromHexUnsafe(msg.GroupOwner) + if err != nil { + return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid group owner address (%s)", err) + } + + err = s3util.CheckValidGroupName(msg.GroupName) + if err != nil { + return err + } + + if len(msg.Members) > MaxGroupMemberLimitOnce { + return gnfderrors.ErrInvalidParameter.Wrapf("Once renew group member limit exceeded") + } + for _, member := range msg.Members { + _, err = sdk.AccAddressFromHexUnsafe(member.Member) + if err != nil { + return errors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid member address (%s)", err) + } + if member.ExpirationTime.UTC().After(MaxTimeStamp) { + return gnfderrors.ErrInvalidParameter.Wrapf("Expiration time is bigger than max timestamp [%s]", MaxTimeStamp) + } + } + + return nil +} diff --git a/x/storage/types/message_test.go b/x/storage/types/message_test.go index f3343a3bf..89c21de2b 100644 --- a/x/storage/types/message_test.go +++ b/x/storage/types/message_test.go @@ -169,7 +169,6 @@ func TestMsgCreateGroup_ValidateBasic(t *testing.T) { msg: MsgCreateGroup{ Creator: sample.RandAccAddressHex(), GroupName: testGroupName, - Members: []string{sample.RandAccAddressHex(), sample.RandAccAddressHex()}, }, }, } @@ -247,10 +246,18 @@ func TestMsgUpdateGroupMember_ValidateBasic(t *testing.T) { { name: "normal", msg: MsgUpdateGroupMember{ - Operator: sample.RandAccAddressHex(), - GroupOwner: sample.RandAccAddressHex(), - GroupName: testGroupName, - MembersToAdd: []string{sample.RandAccAddressHex(), sample.RandAccAddressHex()}, + Operator: sample.RandAccAddressHex(), + GroupOwner: sample.RandAccAddressHex(), + GroupName: testGroupName, + MembersToAdd: []*MsgGroupMember{{ + Member: sample.RandAccAddressHex(), + ExpirationTime: MaxTimeStamp, + }, + { + Member: sample.RandAccAddressHex(), + ExpirationTime: MaxTimeStamp, + }, + }, MembersToDelete: []string{sample.RandAccAddressHex(), sample.RandAccAddressHex()}, }, }, @@ -428,3 +435,39 @@ func TestMsgMirrorGroup_ValidateBasic(t *testing.T) { }) } } + +func TestMsgRenewGroupMember_ValidateBasic(t *testing.T) { + tests := []struct { + name string + msg MsgRenewGroupMember + err error + }{ + { + name: "normal", + msg: MsgRenewGroupMember{ + Operator: sample.RandAccAddressHex(), + GroupOwner: sample.RandAccAddressHex(), + GroupName: testGroupName, + Members: []*MsgGroupMember{{ + Member: sample.RandAccAddressHex(), + ExpirationTime: MaxTimeStamp, + }, + { + Member: sample.RandAccAddressHex(), + ExpirationTime: MaxTimeStamp, + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.msg.ValidateBasic() + if tt.err != nil { + require.ErrorIs(t, err, tt.err) + return + } + require.NoError(t, err) + }) + } +} diff --git a/x/storage/types/options.go b/x/storage/types/options.go index dc36988e8..8364e282c 100644 --- a/x/storage/types/options.go +++ b/x/storage/types/options.go @@ -1,6 +1,8 @@ package types import ( + time "time" + "github.com/bnb-chain/greenfield/types/common" ) @@ -49,7 +51,6 @@ type CopyObjectOptions struct { ApprovalMsgBytes []byte } type CreateGroupOptions struct { - Members []string SourceType SourceType Extra string } @@ -58,9 +59,16 @@ type LeaveGroupOptions struct { } type UpdateGroupMemberOptions struct { - SourceType SourceType - MembersToAdd []string - MembersToDelete []string + SourceType SourceType + MembersToAdd []string + MembersExpirationToAdd []time.Time + MembersToDelete []string +} + +type RenewGroupMemberOptions struct { + SourceType SourceType + Members []string + MembersExpiration []time.Time } type DeleteGroupOptions struct { diff --git a/x/storage/types/tx.pb.go b/x/storage/types/tx.pb.go index b5a626cbb..d2ba802b0 100644 --- a/x/storage/types/tx.pb.go +++ b/x/storage/types/tx.pb.go @@ -1068,10 +1068,8 @@ type MsgCreateGroup struct { Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` // group_name defines the name of the group. it's not globally unique. GroupName string `protobuf:"bytes,2,opt,name=group_name,json=groupName,proto3" json:"group_name,omitempty"` - // member_request defines a list of member which to be add or remove - Members []string `protobuf:"bytes,3,rep,name=members,proto3" json:"members,omitempty"` // extra defines extra info for the group - Extra string `protobuf:"bytes,4,opt,name=extra,proto3" json:"extra,omitempty"` + Extra string `protobuf:"bytes,3,opt,name=extra,proto3" json:"extra,omitempty"` } func (m *MsgCreateGroup) Reset() { *m = MsgCreateGroup{} } @@ -1121,13 +1119,6 @@ func (m *MsgCreateGroup) GetGroupName() string { return "" } -func (m *MsgCreateGroup) GetMembers() []string { - if m != nil { - return m.Members - } - return nil -} - func (m *MsgCreateGroup) GetExtra() string { if m != nil { return m.Extra @@ -1270,7 +1261,7 @@ type MsgUpdateGroupMember struct { // group_name defines the name of the group which to be updated GroupName string `protobuf:"bytes,3,opt,name=group_name,json=groupName,proto3" json:"group_name,omitempty"` // members_to_add defines a list of members account address which will be add to the group - MembersToAdd []string `protobuf:"bytes,4,rep,name=members_to_add,json=membersToAdd,proto3" json:"members_to_add,omitempty"` + MembersToAdd []*MsgGroupMember `protobuf:"bytes,4,rep,name=members_to_add,json=membersToAdd,proto3" json:"members_to_add,omitempty"` // members_to_delete defines a list of members account address which will be remove from the group MembersToDelete []string `protobuf:"bytes,5,rep,name=members_to_delete,json=membersToDelete,proto3" json:"members_to_delete,omitempty"` } @@ -1329,7 +1320,7 @@ func (m *MsgUpdateGroupMember) GetGroupName() string { return "" } -func (m *MsgUpdateGroupMember) GetMembersToAdd() []string { +func (m *MsgUpdateGroupMember) GetMembersToAdd() []*MsgGroupMember { if m != nil { return m.MembersToAdd } @@ -1379,6 +1370,168 @@ func (m *MsgUpdateGroupMemberResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateGroupMemberResponse proto.InternalMessageInfo +type MsgRenewGroupMember struct { + // operator defines the account address of the operator who has the UpdateGroupMember permission of the group. + Operator string `protobuf:"bytes,1,opt,name=operator,proto3" json:"operator,omitempty"` + // group_owner defines the account address of the group owner + GroupOwner string `protobuf:"bytes,2,opt,name=group_owner,json=groupOwner,proto3" json:"group_owner,omitempty"` + // group_name defines the name of the group which to be updated + GroupName string `protobuf:"bytes,3,opt,name=group_name,json=groupName,proto3" json:"group_name,omitempty"` + // members defines a list of members which will be renew to the group + Members []*MsgGroupMember `protobuf:"bytes,4,rep,name=members,proto3" json:"members,omitempty"` +} + +func (m *MsgRenewGroupMember) Reset() { *m = MsgRenewGroupMember{} } +func (m *MsgRenewGroupMember) String() string { return proto.CompactTextString(m) } +func (*MsgRenewGroupMember) ProtoMessage() {} +func (*MsgRenewGroupMember) Descriptor() ([]byte, []int) { + return fileDescriptor_ddb71b028305a3cc, []int{24} +} +func (m *MsgRenewGroupMember) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRenewGroupMember) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRenewGroupMember.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 *MsgRenewGroupMember) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRenewGroupMember.Merge(m, src) +} +func (m *MsgRenewGroupMember) XXX_Size() int { + return m.Size() +} +func (m *MsgRenewGroupMember) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRenewGroupMember.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRenewGroupMember proto.InternalMessageInfo + +func (m *MsgRenewGroupMember) GetOperator() string { + if m != nil { + return m.Operator + } + return "" +} + +func (m *MsgRenewGroupMember) GetGroupOwner() string { + if m != nil { + return m.GroupOwner + } + return "" +} + +func (m *MsgRenewGroupMember) GetGroupName() string { + if m != nil { + return m.GroupName + } + return "" +} + +func (m *MsgRenewGroupMember) GetMembers() []*MsgGroupMember { + if m != nil { + return m.Members + } + return nil +} + +type MsgRenewGroupMemberResponse struct { +} + +func (m *MsgRenewGroupMemberResponse) Reset() { *m = MsgRenewGroupMemberResponse{} } +func (m *MsgRenewGroupMemberResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRenewGroupMemberResponse) ProtoMessage() {} +func (*MsgRenewGroupMemberResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ddb71b028305a3cc, []int{25} +} +func (m *MsgRenewGroupMemberResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRenewGroupMemberResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRenewGroupMemberResponse.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 *MsgRenewGroupMemberResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRenewGroupMemberResponse.Merge(m, src) +} +func (m *MsgRenewGroupMemberResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRenewGroupMemberResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRenewGroupMemberResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRenewGroupMemberResponse proto.InternalMessageInfo + +type MsgGroupMember struct { + // member defines the account address of the group member + Member string `protobuf:"bytes,1,opt,name=member,proto3" json:"member,omitempty"` + // expiration_time defines the expiration time of the group member + ExpirationTime time.Time `protobuf:"bytes,2,opt,name=expiration_time,json=expirationTime,proto3,stdtime" json:"expiration_time"` +} + +func (m *MsgGroupMember) Reset() { *m = MsgGroupMember{} } +func (m *MsgGroupMember) String() string { return proto.CompactTextString(m) } +func (*MsgGroupMember) ProtoMessage() {} +func (*MsgGroupMember) Descriptor() ([]byte, []int) { + return fileDescriptor_ddb71b028305a3cc, []int{26} +} +func (m *MsgGroupMember) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgGroupMember) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgGroupMember.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 *MsgGroupMember) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgGroupMember.Merge(m, src) +} +func (m *MsgGroupMember) XXX_Size() int { + return m.Size() +} +func (m *MsgGroupMember) XXX_DiscardUnknown() { + xxx_messageInfo_MsgGroupMember.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgGroupMember proto.InternalMessageInfo + +func (m *MsgGroupMember) GetMember() string { + if m != nil { + return m.Member + } + return "" +} + +func (m *MsgGroupMember) GetExpirationTime() time.Time { + if m != nil { + return m.ExpirationTime + } + return time.Time{} +} + type MsgUpdateGroupExtra struct { // operator defines the account address of the operator who has the UpdateGroupMember permission of the group. Operator string `protobuf:"bytes,1,opt,name=operator,proto3" json:"operator,omitempty"` @@ -1394,7 +1547,7 @@ func (m *MsgUpdateGroupExtra) Reset() { *m = MsgUpdateGroupExtra{} } func (m *MsgUpdateGroupExtra) String() string { return proto.CompactTextString(m) } func (*MsgUpdateGroupExtra) ProtoMessage() {} func (*MsgUpdateGroupExtra) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{24} + return fileDescriptor_ddb71b028305a3cc, []int{27} } func (m *MsgUpdateGroupExtra) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1458,7 +1611,7 @@ func (m *MsgUpdateGroupExtraResponse) Reset() { *m = MsgUpdateGroupExtra func (m *MsgUpdateGroupExtraResponse) String() string { return proto.CompactTextString(m) } func (*MsgUpdateGroupExtraResponse) ProtoMessage() {} func (*MsgUpdateGroupExtraResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{25} + return fileDescriptor_ddb71b028305a3cc, []int{28} } func (m *MsgUpdateGroupExtraResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1500,7 +1653,7 @@ func (m *MsgLeaveGroup) Reset() { *m = MsgLeaveGroup{} } func (m *MsgLeaveGroup) String() string { return proto.CompactTextString(m) } func (*MsgLeaveGroup) ProtoMessage() {} func (*MsgLeaveGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{26} + return fileDescriptor_ddb71b028305a3cc, []int{29} } func (m *MsgLeaveGroup) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1557,7 +1710,7 @@ func (m *MsgLeaveGroupResponse) Reset() { *m = MsgLeaveGroupResponse{} } func (m *MsgLeaveGroupResponse) String() string { return proto.CompactTextString(m) } func (*MsgLeaveGroupResponse) ProtoMessage() {} func (*MsgLeaveGroupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{27} + return fileDescriptor_ddb71b028305a3cc, []int{30} } func (m *MsgLeaveGroupResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1606,7 +1759,7 @@ func (m *MsgUpdateBucketInfo) Reset() { *m = MsgUpdateBucketInfo{} } func (m *MsgUpdateBucketInfo) String() string { return proto.CompactTextString(m) } func (*MsgUpdateBucketInfo) ProtoMessage() {} func (*MsgUpdateBucketInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{28} + return fileDescriptor_ddb71b028305a3cc, []int{31} } func (m *MsgUpdateBucketInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1677,7 +1830,7 @@ func (m *MsgUpdateBucketInfoResponse) Reset() { *m = MsgUpdateBucketInfo func (m *MsgUpdateBucketInfoResponse) String() string { return proto.CompactTextString(m) } func (*MsgUpdateBucketInfoResponse) ProtoMessage() {} func (*MsgUpdateBucketInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{29} + return fileDescriptor_ddb71b028305a3cc, []int{32} } func (m *MsgUpdateBucketInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1719,7 +1872,7 @@ func (m *MsgCancelCreateObject) Reset() { *m = MsgCancelCreateObject{} } func (m *MsgCancelCreateObject) String() string { return proto.CompactTextString(m) } func (*MsgCancelCreateObject) ProtoMessage() {} func (*MsgCancelCreateObject) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{30} + return fileDescriptor_ddb71b028305a3cc, []int{33} } func (m *MsgCancelCreateObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1776,7 +1929,7 @@ func (m *MsgCancelCreateObjectResponse) Reset() { *m = MsgCancelCreateOb func (m *MsgCancelCreateObjectResponse) String() string { return proto.CompactTextString(m) } func (*MsgCancelCreateObjectResponse) ProtoMessage() {} func (*MsgCancelCreateObjectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{31} + return fileDescriptor_ddb71b028305a3cc, []int{34} } func (m *MsgCancelCreateObjectResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1823,7 +1976,7 @@ func (m *MsgPutPolicy) Reset() { *m = MsgPutPolicy{} } func (m *MsgPutPolicy) String() string { return proto.CompactTextString(m) } func (*MsgPutPolicy) ProtoMessage() {} func (*MsgPutPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{32} + return fileDescriptor_ddb71b028305a3cc, []int{35} } func (m *MsgPutPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1895,7 +2048,7 @@ func (m *MsgPutPolicyResponse) Reset() { *m = MsgPutPolicyResponse{} } func (m *MsgPutPolicyResponse) String() string { return proto.CompactTextString(m) } func (*MsgPutPolicyResponse) ProtoMessage() {} func (*MsgPutPolicyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{33} + return fileDescriptor_ddb71b028305a3cc, []int{36} } func (m *MsgPutPolicyResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1937,7 +2090,7 @@ func (m *MsgDeletePolicy) Reset() { *m = MsgDeletePolicy{} } func (m *MsgDeletePolicy) String() string { return proto.CompactTextString(m) } func (*MsgDeletePolicy) ProtoMessage() {} func (*MsgDeletePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{34} + return fileDescriptor_ddb71b028305a3cc, []int{37} } func (m *MsgDeletePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1995,7 +2148,7 @@ func (m *MsgDeletePolicyResponse) Reset() { *m = MsgDeletePolicyResponse func (m *MsgDeletePolicyResponse) String() string { return proto.CompactTextString(m) } func (*MsgDeletePolicyResponse) ProtoMessage() {} func (*MsgDeletePolicyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{35} + return fileDescriptor_ddb71b028305a3cc, []int{38} } func (m *MsgDeletePolicyResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2039,7 +2192,7 @@ func (m *MsgMirrorObject) Reset() { *m = MsgMirrorObject{} } func (m *MsgMirrorObject) String() string { return proto.CompactTextString(m) } func (*MsgMirrorObject) ProtoMessage() {} func (*MsgMirrorObject) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{36} + return fileDescriptor_ddb71b028305a3cc, []int{39} } func (m *MsgMirrorObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2096,7 +2249,7 @@ func (m *MsgMirrorObjectResponse) Reset() { *m = MsgMirrorObjectResponse func (m *MsgMirrorObjectResponse) String() string { return proto.CompactTextString(m) } func (*MsgMirrorObjectResponse) ProtoMessage() {} func (*MsgMirrorObjectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{37} + return fileDescriptor_ddb71b028305a3cc, []int{40} } func (m *MsgMirrorObjectResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2138,7 +2291,7 @@ func (m *MsgMirrorBucket) Reset() { *m = MsgMirrorBucket{} } func (m *MsgMirrorBucket) String() string { return proto.CompactTextString(m) } func (*MsgMirrorBucket) ProtoMessage() {} func (*MsgMirrorBucket) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{38} + return fileDescriptor_ddb71b028305a3cc, []int{41} } func (m *MsgMirrorBucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2188,7 +2341,7 @@ func (m *MsgUpdateObjectInfoResponse) Reset() { *m = MsgUpdateObjectInfo func (m *MsgUpdateObjectInfoResponse) String() string { return proto.CompactTextString(m) } func (*MsgUpdateObjectInfoResponse) ProtoMessage() {} func (*MsgUpdateObjectInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{39} + return fileDescriptor_ddb71b028305a3cc, []int{42} } func (m *MsgUpdateObjectInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2233,7 +2386,7 @@ func (m *MsgUpdateObjectInfo) Reset() { *m = MsgUpdateObjectInfo{} } func (m *MsgUpdateObjectInfo) String() string { return proto.CompactTextString(m) } func (*MsgUpdateObjectInfo) ProtoMessage() {} func (*MsgUpdateObjectInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{40} + return fileDescriptor_ddb71b028305a3cc, []int{43} } func (m *MsgUpdateObjectInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2297,7 +2450,7 @@ func (m *MsgMirrorBucketResponse) Reset() { *m = MsgMirrorBucketResponse func (m *MsgMirrorBucketResponse) String() string { return proto.CompactTextString(m) } func (*MsgMirrorBucketResponse) ProtoMessage() {} func (*MsgMirrorBucketResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{41} + return fileDescriptor_ddb71b028305a3cc, []int{44} } func (m *MsgMirrorBucketResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2339,7 +2492,7 @@ func (m *MsgMirrorGroup) Reset() { *m = MsgMirrorGroup{} } func (m *MsgMirrorGroup) String() string { return proto.CompactTextString(m) } func (*MsgMirrorGroup) ProtoMessage() {} func (*MsgMirrorGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{42} + return fileDescriptor_ddb71b028305a3cc, []int{45} } func (m *MsgMirrorGroup) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2389,7 +2542,7 @@ func (m *MsgMirrorGroupResponse) Reset() { *m = MsgMirrorGroupResponse{} func (m *MsgMirrorGroupResponse) String() string { return proto.CompactTextString(m) } func (*MsgMirrorGroupResponse) ProtoMessage() {} func (*MsgMirrorGroupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{43} + return fileDescriptor_ddb71b028305a3cc, []int{46} } func (m *MsgMirrorGroupResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2431,7 +2584,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_ddb71b028305a3cc, []int{44} + return fileDescriptor_ddb71b028305a3cc, []int{47} } func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2482,7 +2635,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_ddb71b028305a3cc, []int{45} + return fileDescriptor_ddb71b028305a3cc, []int{48} } func (m *MsgUpdateParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2527,7 +2680,7 @@ func (m *MsgMigrateBucket) Reset() { *m = MsgMigrateBucket{} } func (m *MsgMigrateBucket) String() string { return proto.CompactTextString(m) } func (*MsgMigrateBucket) ProtoMessage() {} func (*MsgMigrateBucket) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{46} + return fileDescriptor_ddb71b028305a3cc, []int{49} } func (m *MsgMigrateBucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2591,7 +2744,7 @@ func (m *MsgMigrateBucketResponse) Reset() { *m = MsgMigrateBucketRespon func (m *MsgMigrateBucketResponse) String() string { return proto.CompactTextString(m) } func (*MsgMigrateBucketResponse) ProtoMessage() {} func (*MsgMigrateBucketResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{47} + return fileDescriptor_ddb71b028305a3cc, []int{50} } func (m *MsgMigrateBucketResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2636,7 +2789,7 @@ func (m *MsgCompleteMigrateBucket) Reset() { *m = MsgCompleteMigrateBuck func (m *MsgCompleteMigrateBucket) String() string { return proto.CompactTextString(m) } func (*MsgCompleteMigrateBucket) ProtoMessage() {} func (*MsgCompleteMigrateBucket) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{48} + return fileDescriptor_ddb71b028305a3cc, []int{51} } func (m *MsgCompleteMigrateBucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2700,7 +2853,7 @@ func (m *MsgCompleteMigrateBucketResponse) Reset() { *m = MsgCompleteMig func (m *MsgCompleteMigrateBucketResponse) String() string { return proto.CompactTextString(m) } func (*MsgCompleteMigrateBucketResponse) ProtoMessage() {} func (*MsgCompleteMigrateBucketResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{49} + return fileDescriptor_ddb71b028305a3cc, []int{52} } func (m *MsgCompleteMigrateBucketResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2741,7 +2894,7 @@ func (m *MsgCancelMigrateBucket) Reset() { *m = MsgCancelMigrateBucket{} func (m *MsgCancelMigrateBucket) String() string { return proto.CompactTextString(m) } func (*MsgCancelMigrateBucket) ProtoMessage() {} func (*MsgCancelMigrateBucket) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{50} + return fileDescriptor_ddb71b028305a3cc, []int{53} } func (m *MsgCancelMigrateBucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2791,7 +2944,7 @@ func (m *MsgCancelMigrateBucketResponse) Reset() { *m = MsgCancelMigrate func (m *MsgCancelMigrateBucketResponse) String() string { return proto.CompactTextString(m) } func (*MsgCancelMigrateBucketResponse) ProtoMessage() {} func (*MsgCancelMigrateBucketResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ddb71b028305a3cc, []int{51} + return fileDescriptor_ddb71b028305a3cc, []int{54} } func (m *MsgCancelMigrateBucketResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2845,6 +2998,9 @@ func init() { proto.RegisterType((*MsgDeleteGroupResponse)(nil), "greenfield.storage.MsgDeleteGroupResponse") proto.RegisterType((*MsgUpdateGroupMember)(nil), "greenfield.storage.MsgUpdateGroupMember") proto.RegisterType((*MsgUpdateGroupMemberResponse)(nil), "greenfield.storage.MsgUpdateGroupMemberResponse") + proto.RegisterType((*MsgRenewGroupMember)(nil), "greenfield.storage.MsgRenewGroupMember") + proto.RegisterType((*MsgRenewGroupMemberResponse)(nil), "greenfield.storage.MsgRenewGroupMemberResponse") + proto.RegisterType((*MsgGroupMember)(nil), "greenfield.storage.MsgGroupMember") proto.RegisterType((*MsgUpdateGroupExtra)(nil), "greenfield.storage.MsgUpdateGroupExtra") proto.RegisterType((*MsgUpdateGroupExtraResponse)(nil), "greenfield.storage.MsgUpdateGroupExtraResponse") proto.RegisterType((*MsgLeaveGroup)(nil), "greenfield.storage.MsgLeaveGroup") @@ -2878,142 +3034,146 @@ func init() { func init() { proto.RegisterFile("greenfield/storage/tx.proto", fileDescriptor_ddb71b028305a3cc) } var fileDescriptor_ddb71b028305a3cc = []byte{ - // 2152 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x6f, 0x1b, 0xc7, - 0xd9, 0x37, 0x25, 0xea, 0x83, 0x0f, 0xa9, 0x0f, 0xaf, 0x95, 0x88, 0xa1, 0x5e, 0x53, 0x34, 0xf3, - 0x22, 0x91, 0xbf, 0x44, 0x47, 0x75, 0x8d, 0x54, 0x87, 0xa0, 0x92, 0xd3, 0x18, 0x42, 0xa2, 0x5a, - 0x59, 0xda, 0x2e, 0x10, 0xa0, 0x60, 0x86, 0xbb, 0xe3, 0xd5, 0x36, 0xdc, 0x8f, 0xce, 0x2c, 0x65, - 0x33, 0x05, 0x7a, 0xe8, 0xa5, 0xd7, 0x00, 0xe9, 0xa1, 0x87, 0xa2, 0x40, 0x81, 0x1e, 0x7a, 0x2a, - 0x8a, 0x22, 0xb7, 0x02, 0x45, 0x2f, 0x05, 0x8c, 0x9e, 0x8c, 0x9c, 0x8a, 0x1e, 0xdc, 0xc0, 0x2e, - 0xd0, 0x3f, 0x21, 0xd7, 0x62, 0x76, 0x66, 0x77, 0x87, 0xfb, 0x49, 0xcb, 0x52, 0xe2, 0x93, 0xbd, - 0x33, 0xbf, 0x99, 0x79, 0x9e, 0xdf, 0xf3, 0x35, 0xf3, 0x50, 0xb0, 0x66, 0x10, 0x8c, 0xed, 0xfb, - 0x26, 0x1e, 0xe8, 0x1d, 0xea, 0x39, 0x04, 0x19, 0xb8, 0xe3, 0x3d, 0xdc, 0x74, 0x89, 0xe3, 0x39, - 0x8a, 0x12, 0x4d, 0x6e, 0x8a, 0xc9, 0xc6, 0xaa, 0xe6, 0x50, 0xcb, 0xa1, 0x1d, 0x8b, 0x1a, 0x9d, - 0xa3, 0xb7, 0xd8, 0x3f, 0x1c, 0xdc, 0x78, 0x8d, 0x4f, 0xf4, 0xfc, 0xaf, 0x0e, 0xff, 0x10, 0x53, - 0x2b, 0x86, 0x63, 0x38, 0x7c, 0x9c, 0xfd, 0x4f, 0x8c, 0xae, 0x1b, 0x8e, 0x63, 0x0c, 0x70, 0xc7, - 0xff, 0xea, 0x0f, 0xef, 0x77, 0x3c, 0xd3, 0xc2, 0xd4, 0x43, 0x96, 0x2b, 0x00, 0x2d, 0x49, 0x36, - 0xcd, 0xb1, 0x2c, 0xc7, 0xee, 0x20, 0xd7, 0x25, 0xce, 0x11, 0x1a, 0x84, 0x5b, 0x24, 0x10, 0x0f, - 0x08, 0x72, 0x5d, 0x4c, 0x04, 0xa0, 0x2d, 0x01, 0x5c, 0x4c, 0x2c, 0x93, 0x52, 0xd3, 0xb1, 0x05, - 0x36, 0x65, 0x93, 0x80, 0x82, 0x42, 0x80, 0x8b, 0x08, 0xb2, 0x84, 0x7e, 0xed, 0xbf, 0x4e, 0xc3, - 0xd2, 0x3e, 0x35, 0x6e, 0x12, 0x8c, 0x3c, 0xbc, 0x3b, 0xd4, 0x3e, 0xc1, 0x9e, 0xb2, 0x05, 0x73, - 0x1a, 0xfb, 0x76, 0x48, 0xbd, 0xd4, 0x2a, 0x6d, 0x54, 0x76, 0xeb, 0x5f, 0x7e, 0x71, 0x75, 0x45, - 0xd0, 0xb2, 0xa3, 0xeb, 0x04, 0x53, 0xda, 0xf5, 0x88, 0x69, 0x1b, 0x6a, 0x00, 0x54, 0xd6, 0xa1, - 0xda, 0xf7, 0x57, 0xf7, 0x6c, 0x64, 0xe1, 0xfa, 0x14, 0x5b, 0xa7, 0x02, 0x1f, 0xfa, 0x21, 0xb2, - 0xb0, 0xb2, 0x0b, 0x70, 0x64, 0x52, 0xb3, 0x6f, 0x0e, 0x4c, 0x6f, 0x54, 0x9f, 0x6e, 0x95, 0x36, - 0x16, 0xb7, 0xda, 0x9b, 0x49, 0x2b, 0x6d, 0xde, 0x0b, 0x51, 0x77, 0x46, 0x2e, 0x56, 0xa5, 0x55, - 0xca, 0x0e, 0x2c, 0xb9, 0x68, 0x64, 0x61, 0xdb, 0xeb, 0x21, 0x2e, 0x46, 0xbd, 0x5c, 0x20, 0xe0, - 0xa2, 0x58, 0x20, 0x46, 0x95, 0xf7, 0x40, 0x71, 0x89, 0x69, 0x21, 0x32, 0xea, 0x51, 0x37, 0xdc, - 0x65, 0xa6, 0x60, 0x97, 0x65, 0xb1, 0xa6, 0xeb, 0x06, 0xfb, 0xbc, 0x0f, 0xe7, 0xe4, 0x7d, 0x84, - 0x6d, 0xeb, 0xb3, 0xad, 0xd2, 0x46, 0x75, 0x6b, 0x4d, 0xd6, 0x4b, 0xd8, 0x63, 0x47, 0x40, 0xd4, - 0xb3, 0xd1, 0x5e, 0x62, 0x48, 0xb9, 0x02, 0x8a, 0x76, 0x88, 0x88, 0x81, 0xf5, 0x1e, 0xc1, 0x48, - 0xef, 0xfd, 0x74, 0xe8, 0x78, 0xa8, 0x3e, 0xd7, 0x2a, 0x6d, 0x94, 0xd5, 0x65, 0x31, 0xa3, 0x62, - 0xa4, 0x7f, 0xc8, 0xc6, 0xb7, 0x6b, 0xbf, 0xf8, 0xef, 0x9f, 0x2e, 0x05, 0xc4, 0xb7, 0xbb, 0xb0, - 0x1a, 0xb3, 0x9f, 0x8a, 0xa9, 0xeb, 0xd8, 0x14, 0x2b, 0x6f, 0x43, 0x45, 0xd8, 0xc4, 0xd4, 0x85, - 0x25, 0xd7, 0x1e, 0x3d, 0x59, 0x3f, 0xf3, 0xaf, 0x27, 0xeb, 0xe5, 0xbb, 0xa6, 0xed, 0x7d, 0xf9, - 0xc5, 0xd5, 0xaa, 0x50, 0x97, 0x7d, 0xaa, 0xf3, 0x1c, 0xbd, 0xa7, 0xb7, 0x1f, 0xf8, 0x4e, 0xf1, - 0x2e, 0x1e, 0xe0, 0xd0, 0x29, 0xae, 0xc3, 0xbc, 0xe3, 0x62, 0x32, 0x91, 0x57, 0x84, 0xc8, 0x42, - 0xb7, 0xd8, 0x5e, 0x60, 0xca, 0x84, 0xf8, 0xf6, 0x6b, 0xbe, 0x36, 0xf2, 0xc1, 0x81, 0x36, 0xed, - 0x5f, 0x95, 0x60, 0x85, 0xcd, 0x99, 0x54, 0x73, 0x6c, 0xcf, 0xb4, 0x87, 0xa7, 0x2b, 0x99, 0xf2, - 0x2a, 0xcc, 0x12, 0x8c, 0xa8, 0x63, 0xfb, 0xce, 0x5a, 0x51, 0xc5, 0x57, 0x5c, 0xe2, 0x26, 0xfc, - 0x5f, 0x9a, 0x54, 0xa1, 0xd8, 0xff, 0x91, 0x03, 0xec, 0x76, 0xff, 0x27, 0x58, 0x3b, 0xa5, 0x00, - 0x5b, 0x87, 0xaa, 0xe3, 0x6f, 0xcf, 0x01, 0x5c, 0x68, 0xe0, 0x43, 0x3e, 0xe0, 0x02, 0xd4, 0x5c, - 0x34, 0x1a, 0x38, 0x48, 0xef, 0x51, 0xf3, 0x53, 0xec, 0x87, 0x4e, 0x59, 0xad, 0x8a, 0xb1, 0xae, - 0xf9, 0x69, 0x3c, 0x48, 0x67, 0x8e, 0x15, 0xa4, 0x17, 0xa0, 0xc6, 0xa8, 0x60, 0x41, 0xea, 0x8d, - 0x5c, 0xec, 0x87, 0x44, 0x45, 0xad, 0x8a, 0x31, 0x06, 0xcf, 0x0a, 0x9e, 0xb9, 0x63, 0x05, 0xcf, - 0x45, 0x58, 0xc6, 0x0f, 0x5d, 0xa6, 0xb7, 0x76, 0x88, 0xb5, 0x4f, 0xe8, 0xd0, 0xa2, 0xf5, 0xf9, - 0xd6, 0xf4, 0x46, 0x4d, 0x5d, 0xe2, 0xe3, 0x37, 0x83, 0x61, 0xe5, 0x7d, 0x58, 0x22, 0x58, 0x1f, - 0xda, 0x3a, 0xb2, 0xb5, 0x11, 0x97, 0xae, 0x92, 0xad, 0xa3, 0x1a, 0x42, 0x7d, 0x1d, 0x17, 0xc9, - 0xd8, 0x77, 0x4e, 0x18, 0x72, 0x2b, 0xcb, 0x61, 0x28, 0x0c, 0x33, 0x61, 0x18, 0x72, 0xf4, 0x9e, - 0xde, 0xfe, 0x7c, 0x0a, 0x16, 0xf6, 0xa9, 0xd1, 0xc5, 0x68, 0x20, 0x3c, 0xe7, 0x94, 0x7c, 0xbd, - 0xd0, 0x77, 0xbe, 0x0b, 0xab, 0xc6, 0xc0, 0xe9, 0xa3, 0x41, 0xef, 0xc8, 0x24, 0xde, 0x10, 0x0d, - 0x7a, 0x06, 0x71, 0x86, 0x2e, 0xd3, 0x88, 0xb9, 0xd1, 0x82, 0xba, 0xc2, 0xa7, 0xef, 0xf1, 0xd9, - 0x5b, 0x6c, 0x72, 0x4f, 0x57, 0xde, 0x85, 0x75, 0x8a, 0x35, 0xc7, 0xd6, 0x85, 0xa9, 0xfb, 0x03, - 0xda, 0x43, 0x86, 0xd1, 0xa3, 0xa6, 0x61, 0x23, 0x6f, 0x48, 0x30, 0x4f, 0xbd, 0x35, 0x75, 0x2d, - 0x84, 0x75, 0xdd, 0xdd, 0x01, 0xdd, 0x31, 0x8c, 0x6e, 0x08, 0x89, 0x47, 0xdc, 0x2a, 0xbc, 0x32, - 0x46, 0x4a, 0x18, 0x6a, 0xbf, 0x29, 0xc1, 0xb9, 0x7d, 0x6a, 0xa8, 0x98, 0x8d, 0x7e, 0xfb, 0xa4, - 0xc5, 0xe5, 0x3e, 0x0f, 0x6b, 0x29, 0xd2, 0x85, 0xd2, 0xff, 0x91, 0x1b, 0xfb, 0xa6, 0xe3, 0x8e, - 0x84, 0xdc, 0x8d, 0xb8, 0xdc, 0x92, 0x74, 0x6f, 0xc0, 0x12, 0x25, 0x5a, 0x2f, 0x29, 0xe1, 0x02, - 0x25, 0xda, 0x6e, 0x24, 0xe4, 0x1b, 0xb0, 0xa4, 0x53, 0x6f, 0x0c, 0xc7, 0x05, 0x5d, 0xd0, 0xa9, - 0x37, 0x8e, 0x63, 0xfb, 0xc9, 0x0a, 0x95, 0xc3, 0xfd, 0x6e, 0x47, 0x8e, 0x20, 0xf6, 0x93, 0x71, - 0x33, 0xe1, 0x7e, 0x12, 0x4e, 0x85, 0x55, 0x86, 0x3b, 0x66, 0x8d, 0x5c, 0xd1, 0xa9, 0x77, 0x10, - 0x8f, 0xf4, 0x38, 0x9f, 0x1f, 0xfa, 0x7e, 0x10, 0xf1, 0x75, 0x02, 0x01, 0xf7, 0xeb, 0x92, 0x54, - 0xf8, 0x5e, 0x2e, 0xef, 0x91, 0x2b, 0x63, 0xcc, 0x73, 0x1e, 0x27, 0x2a, 0xe3, 0xe9, 0x8a, 0xbe, - 0x0d, 0x10, 0xf2, 0x4b, 0xeb, 0xd3, 0xad, 0xe9, 0x22, 0x82, 0x2b, 0x01, 0xc1, 0x54, 0xaa, 0xaa, - 0xe5, 0xe7, 0xaa, 0xaa, 0x31, 0x95, 0xff, 0x52, 0x82, 0xc5, 0x30, 0xdf, 0xfa, 0xd9, 0xe6, 0x58, - 0x45, 0xf5, 0x3c, 0x00, 0xcf, 0x63, 0x92, 0xa6, 0x15, 0x7f, 0xc4, 0x57, 0x74, 0x0b, 0xe6, 0x2c, - 0x6c, 0xf5, 0x31, 0x09, 0xb4, 0xcc, 0xd9, 0x52, 0x00, 0x95, 0x15, 0x98, 0xc1, 0x0f, 0x3d, 0x82, - 0x84, 0x7e, 0xfc, 0x23, 0x56, 0x2c, 0x0e, 0xe0, 0xd5, 0x71, 0xe1, 0x43, 0xd7, 0xbd, 0x01, 0xf3, - 0x61, 0x62, 0x9d, 0xc0, 0x73, 0xe7, 0x0c, 0x9e, 0x68, 0xdb, 0x9e, 0x4f, 0x07, 0xf7, 0x0e, 0x4e, - 0xc7, 0xf1, 0x6c, 0x9f, 0x4f, 0x48, 0xdc, 0x4a, 0x75, 0x5f, 0x0f, 0xe9, 0xd4, 0xc8, 0x3e, 0x53, - 0xbe, 0x4b, 0xde, 0x75, 0xf5, 0x40, 0xc5, 0x7d, 0x9f, 0x9f, 0x63, 0x8a, 0xf5, 0x3d, 0xa8, 0x72, - 0xb1, 0x9c, 0x07, 0x36, 0x26, 0x5c, 0xae, 0x9c, 0x85, 0x5c, 0x87, 0xdb, 0x0c, 0x1b, 0xd3, 0x68, - 0x3a, 0x6e, 0xe2, 0x77, 0x60, 0x51, 0x58, 0xae, 0xe7, 0x39, 0xec, 0x3d, 0x50, 0x2f, 0x17, 0x58, - 0xba, 0x26, 0xf0, 0x77, 0x9c, 0x1d, 0x9d, 0x55, 0xb8, 0xb3, 0xd2, 0x7a, 0xdd, 0xa7, 0xa2, 0x3e, - 0x53, 0xb0, 0xc5, 0x52, 0xb8, 0x05, 0xe7, 0x2e, 0xdd, 0xfb, 0x13, 0xe4, 0x85, 0xec, 0xfe, 0x83, - 0x17, 0x3a, 0x09, 0xf0, 0x03, 0xe6, 0x65, 0x2f, 0x1d, 0xb9, 0xe9, 0xb1, 0x90, 0x5a, 0x16, 0xe3, - 0xba, 0x84, 0xba, 0xfe, 0xa1, 0xe4, 0x97, 0xc5, 0x0f, 0x30, 0x3a, 0x12, 0x9e, 0x7d, 0x0d, 0x66, - 0x39, 0x7f, 0x85, 0x3a, 0x0a, 0xdc, 0xe9, 0x69, 0xb8, 0x5d, 0x65, 0xba, 0x88, 0x63, 0xc4, 0xc5, - 0x24, 0x92, 0x34, 0x4a, 0xd0, 0x53, 0x92, 0xbd, 0x78, 0xd1, 0xdd, 0xb3, 0xef, 0x3b, 0xa7, 0x95, - 0x9f, 0x3f, 0x48, 0x7d, 0x4e, 0x4e, 0xfb, 0x65, 0xb7, 0x99, 0x52, 0x76, 0xef, 0xee, 0xd9, 0xde, - 0x8d, 0xeb, 0xf7, 0xd0, 0x60, 0x88, 0x93, 0xcf, 0xcd, 0x93, 0x78, 0x74, 0x9f, 0xc0, 0xb3, 0x22, - 0xcf, 0x6b, 0x22, 0x46, 0x43, 0xc6, 0x7f, 0x5b, 0xe2, 0x97, 0x03, 0x64, 0x6b, 0x78, 0x30, 0xf6, - 0xf6, 0x7a, 0x49, 0xca, 0xf9, 0x3a, 0x9c, 0x4f, 0x95, 0x2f, 0xd4, 0xe0, 0x6f, 0x53, 0x50, 0xdb, - 0xa7, 0xc6, 0xc1, 0xd0, 0x3b, 0x70, 0x06, 0xa6, 0x36, 0x3a, 0xa6, 0xe0, 0xef, 0x40, 0xc5, 0x25, - 0xa6, 0xad, 0x99, 0x2e, 0x1a, 0xf8, 0x62, 0x57, 0xb7, 0x5a, 0x32, 0xf3, 0x51, 0x67, 0x69, 0xf3, - 0x20, 0xc0, 0xa9, 0xd1, 0x12, 0x76, 0x07, 0x25, 0x98, 0x3a, 0x43, 0xa2, 0x05, 0x4a, 0x85, 0xdf, - 0xca, 0xf7, 0x01, 0xa8, 0x87, 0x3c, 0xcc, 0x4c, 0x4d, 0xfd, 0xbc, 0x99, 0xbd, 0x79, 0x37, 0x00, - 0xaa, 0xd2, 0x1a, 0x65, 0x1f, 0xd8, 0x1b, 0xcd, 0x24, 0xc8, 0x33, 0x1d, 0xbb, 0xe7, 0x99, 0x16, - 0x16, 0x8f, 0xc0, 0xc6, 0x26, 0xef, 0xb0, 0x6d, 0x06, 0x1d, 0xb6, 0xcd, 0x3b, 0x41, 0x87, 0x6d, - 0x77, 0xfe, 0xd1, 0x93, 0xf5, 0xd2, 0x67, 0xff, 0x5e, 0x2f, 0xa9, 0x8b, 0xd1, 0x62, 0x36, 0x1d, - 0xe7, 0xf8, 0xc0, 0xaf, 0x41, 0x21, 0x83, 0xf2, 0xfd, 0xd0, 0xf5, 0x47, 0x82, 0xe7, 0x4b, 0xd1, - 0xfd, 0x90, 0xa3, 0xf7, 0xf4, 0xf6, 0x9f, 0xe5, 0xfb, 0xe1, 0xcb, 0x6a, 0x97, 0x38, 0x0d, 0x5d, - 0xe9, 0xe6, 0x78, 0x62, 0x4c, 0xfc, 0x9d, 0x33, 0xb1, 0x6f, 0x12, 0xe2, 0x90, 0x17, 0x0a, 0xad, - 0xcb, 0x30, 0x65, 0xea, 0x22, 0x27, 0xe7, 0x1e, 0x3e, 0x65, 0xea, 0xf1, 0x38, 0x9c, 0x2e, 0x8a, - 0xc3, 0xf2, 0x64, 0xd7, 0x6a, 0x59, 0x8d, 0x30, 0x02, 0x7f, 0x2f, 0xab, 0xf8, 0x42, 0xbd, 0xa6, - 0x13, 0x55, 0x31, 0x2f, 0x13, 0x72, 0x0d, 0xc6, 0x32, 0xe1, 0x57, 0xf2, 0x5d, 0x21, 0x9a, 0xff, - 0xd6, 0x3a, 0x09, 0xe3, 0xb5, 0xa0, 0x7c, 0x12, 0xb5, 0x40, 0xb6, 0x61, 0xac, 0xfb, 0xf6, 0x3b, - 0xfe, 0x4e, 0xe0, 0x73, 0x2f, 0x72, 0x31, 0x7e, 0x2e, 0x13, 0x16, 0x5c, 0x1a, 0x52, 0x6f, 0xd1, - 0x92, 0x88, 0xa1, 0xf4, 0x9f, 0x73, 0x0f, 0xe4, 0xb6, 0x3b, 0xf0, 0xdb, 0xf6, 0xca, 0x0d, 0xa8, - 0xa0, 0xa1, 0x77, 0xe8, 0x10, 0x46, 0x5f, 0x91, 0xfc, 0x11, 0x54, 0x79, 0x1b, 0x66, 0x79, 0xe3, - 0x5f, 0x64, 0x9b, 0x46, 0x1a, 0xe7, 0xfc, 0x8c, 0xdd, 0x32, 0x53, 0x50, 0x15, 0xf8, 0xed, 0x45, - 0x26, 0x6e, 0xb4, 0x93, 0xa0, 0x5b, 0x16, 0x2a, 0x14, 0xf8, 0xeb, 0x12, 0x2c, 0xfb, 0xba, 0x18, - 0x04, 0x9d, 0x72, 0xe7, 0x58, 0xb9, 0x08, 0x67, 0x63, 0x1d, 0x06, 0x53, 0xf7, 0xb9, 0x5e, 0x50, - 0x17, 0xe5, 0xf6, 0xc1, 0x9e, 0x9e, 0xd7, 0x8c, 0x28, 0x9f, 0x50, 0x33, 0xa2, 0x01, 0xf5, 0xb8, - 0xe2, 0x21, 0x2b, 0xbf, 0x9c, 0xf2, 0x27, 0x6f, 0x3a, 0x96, 0xcb, 0x72, 0xf0, 0x37, 0xc2, 0xce, - 0x2e, 0x34, 0x53, 0x1b, 0x76, 0xf7, 0x91, 0x65, 0x0e, 0x46, 0x11, 0x55, 0x8d, 0x64, 0xdf, 0xee, - 0x3d, 0x1f, 0xb2, 0xa7, 0x2b, 0x3b, 0x50, 0x33, 0x8e, 0x8c, 0x9e, 0x85, 0x5c, 0xd7, 0xb4, 0x8d, - 0xa0, 0xc2, 0x37, 0xd3, 0x1c, 0xe7, 0xd6, 0xbd, 0x5b, 0xfb, 0x1c, 0xa6, 0x56, 0x8d, 0x23, 0x43, - 0xfc, 0x3f, 0xd1, 0xba, 0x6b, 0x43, 0x2b, 0x8b, 0x88, 0x90, 0xad, 0x9f, 0xf3, 0xc7, 0xb1, 0x7f, - 0x33, 0xfa, 0x26, 0xa8, 0x8a, 0xcb, 0xd8, 0x82, 0x66, 0xfa, 0xf9, 0x81, 0x84, 0x5b, 0x5f, 0xaf, - 0xc0, 0xf4, 0x3e, 0x35, 0x94, 0x8f, 0xa1, 0x36, 0xf6, 0xbb, 0xd9, 0xeb, 0x69, 0xcc, 0xc4, 0x7e, - 0x9c, 0x69, 0x5c, 0x9e, 0x00, 0x14, 0xd6, 0xe7, 0x8f, 0xa1, 0x36, 0xf6, 0x23, 0x4c, 0xd6, 0x09, - 0x32, 0x28, 0xf3, 0x84, 0xb4, 0x5f, 0x55, 0x94, 0x01, 0x2c, 0x27, 0x9e, 0x25, 0x6f, 0x66, 0x6c, - 0x10, 0x07, 0x36, 0x3a, 0x13, 0x02, 0x65, 0x7d, 0xc6, 0xca, 0x69, 0x96, 0x3e, 0x32, 0x28, 0x53, - 0x9f, 0xb4, 0x84, 0xaf, 0x38, 0x70, 0x36, 0xf9, 0x0b, 0xd1, 0x46, 0x16, 0x23, 0x71, 0x64, 0xe3, - 0xda, 0xa4, 0x48, 0x59, 0xa5, 0xb1, 0xf7, 0x45, 0xbe, 0x13, 0x70, 0x50, 0x81, 0x13, 0xc4, 0xda, - 0x99, 0x1f, 0x01, 0x48, 0xcd, 0xec, 0x0b, 0x19, 0x4b, 0x23, 0x48, 0xe3, 0x62, 0x21, 0x44, 0x36, - 0x7f, 0xa2, 0x5d, 0x9e, 0x65, 0xfe, 0x38, 0x30, 0xd3, 0xfc, 0x59, 0x2d, 0x6e, 0xa6, 0x89, 0xd4, - 0xde, 0xce, 0xd2, 0x24, 0x82, 0x64, 0x6a, 0x92, 0xd2, 0xf4, 0x0d, 0x43, 0xa5, 0xc0, 0x0e, 0x32, - 0xa8, 0x20, 0x54, 0x62, 0x27, 0x10, 0x50, 0x52, 0xde, 0x93, 0x99, 0x22, 0x26, 0xa0, 0x8d, 0xb7, - 0x26, 0x86, 0x26, 0x03, 0xa6, 0x40, 0x2b, 0x19, 0x54, 0x10, 0x30, 0xb1, 0x13, 0xc6, 0x03, 0x46, - 0x1c, 0x33, 0x41, 0xc0, 0x88, 0xb3, 0xae, 0x4d, 0x8a, 0x4c, 0x66, 0x1c, 0xe9, 0x32, 0x9a, 0x9f, - 0x71, 0x22, 0x60, 0x41, 0xc6, 0x49, 0x5e, 0x7f, 0x95, 0x1f, 0x43, 0x55, 0x6e, 0x12, 0xb7, 0x73, - 0x03, 0xcf, 0xc7, 0x34, 0x2e, 0x15, 0x63, 0xe4, 0xed, 0xe5, 0xa6, 0x6b, 0x3b, 0xd7, 0x9f, 0xf2, - 0xb7, 0x4f, 0x69, 0xa3, 0x32, 0xe3, 0x24, 0x5b, 0xa8, 0x1b, 0xb9, 0x1c, 0x48, 0xc8, 0x4c, 0xe3, - 0x64, 0x76, 0x16, 0x23, 0xe3, 0x48, 0x5d, 0xc5, 0x37, 0x8b, 0x77, 0xf1, 0x81, 0x05, 0xc6, 0x49, - 0xf6, 0xf6, 0x58, 0x3e, 0x90, 0xfa, 0x7a, 0x59, 0xf9, 0x20, 0x82, 0x64, 0xe6, 0x83, 0x64, 0xcf, - 0x8d, 0x59, 0x46, 0xbe, 0xf5, 0xb7, 0x73, 0x63, 0x22, 0xdf, 0x32, 0x29, 0x57, 0x73, 0xe5, 0x47, - 0x50, 0x89, 0x5a, 0x33, 0xad, 0x8c, 0x85, 0x21, 0xa2, 0xb1, 0x51, 0x84, 0x48, 0xe6, 0x31, 0xb1, - 0x77, 0x7e, 0x1e, 0x13, 0xdb, 0x5f, 0x9e, 0x00, 0x24, 0x9f, 0x30, 0xf6, 0xa2, 0x78, 0x3d, 0xd7, - 0x6c, 0x1c, 0x94, 0x79, 0x42, 0xda, 0x33, 0x40, 0xd1, 0x60, 0x61, 0xfc, 0xe6, 0xf6, 0xff, 0x99, - 0xcc, 0x4a, 0xa8, 0xc6, 0x95, 0x49, 0x50, 0xe1, 0x21, 0x3f, 0x83, 0x57, 0xd2, 0x6f, 0xd4, 0x57, - 0x32, 0x8b, 0x46, 0x0a, 0xba, 0x71, 0xfd, 0x79, 0xd0, 0xe1, 0xe1, 0x43, 0x38, 0x97, 0x76, 0x43, - 0xbd, 0x94, 0x9b, 0xe1, 0xc7, 0x0f, 0xde, 0x9a, 0x1c, 0x1b, 0x1c, 0xbb, 0xbb, 0xf7, 0xe8, 0x69, - 0xb3, 0xf4, 0xf8, 0x69, 0xb3, 0xf4, 0xd5, 0xd3, 0x66, 0xe9, 0xb3, 0x67, 0xcd, 0x33, 0x8f, 0x9f, - 0x35, 0xcf, 0xfc, 0xf3, 0x59, 0xf3, 0xcc, 0x47, 0x1d, 0xc3, 0xf4, 0x0e, 0x87, 0x7d, 0xf6, 0x78, - 0xe9, 0xf4, 0xed, 0xfe, 0x55, 0xed, 0x10, 0x99, 0x76, 0x47, 0xfa, 0xeb, 0xaf, 0x87, 0xd1, 0xdf, - 0xc8, 0x8d, 0x5c, 0x4c, 0xfb, 0xb3, 0x7e, 0x67, 0xed, 0x3b, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, - 0x66, 0x33, 0x60, 0x9d, 0x46, 0x27, 0x00, 0x00, + // 2212 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0x4b, 0x6c, 0x1b, 0xc7, + 0x19, 0x36, 0x45, 0xea, 0xc1, 0x9f, 0xd4, 0xc3, 0x1b, 0x39, 0x62, 0xa8, 0x9a, 0xa2, 0x99, 0x22, + 0x91, 0x5f, 0xa2, 0xa3, 0xba, 0x46, 0x2a, 0x14, 0x45, 0x25, 0xa7, 0x71, 0x85, 0x84, 0xb5, 0xb2, + 0xb2, 0x5d, 0x20, 0x40, 0xc1, 0x0c, 0x77, 0xc7, 0xab, 0x6d, 0xc8, 0xdd, 0xed, 0xcc, 0x52, 0x36, + 0x53, 0xa0, 0x87, 0x5e, 0x7a, 0x4d, 0x91, 0x1e, 0x7a, 0x28, 0x0a, 0x14, 0xe8, 0xa1, 0xa7, 0xa2, + 0x28, 0x72, 0x2e, 0x7a, 0x09, 0x10, 0xf4, 0x64, 0xe4, 0x54, 0xf4, 0x90, 0x06, 0x76, 0x8b, 0xde, + 0x7b, 0xe9, 0xb5, 0x98, 0x9d, 0xd9, 0xdd, 0xe1, 0x3e, 0x29, 0x59, 0x4a, 0x74, 0x92, 0x76, 0xe6, + 0x9b, 0x7f, 0xfe, 0xf7, 0xfc, 0xf3, 0x0f, 0x61, 0xd5, 0x20, 0x18, 0x5b, 0x0f, 0x4d, 0xdc, 0xd7, + 0xdb, 0xd4, 0xb5, 0x09, 0x32, 0x70, 0xdb, 0x7d, 0xbc, 0xe1, 0x10, 0xdb, 0xb5, 0x15, 0x25, 0x9c, + 0xdc, 0x10, 0x93, 0xf5, 0x15, 0xcd, 0xa6, 0x03, 0x9b, 0xb6, 0x07, 0xd4, 0x68, 0x1f, 0xbe, 0xc6, + 0xfe, 0x70, 0x70, 0xfd, 0x25, 0x3e, 0xd1, 0xf5, 0xbe, 0xda, 0xfc, 0x43, 0x4c, 0x2d, 0x1b, 0xb6, + 0x61, 0xf3, 0x71, 0xf6, 0x9f, 0x18, 0x5d, 0x33, 0x6c, 0xdb, 0xe8, 0xe3, 0xb6, 0xf7, 0xd5, 0x1b, + 0x3e, 0x6c, 0xbb, 0xe6, 0x00, 0x53, 0x17, 0x0d, 0x1c, 0x01, 0x68, 0x4a, 0xbc, 0x69, 0xf6, 0x60, + 0x60, 0x5b, 0x6d, 0xe4, 0x38, 0xc4, 0x3e, 0x44, 0xfd, 0x80, 0x44, 0x0c, 0xf1, 0x88, 0x20, 0xc7, + 0xc1, 0x44, 0x00, 0x5a, 0x12, 0xc0, 0xc1, 0x64, 0x60, 0x52, 0x6a, 0xda, 0x96, 0xc0, 0x26, 0x10, + 0xf1, 0x55, 0x90, 0x0b, 0x70, 0x10, 0x41, 0x03, 0x21, 0x5f, 0xeb, 0x2f, 0x45, 0x58, 0xec, 0x50, + 0xe3, 0x36, 0xc1, 0xc8, 0xc5, 0x3b, 0x43, 0xed, 0x7d, 0xec, 0x2a, 0x9b, 0x30, 0xab, 0xb1, 0x6f, + 0x9b, 0xd4, 0x0a, 0xcd, 0xc2, 0x7a, 0x79, 0xa7, 0xf6, 0xd9, 0xc7, 0xd7, 0x97, 0x85, 0x5a, 0xb6, + 0x75, 0x9d, 0x60, 0x4a, 0xf7, 0x5d, 0x62, 0x5a, 0x86, 0xea, 0x03, 0x95, 0x35, 0xa8, 0xf4, 0xbc, + 0xd5, 0x5d, 0x0b, 0x0d, 0x70, 0x6d, 0x8a, 0xad, 0x53, 0x81, 0x0f, 0xfd, 0x00, 0x0d, 0xb0, 0xb2, + 0x03, 0x70, 0x68, 0x52, 0xb3, 0x67, 0xf6, 0x4d, 0x77, 0x54, 0x2b, 0x36, 0x0b, 0xeb, 0x0b, 0x9b, + 0xad, 0x8d, 0xb8, 0x95, 0x36, 0x1e, 0x04, 0xa8, 0x7b, 0x23, 0x07, 0xab, 0xd2, 0x2a, 0x65, 0x1b, + 0x16, 0x1d, 0x34, 0x1a, 0x60, 0xcb, 0xed, 0x22, 0xce, 0x46, 0xad, 0x94, 0xc3, 0xe0, 0x82, 0x58, + 0x20, 0x46, 0x95, 0x37, 0x41, 0x71, 0x88, 0x39, 0x40, 0x64, 0xd4, 0xa5, 0x4e, 0x40, 0x65, 0x3a, + 0x87, 0xca, 0x92, 0x58, 0xb3, 0xef, 0xf8, 0x74, 0xde, 0x82, 0x17, 0x64, 0x3a, 0xc2, 0xb6, 0xb5, + 0x99, 0x66, 0x61, 0xbd, 0xb2, 0xb9, 0x2a, 0xcb, 0x25, 0xec, 0xb1, 0x2d, 0x20, 0xea, 0xf9, 0x90, + 0x96, 0x18, 0x52, 0xae, 0x81, 0xa2, 0x1d, 0x20, 0x62, 0x60, 0xbd, 0x4b, 0x30, 0xd2, 0xbb, 0x3f, + 0x19, 0xda, 0x2e, 0xaa, 0xcd, 0x36, 0x0b, 0xeb, 0x25, 0x75, 0x49, 0xcc, 0xa8, 0x18, 0xe9, 0xef, + 0xb0, 0xf1, 0xad, 0xea, 0xcf, 0xff, 0xf3, 0xa7, 0x2b, 0xbe, 0xe2, 0x5b, 0xfb, 0xb0, 0x12, 0xb1, + 0x9f, 0x8a, 0xa9, 0x63, 0x5b, 0x14, 0x2b, 0xaf, 0x43, 0x59, 0xd8, 0xc4, 0xd4, 0x85, 0x25, 0x57, + 0x3f, 0xfd, 0x7c, 0xed, 0xdc, 0x3f, 0x3e, 0x5f, 0x2b, 0xdd, 0x37, 0x2d, 0xf7, 0xb3, 0x8f, 0xaf, + 0x57, 0x84, 0xb8, 0xec, 0x53, 0x9d, 0xe3, 0xe8, 0x5d, 0xbd, 0xf5, 0xc8, 0x73, 0x8a, 0x37, 0x70, + 0x1f, 0x07, 0x4e, 0x71, 0x13, 0xe6, 0x6c, 0x07, 0x93, 0x89, 0xbc, 0x22, 0x40, 0xe6, 0xba, 0xc5, + 0xd6, 0x3c, 0x13, 0x26, 0xc0, 0xb7, 0x5e, 0xf2, 0xa4, 0x91, 0x37, 0xf6, 0xa5, 0x69, 0xfd, 0xaa, + 0x00, 0xcb, 0x6c, 0xce, 0xa4, 0x9a, 0x6d, 0xb9, 0xa6, 0x35, 0x3c, 0x5d, 0xce, 0x94, 0x17, 0x61, + 0x86, 0x60, 0x44, 0x6d, 0xcb, 0x73, 0xd6, 0xb2, 0x2a, 0xbe, 0xa2, 0x1c, 0x37, 0xe0, 0x6b, 0x49, + 0x5c, 0x05, 0x6c, 0xff, 0x4b, 0x0e, 0xb0, 0xbb, 0xbd, 0x1f, 0x63, 0xed, 0x94, 0x02, 0x6c, 0x0d, + 0x2a, 0xb6, 0x47, 0x9e, 0x03, 0x38, 0xd3, 0xc0, 0x87, 0x3c, 0xc0, 0x25, 0xa8, 0x3a, 0x68, 0xd4, + 0xb7, 0x91, 0xde, 0xa5, 0xe6, 0x07, 0xd8, 0x0b, 0x9d, 0x92, 0x5a, 0x11, 0x63, 0xfb, 0xe6, 0x07, + 0xd1, 0x20, 0x9d, 0x3e, 0x56, 0x90, 0x5e, 0x82, 0x2a, 0x53, 0x05, 0x0b, 0x52, 0x77, 0xe4, 0x60, + 0x2f, 0x24, 0xca, 0x6a, 0x45, 0x8c, 0x31, 0x78, 0x5a, 0xf0, 0xcc, 0x1e, 0x2b, 0x78, 0x2e, 0xc3, + 0x12, 0x7e, 0xec, 0x30, 0xb9, 0xb5, 0x03, 0xac, 0xbd, 0x4f, 0x87, 0x03, 0x5a, 0x9b, 0x6b, 0x16, + 0xd7, 0xab, 0xea, 0x22, 0x1f, 0xbf, 0xed, 0x0f, 0x2b, 0x6f, 0xc1, 0x22, 0xc1, 0xfa, 0xd0, 0xd2, + 0x91, 0xa5, 0x8d, 0x38, 0x77, 0xe5, 0x74, 0x19, 0xd5, 0x00, 0xea, 0xc9, 0xb8, 0x40, 0xc6, 0xbe, + 0x33, 0xc2, 0x90, 0x5b, 0x59, 0x0e, 0x43, 0x61, 0x98, 0x09, 0xc3, 0x90, 0xa3, 0x77, 0xf5, 0xd6, + 0x47, 0x53, 0x30, 0xdf, 0xa1, 0xc6, 0x3e, 0x46, 0x7d, 0xe1, 0x39, 0xa7, 0xe4, 0xeb, 0xb9, 0xbe, + 0xf3, 0x4d, 0x58, 0x31, 0xfa, 0x76, 0x0f, 0xf5, 0xbb, 0x87, 0x26, 0x71, 0x87, 0xa8, 0xdf, 0x35, + 0x88, 0x3d, 0x74, 0x98, 0x44, 0xcc, 0x8d, 0xe6, 0xd5, 0x65, 0x3e, 0xfd, 0x80, 0xcf, 0xde, 0x61, + 0x93, 0xbb, 0xba, 0xf2, 0x06, 0xac, 0x51, 0xac, 0xd9, 0x96, 0x2e, 0x4c, 0xdd, 0xeb, 0xd3, 0x2e, + 0x32, 0x8c, 0x2e, 0x35, 0x0d, 0x0b, 0xb9, 0x43, 0x82, 0x79, 0xea, 0xad, 0xaa, 0xab, 0x01, 0x6c, + 0xdf, 0xd9, 0xe9, 0xd3, 0x6d, 0xc3, 0xd8, 0x0f, 0x20, 0xd1, 0x88, 0x5b, 0x81, 0x0b, 0x63, 0x4a, + 0x09, 0x42, 0xed, 0x37, 0x05, 0x78, 0xa1, 0x43, 0x0d, 0x15, 0xb3, 0xd1, 0xaf, 0x5e, 0x69, 0x51, + 0xbe, 0x2f, 0xc2, 0x6a, 0x02, 0x77, 0x01, 0xf7, 0x7f, 0xe4, 0xc6, 0xbe, 0x6d, 0x3b, 0x23, 0xc1, + 0x77, 0x3d, 0xca, 0xb7, 0xc4, 0xdd, 0x2b, 0xb0, 0x48, 0x89, 0xd6, 0x8d, 0x73, 0x38, 0x4f, 0x89, + 0xb6, 0x13, 0x32, 0xf9, 0x0a, 0x2c, 0xea, 0xd4, 0x1d, 0xc3, 0x71, 0x46, 0xe7, 0x75, 0xea, 0x8e, + 0xe3, 0x18, 0x3d, 0x59, 0xa0, 0x52, 0x40, 0xef, 0x6e, 0xe8, 0x08, 0x82, 0x9e, 0x8c, 0x9b, 0x0e, + 0xe8, 0x49, 0x38, 0x15, 0x56, 0x18, 0xee, 0x98, 0x67, 0xe4, 0xb2, 0x4e, 0xdd, 0xbd, 0x68, 0xa4, + 0x47, 0xf5, 0xf9, 0x8e, 0xe7, 0x07, 0xa1, 0xbe, 0x4e, 0x20, 0xe0, 0x7e, 0x5d, 0x90, 0x0e, 0xbe, + 0xb3, 0xe5, 0x3d, 0xf2, 0xc9, 0x18, 0xf1, 0x9c, 0x27, 0xb1, 0x93, 0xf1, 0x74, 0x59, 0xdf, 0x02, + 0x08, 0xf4, 0x4b, 0x6b, 0xc5, 0x66, 0x31, 0x4f, 0xc1, 0x65, 0x5f, 0xc1, 0x54, 0x3a, 0x55, 0x4b, + 0x47, 0x3a, 0x55, 0x23, 0x22, 0xff, 0xa2, 0x00, 0x0b, 0x41, 0xbe, 0xf5, 0xb2, 0xcd, 0xb1, 0x0e, + 0xd5, 0x8b, 0x00, 0x3c, 0x8f, 0x49, 0x92, 0x96, 0xbd, 0x11, 0x4f, 0xd0, 0x65, 0x98, 0xc6, 0x8f, + 0x5d, 0x82, 0x84, 0x75, 0xf8, 0x47, 0x24, 0xf1, 0xef, 0xc1, 0x8b, 0xe3, 0x8c, 0x04, 0x6e, 0x78, + 0x0b, 0xe6, 0x82, 0x24, 0x39, 0x81, 0x17, 0xce, 0x1a, 0x3c, 0x69, 0xb6, 0x5c, 0x4f, 0x34, 0x6e, + 0x69, 0x2e, 0xda, 0xf1, 0xec, 0x98, 0x2d, 0x5c, 0x54, 0xe3, 0x35, 0x4f, 0x0e, 0x69, 0xd7, 0x40, + 0xd7, 0x9f, 0x4c, 0x79, 0xee, 0x75, 0xdf, 0xd1, 0x7d, 0x11, 0x3b, 0x78, 0xd0, 0xc3, 0xe4, 0x98, + 0x6c, 0x7d, 0x0b, 0x2a, 0x9c, 0x2d, 0xfb, 0x91, 0x85, 0x09, 0xe7, 0x2b, 0x63, 0x21, 0x97, 0xe1, + 0x2e, 0xc3, 0x46, 0x24, 0x2a, 0x46, 0xcd, 0xf5, 0x7d, 0x58, 0x18, 0x78, 0x9c, 0xd1, 0xae, 0x6b, + 0xb3, 0xda, 0xbe, 0x56, 0x6a, 0x16, 0xd7, 0x2b, 0xc9, 0xa7, 0x7b, 0x87, 0x1a, 0x92, 0x2c, 0x6a, + 0x55, 0xac, 0xbc, 0x67, 0x6f, 0xeb, 0xec, 0xdc, 0x3a, 0x2f, 0x51, 0xd2, 0x3d, 0xa5, 0xd4, 0xa6, + 0x3d, 0x47, 0x4f, 0xe7, 0x74, 0x31, 0x20, 0xc1, 0xb5, 0x98, 0xec, 0xd3, 0x31, 0x35, 0x06, 0x7a, + 0xfe, 0xaf, 0x7f, 0x7c, 0x59, 0xf8, 0xd1, 0x59, 0x56, 0xf3, 0xb7, 0x61, 0x56, 0x48, 0x7a, 0x04, + 0xfd, 0xfa, 0x4b, 0xd2, 0x0e, 0xc5, 0x71, 0x99, 0x03, 0x9d, 0xfc, 0x92, 0xc7, 0xb9, 0xac, 0x8e, + 0x1b, 0x30, 0xc3, 0x69, 0xe5, 0x2a, 0x43, 0xe0, 0x94, 0x0e, 0xb0, 0x4a, 0xd0, 0x24, 0xc8, 0x35, + 0x6d, 0xab, 0xcb, 0xae, 0xea, 0x9e, 0x3a, 0x2a, 0x9b, 0xf5, 0x0d, 0x7e, 0x8f, 0xdf, 0xf0, 0xef, + 0xf1, 0x1b, 0xf7, 0xfc, 0x7b, 0xfc, 0xce, 0x1c, 0x8b, 0xd5, 0x0f, 0xff, 0xb9, 0x56, 0x50, 0x17, + 0xc2, 0xc5, 0x6c, 0xba, 0xf5, 0x37, 0x6e, 0x27, 0xc9, 0x90, 0xdf, 0x63, 0x79, 0xe1, 0xcc, 0xd9, + 0x29, 0xc8, 0x5e, 0x25, 0x39, 0x7b, 0x25, 0xea, 0x3f, 0x2a, 0x4b, 0xa0, 0xff, 0x3f, 0x14, 0xbc, + 0xa2, 0xe4, 0x6d, 0x8c, 0x0e, 0x45, 0x2e, 0x3a, 0xba, 0xfa, 0x4f, 0x4d, 0xc2, 0xad, 0x0a, 0x93, + 0x45, 0x6c, 0x23, 0xca, 0xc2, 0x90, 0xd3, 0xf0, 0x78, 0x9c, 0x92, 0xec, 0xc5, 0x4b, 0x9e, 0x5d, + 0xeb, 0xa1, 0x7d, 0x5a, 0xa7, 0xe3, 0xdb, 0x89, 0x97, 0xf9, 0xa2, 0xe7, 0x70, 0x8d, 0x84, 0xa2, + 0xe7, 0xfe, 0xae, 0xe5, 0xde, 0xba, 0xf9, 0x00, 0xf5, 0x87, 0x38, 0x7e, 0xd9, 0x3f, 0x89, 0x96, + 0xc7, 0x09, 0x5c, 0xea, 0xb2, 0xbc, 0x26, 0xd4, 0x68, 0xa0, 0xf1, 0xdf, 0x16, 0x78, 0x69, 0x86, + 0x2c, 0x0d, 0xf7, 0xc7, 0x6e, 0xbe, 0x67, 0xa4, 0x98, 0x5a, 0x83, 0x8b, 0x89, 0xfc, 0x05, 0x12, + 0xfc, 0x75, 0x0a, 0xaa, 0x1d, 0x6a, 0xec, 0x0d, 0xdd, 0x3d, 0xbb, 0x6f, 0x6a, 0xa3, 0x63, 0x32, + 0xfe, 0x1d, 0x28, 0x3b, 0xc4, 0xb4, 0x34, 0xd3, 0x41, 0x7d, 0x91, 0x73, 0x9a, 0xb2, 0xe6, 0xc3, + 0xbe, 0xde, 0xc6, 0x9e, 0x8f, 0x53, 0xc3, 0x25, 0xec, 0x06, 0x40, 0x30, 0xb5, 0x87, 0x44, 0xf3, + 0x85, 0x0a, 0xbe, 0x95, 0xef, 0x02, 0x50, 0x17, 0xb9, 0x98, 0x99, 0xda, 0xcf, 0xc4, 0x69, 0xc4, + 0xf7, 0x7d, 0xa0, 0x2a, 0xad, 0x49, 0xca, 0x8b, 0xb3, 0x13, 0xe5, 0xc5, 0x42, 0x52, 0x5e, 0x8c, + 0xea, 0x78, 0xcf, 0xab, 0x1a, 0x02, 0x0d, 0xca, 0xd5, 0xb9, 0xe3, 0x8d, 0xf8, 0x97, 0xc7, 0xbc, + 0xea, 0x9c, 0xa3, 0x77, 0xf5, 0xd6, 0x9f, 0xe5, 0xea, 0xfc, 0xac, 0xda, 0x25, 0xaa, 0x86, 0x7d, + 0xa9, 0x6e, 0x3f, 0x31, 0x4d, 0x7c, 0xc2, 0x35, 0xd1, 0x31, 0x09, 0xb1, 0xc9, 0x73, 0x85, 0xd6, + 0x55, 0x98, 0x32, 0x75, 0x91, 0x93, 0x33, 0x37, 0x9f, 0x32, 0xf5, 0x68, 0x1c, 0x16, 0xf3, 0xe2, + 0xb0, 0x34, 0xd9, 0xa5, 0x46, 0x16, 0x23, 0x88, 0xc0, 0xdf, 0xcb, 0x22, 0x3e, 0x57, 0xa7, 0xef, + 0x44, 0x45, 0xcc, 0xca, 0x84, 0x5c, 0x82, 0xb1, 0x4c, 0xf8, 0x85, 0x5c, 0x2b, 0x84, 0xf3, 0x5f, + 0x59, 0x1f, 0x67, 0xfc, 0x2c, 0x28, 0x9d, 0xc4, 0x59, 0x20, 0xdb, 0x30, 0xd2, 0xfb, 0xfc, 0x1d, + 0xaf, 0xde, 0xf8, 0xdc, 0xf3, 0x5c, 0x65, 0x8e, 0x64, 0xc2, 0x9c, 0xa2, 0x21, 0xf1, 0xde, 0x23, + 0xb1, 0x18, 0x70, 0xff, 0x11, 0xf7, 0x40, 0x6e, 0xbb, 0x3d, 0xef, 0xd1, 0x44, 0xb9, 0x05, 0x65, + 0x34, 0x74, 0x0f, 0x6c, 0xc2, 0xd4, 0x97, 0xc7, 0x7f, 0x08, 0x55, 0x5e, 0x87, 0x19, 0xfe, 0xec, + 0x12, 0x56, 0x9e, 0x71, 0x9d, 0xf3, 0x3d, 0x76, 0x4a, 0x4c, 0x40, 0x55, 0xe0, 0xb7, 0x16, 0x18, + 0xbb, 0x21, 0x25, 0xa1, 0x6e, 0x99, 0xa9, 0x80, 0xe1, 0xff, 0x15, 0x60, 0xc9, 0x93, 0xc5, 0x20, + 0xe8, 0x94, 0xfb, 0xf6, 0xca, 0x65, 0x38, 0x1f, 0xe9, 0xef, 0x98, 0xba, 0xa7, 0xeb, 0x79, 0x75, + 0x41, 0x6e, 0xde, 0xec, 0xea, 0x59, 0xad, 0xa0, 0xd2, 0x09, 0xb5, 0x82, 0xea, 0x50, 0x8b, 0x0a, + 0x1e, 0xb6, 0x0a, 0xa6, 0xbc, 0xc9, 0xdb, 0xf6, 0xc0, 0x61, 0x39, 0xf8, 0x4b, 0xd1, 0xce, 0x0e, + 0x34, 0x12, 0xdb, 0xa5, 0x0f, 0xd1, 0xc0, 0xec, 0x8f, 0x42, 0x55, 0xd5, 0xe3, 0x5d, 0xd3, 0x37, + 0x3d, 0xc8, 0xae, 0xae, 0x6c, 0x43, 0xd5, 0x38, 0x34, 0xba, 0x03, 0xe4, 0x38, 0xa6, 0x65, 0xf8, + 0x27, 0x7c, 0x23, 0xc9, 0x71, 0xee, 0x3c, 0xb8, 0xd3, 0xe1, 0x30, 0xb5, 0x62, 0x1c, 0x1a, 0xe2, + 0xff, 0xd8, 0x5d, 0xab, 0x05, 0xcd, 0x34, 0x45, 0x04, 0xda, 0xfa, 0x19, 0x6f, 0x67, 0x78, 0x95, + 0xd1, 0x97, 0xa1, 0xaa, 0x28, 0x8f, 0x4d, 0x68, 0x24, 0xef, 0xef, 0x73, 0xb8, 0xf9, 0xef, 0x0b, + 0x50, 0xec, 0x50, 0x43, 0x79, 0x0f, 0xaa, 0x63, 0xaf, 0x96, 0x2f, 0xa7, 0xdc, 0x42, 0x65, 0x50, + 0xfd, 0xea, 0x04, 0xa0, 0xe0, 0x7c, 0x7e, 0x0f, 0xaa, 0x63, 0x4f, 0x60, 0x69, 0x3b, 0xc8, 0xa0, + 0xd4, 0x1d, 0x92, 0xde, 0xb4, 0x94, 0x3e, 0x2c, 0xc5, 0xae, 0x25, 0xaf, 0xa6, 0x10, 0x88, 0x02, + 0xeb, 0xed, 0x09, 0x81, 0xb2, 0x3c, 0x63, 0xc7, 0x69, 0x9a, 0x3c, 0x32, 0x28, 0x55, 0x9e, 0xa4, + 0x84, 0xaf, 0xd8, 0x70, 0x3e, 0xfe, 0x3e, 0xb7, 0x9e, 0xa6, 0x91, 0x28, 0xb2, 0x7e, 0x63, 0x52, + 0xa4, 0x2c, 0xd2, 0xd8, 0xfd, 0x22, 0xdb, 0x09, 0x38, 0x28, 0xc7, 0x09, 0x22, 0xcd, 0xe4, 0x77, + 0x01, 0xa4, 0xa7, 0x84, 0x4b, 0x29, 0x4b, 0x43, 0x48, 0xfd, 0x72, 0x2e, 0x44, 0x36, 0x7f, 0xec, + 0xb1, 0x22, 0xcd, 0xfc, 0x51, 0x60, 0xaa, 0xf9, 0xd3, 0x1e, 0x18, 0x98, 0x24, 0xd2, 0xe3, 0x42, + 0x9a, 0x24, 0x21, 0x24, 0x55, 0x92, 0x84, 0x96, 0x7b, 0x10, 0x2a, 0x39, 0x76, 0x90, 0x41, 0x39, + 0xa1, 0x12, 0xd9, 0x81, 0x80, 0x92, 0x70, 0x9f, 0x4c, 0x65, 0x31, 0x06, 0xad, 0xbf, 0x36, 0x31, + 0x34, 0x1e, 0x30, 0x39, 0x52, 0xc9, 0xa0, 0x9c, 0x80, 0x89, 0xec, 0x30, 0x1e, 0x30, 0x62, 0x9b, + 0x09, 0x02, 0x46, 0xec, 0x75, 0x63, 0x52, 0x64, 0x3c, 0xe3, 0x48, 0xc5, 0x68, 0x76, 0xc6, 0x09, + 0x81, 0x39, 0x19, 0x27, 0x5e, 0xfe, 0x2a, 0x3f, 0x82, 0x8a, 0xdc, 0xa2, 0x6f, 0x65, 0x06, 0x9e, + 0x87, 0xa9, 0x5f, 0xc9, 0xc7, 0xc8, 0xe4, 0xe5, 0x36, 0x79, 0x2b, 0xd3, 0x9f, 0xb2, 0xc9, 0x27, + 0x34, 0xbe, 0x99, 0x71, 0xe2, 0x4d, 0xef, 0xf5, 0x4c, 0x1d, 0x48, 0xc8, 0x54, 0xe3, 0xa4, 0x76, + 0x80, 0x43, 0xe3, 0x48, 0x5d, 0xc5, 0x57, 0xf3, 0xa9, 0x78, 0xc0, 0x1c, 0xe3, 0xc4, 0x7b, 0x7b, + 0x2c, 0x1f, 0x48, 0x7d, 0xbd, 0xb4, 0x7c, 0x10, 0x42, 0x52, 0xf3, 0x41, 0xbc, 0xe7, 0xc6, 0x2c, + 0x23, 0x57, 0xfd, 0xad, 0xcc, 0x98, 0xc8, 0xb6, 0x4c, 0x42, 0x69, 0xce, 0x13, 0x67, 0xa4, 0x4d, + 0x9e, 0x9e, 0x38, 0xc7, 0x81, 0x19, 0x89, 0x33, 0xb9, 0x09, 0xad, 0xfc, 0x10, 0xca, 0x61, 0x23, + 0xa8, 0x99, 0xb2, 0x3a, 0x40, 0xd4, 0xd7, 0xf3, 0x10, 0xf1, 0xac, 0x29, 0x68, 0x67, 0x67, 0x4d, + 0x41, 0xfe, 0xea, 0x04, 0x20, 0x79, 0x87, 0xb1, 0xfb, 0xcb, 0xcb, 0x99, 0x4e, 0xc2, 0x41, 0xa9, + 0x3b, 0x24, 0x5d, 0x3a, 0x14, 0x0d, 0xe6, 0xc7, 0xeb, 0xc4, 0xaf, 0xa7, 0xda, 0x51, 0x42, 0xd5, + 0xaf, 0x4d, 0x82, 0x0a, 0x36, 0xf9, 0x29, 0x5c, 0x48, 0xae, 0xdf, 0xaf, 0xa5, 0x1e, 0x51, 0x09, + 0xe8, 0xfa, 0xcd, 0xa3, 0xa0, 0x83, 0xcd, 0x87, 0xf0, 0x42, 0x52, 0x3d, 0x7c, 0x25, 0xf3, 0x3c, + 0x19, 0xdf, 0x78, 0x73, 0x72, 0xac, 0xbf, 0xed, 0xce, 0xee, 0xa7, 0x4f, 0x1b, 0x85, 0x27, 0x4f, + 0x1b, 0x85, 0x2f, 0x9e, 0x36, 0x0a, 0x1f, 0x3e, 0x6b, 0x9c, 0x7b, 0xf2, 0xac, 0x71, 0xee, 0xef, + 0xcf, 0x1a, 0xe7, 0xde, 0x6d, 0x1b, 0xa6, 0x7b, 0x30, 0xec, 0xb1, 0xab, 0x52, 0xbb, 0x67, 0xf5, + 0xae, 0x6b, 0x07, 0xc8, 0xb4, 0xda, 0xd2, 0x2f, 0xfd, 0x1e, 0x87, 0xbf, 0x87, 0x1c, 0x39, 0x98, + 0xf6, 0x66, 0xbc, 0x3e, 0xde, 0x37, 0xfe, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x52, 0x65, 0xa3, 0x5a, + 0x32, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3051,6 +3211,7 @@ type MsgClient interface { UpdateGroupExtra(ctx context.Context, in *MsgUpdateGroupExtra, opts ...grpc.CallOption) (*MsgUpdateGroupExtraResponse, error) LeaveGroup(ctx context.Context, in *MsgLeaveGroup, opts ...grpc.CallOption) (*MsgLeaveGroupResponse, error) MirrorGroup(ctx context.Context, in *MsgMirrorGroup, opts ...grpc.CallOption) (*MsgMirrorGroupResponse, error) + RenewGroupMember(ctx context.Context, in *MsgRenewGroupMember, opts ...grpc.CallOption) (*MsgRenewGroupMemberResponse, error) // basic operation of policy PutPolicy(ctx context.Context, in *MsgPutPolicy, opts ...grpc.CallOption) (*MsgPutPolicyResponse, error) DeletePolicy(ctx context.Context, in *MsgDeletePolicy, opts ...grpc.CallOption) (*MsgDeletePolicyResponse, error) @@ -3250,6 +3411,15 @@ func (c *msgClient) MirrorGroup(ctx context.Context, in *MsgMirrorGroup, opts .. return out, nil } +func (c *msgClient) RenewGroupMember(ctx context.Context, in *MsgRenewGroupMember, opts ...grpc.CallOption) (*MsgRenewGroupMemberResponse, error) { + out := new(MsgRenewGroupMemberResponse) + err := c.cc.Invoke(ctx, "/greenfield.storage.Msg/RenewGroupMember", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *msgClient) PutPolicy(ctx context.Context, in *MsgPutPolicy, opts ...grpc.CallOption) (*MsgPutPolicyResponse, error) { out := new(MsgPutPolicyResponse) err := c.cc.Invoke(ctx, "/greenfield.storage.Msg/PutPolicy", in, out, opts...) @@ -3329,6 +3499,7 @@ type MsgServer interface { UpdateGroupExtra(context.Context, *MsgUpdateGroupExtra) (*MsgUpdateGroupExtraResponse, error) LeaveGroup(context.Context, *MsgLeaveGroup) (*MsgLeaveGroupResponse, error) MirrorGroup(context.Context, *MsgMirrorGroup) (*MsgMirrorGroupResponse, error) + RenewGroupMember(context.Context, *MsgRenewGroupMember) (*MsgRenewGroupMemberResponse, error) // basic operation of policy PutPolicy(context.Context, *MsgPutPolicy) (*MsgPutPolicyResponse, error) DeletePolicy(context.Context, *MsgDeletePolicy) (*MsgDeletePolicyResponse, error) @@ -3404,6 +3575,9 @@ func (*UnimplementedMsgServer) LeaveGroup(ctx context.Context, req *MsgLeaveGrou func (*UnimplementedMsgServer) MirrorGroup(ctx context.Context, req *MsgMirrorGroup) (*MsgMirrorGroupResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method MirrorGroup not implemented") } +func (*UnimplementedMsgServer) RenewGroupMember(ctx context.Context, req *MsgRenewGroupMember) (*MsgRenewGroupMemberResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RenewGroupMember not implemented") +} func (*UnimplementedMsgServer) PutPolicy(ctx context.Context, req *MsgPutPolicy) (*MsgPutPolicyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PutPolicy not implemented") } @@ -3787,6 +3961,24 @@ func _Msg_MirrorGroup_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } +func _Msg_RenewGroupMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRenewGroupMember) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RenewGroupMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/greenfield.storage.Msg/RenewGroupMember", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RenewGroupMember(ctx, req.(*MsgRenewGroupMember)) + } + return interceptor(ctx, in, info, handler) +} + func _Msg_PutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MsgPutPolicy) if err := dec(in); err != nil { @@ -3979,6 +4171,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "MirrorGroup", Handler: _Msg_MirrorGroup_Handler, }, + { + MethodName: "RenewGroupMember", + Handler: _Msg_RenewGroupMember_Handler, + }, { MethodName: "PutPolicy", Handler: _Msg_PutPolicy_Handler, @@ -4783,16 +4979,7 @@ func (m *MsgCreateGroup) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Extra) i = encodeVarintTx(dAtA, i, uint64(len(m.Extra))) i-- - dAtA[i] = 0x22 - } - if len(m.Members) > 0 { - for iNdEx := len(m.Members) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Members[iNdEx]) - copy(dAtA[i:], m.Members[iNdEx]) - i = encodeVarintTx(dAtA, i, uint64(len(m.Members[iNdEx]))) - i-- - dAtA[i] = 0x1a - } + dAtA[i] = 0x1a } if len(m.GroupName) > 0 { i -= len(m.GroupName) @@ -4935,9 +5122,14 @@ func (m *MsgUpdateGroupMember) MarshalToSizedBuffer(dAtA []byte) (int, error) { } if len(m.MembersToAdd) > 0 { for iNdEx := len(m.MembersToAdd) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.MembersToAdd[iNdEx]) - copy(dAtA[i:], m.MembersToAdd[iNdEx]) - i = encodeVarintTx(dAtA, i, uint64(len(m.MembersToAdd[iNdEx]))) + { + size, err := m.MembersToAdd[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x22 } @@ -4989,7 +5181,7 @@ func (m *MsgUpdateGroupMemberResponse) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } -func (m *MsgUpdateGroupExtra) Marshal() (dAtA []byte, err error) { +func (m *MsgRenewGroupMember) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -4999,22 +5191,29 @@ func (m *MsgUpdateGroupExtra) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgUpdateGroupExtra) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgRenewGroupMember) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgUpdateGroupExtra) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgRenewGroupMember) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Extra) > 0 { - i -= len(m.Extra) - copy(dAtA[i:], m.Extra) - i = encodeVarintTx(dAtA, i, uint64(len(m.Extra))) - i-- - dAtA[i] = 0x22 + if len(m.Members) > 0 { + for iNdEx := len(m.Members) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Members[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } } if len(m.GroupName) > 0 { i -= len(m.GroupName) @@ -5040,7 +5239,7 @@ func (m *MsgUpdateGroupExtra) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *MsgUpdateGroupExtraResponse) Marshal() (dAtA []byte, err error) { +func (m *MsgRenewGroupMemberResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5050,12 +5249,12 @@ func (m *MsgUpdateGroupExtraResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgUpdateGroupExtraResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgRenewGroupMemberResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgUpdateGroupExtraResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgRenewGroupMemberResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5063,7 +5262,7 @@ func (m *MsgUpdateGroupExtraResponse) MarshalToSizedBuffer(dAtA []byte) (int, er return len(dAtA) - i, nil } -func (m *MsgLeaveGroup) Marshal() (dAtA []byte, err error) { +func (m *MsgGroupMember) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5073,30 +5272,24 @@ func (m *MsgLeaveGroup) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgLeaveGroup) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgGroupMember) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgLeaveGroup) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgGroupMember) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.GroupName) > 0 { - i -= len(m.GroupName) - copy(dAtA[i:], m.GroupName) - i = encodeVarintTx(dAtA, i, uint64(len(m.GroupName))) - i-- - dAtA[i] = 0x1a - } - if len(m.GroupOwner) > 0 { - i -= len(m.GroupOwner) - copy(dAtA[i:], m.GroupOwner) - i = encodeVarintTx(dAtA, i, uint64(len(m.GroupOwner))) - i-- - dAtA[i] = 0x12 + n4, err4 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.ExpirationTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.ExpirationTime):]) + if err4 != nil { + return 0, err4 } + i -= n4 + i = encodeVarintTx(dAtA, i, uint64(n4)) + i-- + dAtA[i] = 0x12 if len(m.Member) > 0 { i -= len(m.Member) copy(dAtA[i:], m.Member) @@ -5107,7 +5300,7 @@ func (m *MsgLeaveGroup) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *MsgLeaveGroupResponse) Marshal() (dAtA []byte, err error) { +func (m *MsgUpdateGroupExtra) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5117,19 +5310,137 @@ func (m *MsgLeaveGroupResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MsgLeaveGroupResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *MsgUpdateGroupExtra) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgLeaveGroupResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MsgUpdateGroupExtra) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - return len(dAtA) - i, nil -} - + if len(m.Extra) > 0 { + i -= len(m.Extra) + copy(dAtA[i:], m.Extra) + i = encodeVarintTx(dAtA, i, uint64(len(m.Extra))) + i-- + dAtA[i] = 0x22 + } + if len(m.GroupName) > 0 { + i -= len(m.GroupName) + copy(dAtA[i:], m.GroupName) + i = encodeVarintTx(dAtA, i, uint64(len(m.GroupName))) + i-- + dAtA[i] = 0x1a + } + if len(m.GroupOwner) > 0 { + i -= len(m.GroupOwner) + copy(dAtA[i:], m.GroupOwner) + i = encodeVarintTx(dAtA, i, uint64(len(m.GroupOwner))) + i-- + dAtA[i] = 0x12 + } + if len(m.Operator) > 0 { + i -= len(m.Operator) + copy(dAtA[i:], m.Operator) + i = encodeVarintTx(dAtA, i, uint64(len(m.Operator))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateGroupExtraResponse) 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 *MsgUpdateGroupExtraResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateGroupExtraResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgLeaveGroup) 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 *MsgLeaveGroup) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgLeaveGroup) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.GroupName) > 0 { + i -= len(m.GroupName) + copy(dAtA[i:], m.GroupName) + i = encodeVarintTx(dAtA, i, uint64(len(m.GroupName))) + i-- + dAtA[i] = 0x1a + } + if len(m.GroupOwner) > 0 { + i -= len(m.GroupOwner) + copy(dAtA[i:], m.GroupOwner) + i = encodeVarintTx(dAtA, i, uint64(len(m.GroupOwner))) + i-- + dAtA[i] = 0x12 + } + if len(m.Member) > 0 { + i -= len(m.Member) + copy(dAtA[i:], m.Member) + i = encodeVarintTx(dAtA, i, uint64(len(m.Member))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgLeaveGroupResponse) 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 *MsgLeaveGroupResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgLeaveGroupResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func (m *MsgUpdateBucketInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5302,12 +5613,12 @@ func (m *MsgPutPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.ExpirationTime != nil { - n5, err5 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(*m.ExpirationTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.ExpirationTime):]) - if err5 != nil { - return 0, err5 + n6, err6 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(*m.ExpirationTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(*m.ExpirationTime):]) + if err6 != nil { + return 0, err6 } - i -= n5 - i = encodeVarintTx(dAtA, i, uint64(n5)) + i -= n6 + i = encodeVarintTx(dAtA, i, uint64(n6)) i-- dAtA[i] = 0x3a } @@ -6396,12 +6707,6 @@ func (m *MsgCreateGroup) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } - if len(m.Members) > 0 { - for _, s := range m.Members { - l = len(s) - n += 1 + l + sovTx(uint64(l)) - } - } l = len(m.Extra) if l > 0 { n += 1 + l + sovTx(uint64(l)) @@ -6465,8 +6770,8 @@ func (m *MsgUpdateGroupMember) Size() (n int) { n += 1 + l + sovTx(uint64(l)) } if len(m.MembersToAdd) > 0 { - for _, s := range m.MembersToAdd { - l = len(s) + for _, e := range m.MembersToAdd { + l = e.Size() n += 1 + l + sovTx(uint64(l)) } } @@ -6488,6 +6793,57 @@ func (m *MsgUpdateGroupMemberResponse) Size() (n int) { return n } +func (m *MsgRenewGroupMember) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Operator) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.GroupOwner) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.GroupName) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Members) > 0 { + for _, e := range m.Members { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgRenewGroupMemberResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgGroupMember) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Member) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.ExpirationTime) + n += 1 + l + sovTx(uint64(l)) + return n +} + func (m *MsgUpdateGroupExtra) Size() (n int) { if m == nil { return 0 @@ -9318,38 +9674,6 @@ func (m *MsgCreateGroup) Unmarshal(dAtA []byte) error { m.GroupName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Members", 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.Members = append(m.Members, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Extra", wireType) } @@ -9779,7 +10103,7 @@ func (m *MsgUpdateGroupMember) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field MembersToAdd", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -9789,23 +10113,25 @@ func (m *MsgUpdateGroupMember) 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 ErrInvalidLengthTx } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - m.MembersToAdd = append(m.MembersToAdd, string(dAtA[iNdEx:postIndex])) + m.MembersToAdd = append(m.MembersToAdd, &MsgGroupMember{}) + if err := m.MembersToAdd[len(m.MembersToAdd)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 5: if wireType != 2 { @@ -9910,6 +10236,351 @@ func (m *MsgUpdateGroupMemberResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgRenewGroupMember) 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: MsgRenewGroupMember: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRenewGroupMember: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Operator", 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.Operator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GroupOwner", 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.GroupOwner = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GroupName", 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.GroupName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Members", 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 + } + m.Members = append(m.Members, &MsgGroupMember{}) + if err := m.Members[len(m.Members)-1].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 *MsgRenewGroupMemberResponse) 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: MsgRenewGroupMemberResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRenewGroupMemberResponse: 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 (m *MsgGroupMember) 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: MsgGroupMember: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgGroupMember: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Member", 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.Member = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpirationTime", 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 := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.ExpirationTime, 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 *MsgUpdateGroupExtra) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 From 4bb35c4d90135b197e7ce2b965e594e4e9a36d4d Mon Sep 17 00:00:00 2001 From: dylanhuang Date: Tue, 8 Aug 2023 15:17:14 +0800 Subject: [PATCH 2/2] docs: update document site links (#404) --- readme.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/readme.md b/readme.md index b1fbd59b7..246480bb4 100644 --- a/readme.md +++ b/readme.md @@ -53,11 +53,11 @@ through decentralized applications known as BNB Greenfield dApps. These dApps pr interacting with the platform, enabling users to create and manipulate data in a secure and decentralized environment. ## Documentation -Visit our official [documentation site](https://greenfield.bnbchain.org/docs/guide/) for more info. +Visit our official [documentation site](https://docs.bnbchain.org/greenfield-docs/docs/guide/introduction/overview) for more info. ## Quick Started -*Note*: Requires [Go 1.19+](https://go.dev/dl/) +*Note*: Requires [Go 1.20+](https://go.dev/dl/) ``` ## Build from source @@ -83,7 +83,7 @@ $ bash ./deployment/localup/localup.sh stop bash ./deployment/localup/localup.sh start 3 3 ``` -More advanced script and command line usage, please refer to the [Tutorial](docs/cli/cli.md). +More advanced script and command line usage, please refer to the [Tutorial](https://docs.bnbchain.org/greenfield-docs/docs/api/blockchain-cli). ## Key Modules @@ -104,14 +104,14 @@ And the following modules are in cosmos-sdk: - `x/staking`: based on the Proof-of-Stake logic. The elected validators are responsible for the security of the Greenfield blockchain. They get involved in the governance and staking of the blockchain. -Refer to the [docs](https://greenfield.bnbchain.org/docs/guide/greenfield-blockchain/modules/storage-module.html) to dive deep into these modules. +Refer to the [docs](https://docs.bnbchain.org/greenfield-docs/docs/guide/greenfield-blockchain/modules/storage-module) to dive deep into these modules. ## Running node -- [Interacting with the Node](https://greenfield.bnbchain.org/docs/guide/greenfield-blockchain/run-node/interact-node.html) -- [Run Local Network](https://greenfield.bnbchain.org/docs/guide/greenfield-blockchain/run-node/run-local-network.html) -- [Run Testnet Node](https://greenfield.bnbchain.org/docs/guide/greenfield-blockchain/run-node/run-testnet-node.html) -- [Become Testnet Validator](https://greenfield.bnbchain.org/docs/guide/greenfield-blockchain/run-node/become-testnet-validator.html) +- [Interacting with the Node](https://docs.bnbchain.org/greenfield-docs/docs/guide/greenfield-blockchain/run-node/interact-node) +- [Run Local Network](https://docs.bnbchain.org/greenfield-docs/docs/guide/greenfield-blockchain/run-node/run-local-network) +- [Run Testnet Node](https://docs.bnbchain.org/greenfield-docs/docs/guide/greenfield-blockchain/run-node/run-testnet-node) +- [Become Testnet Validator](https://docs.bnbchain.org/greenfield-docs/docs/guide/greenfield-blockchain/run-node/become-testnet-validator) ## Related Projects - [Greenfield-Contract](https://github.com/bnb-chain/greenfield-contracts): the cross chain contract for Greenfield that deployed on BSC network.