From ba5ed725ce6c5c68aaa9dc449fd4fd428a5361ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?rich=CE=9Brd?= Date: Thu, 12 Oct 2023 15:21:49 -0400 Subject: [PATCH] waku2: static shards (#3944) - use protected topics for communities - associate chats to pubsub topics and populate these depending if the chat belongs to a community or not - mailserver functions should be aware of pubsub topics - generate private key for pubsub topic protection when creating a community - add shard cluster and index to communities - setup shards for existing communities - distribute pubsubtopic password - fix: do not send the requests to join and cancel in the protected topic - fix: undefined shard values for backward compatibility - refactor: use shard message in protobuffers --- .golangci.yml | 2 +- VERSION | 2 +- cmd/ping-community/main.go | 12 +- eth-node/bridge/geth/waku.go | 6 + eth-node/bridge/geth/wakuv2.go | 5 + eth-node/types/waku.go | 2 + protocol/common/message_sender.go | 36 ++ protocol/common/shard.go | 47 +++ protocol/communities/community.go | 41 +- protocol/communities/manager.go | 76 +++- protocol/communities/persistence.go | 88 ++++- .../communities/persistence_test_helpers.go | 8 +- protocol/messenger.go | 27 +- protocol/messenger_communities.go | 351 ++++++++++++++---- protocol/messenger_contacts.go | 3 +- protocol/messenger_handler.go | 16 +- protocol/messenger_handlers.go | 21 ++ protocol/messenger_mailserver.go | 3 +- protocol/messenger_response.go | 30 ++ protocol/messenger_share_urls.go | 7 + protocol/migrations/migrations.go | 234 ++++++------ .../sqlite/1693311981_community_shard.up.sql | 2 + .../application_metadata_message.pb.go | 122 +++--- .../application_metadata_message.proto | 1 + protocol/protobuf/chat_message.pb.go | 200 +++++----- protocol/protobuf/chat_message.proto | 3 + protocol/protobuf/communities.pb.go | 299 ++++++++------- protocol/protobuf/communities.proto | 3 + protocol/protobuf/community_shard_key.pb.go | 107 ++++++ protocol/protobuf/community_shard_key.proto | 14 + protocol/protobuf/service.go | 2 +- protocol/protobuf/shard.pb.go | 87 +++++ protocol/protobuf/shard.proto | 10 + protocol/protobuf/url_data.pb.go | 50 ++- protocol/protobuf/url_data.proto | 3 + protocol/requests/set_community_shard.go | 30 ++ protocol/transport/filters_manager.go | 67 ++-- protocol/transport/transport.go | 14 +- services/ext/api.go | 19 +- services/ext/service.go | 11 +- services/mailservers/api_test.go | 1 + services/status/service.go | 5 +- wakuv2/api_test.go | 3 +- wakuv2/common/filter.go | 3 +- wakuv2/filter_manager.go | 5 +- wakuv2/waku.go | 19 +- wakuv2/waku_test.go | 4 +- 47 files changed, 1527 insertions(+), 574 deletions(-) create mode 100644 protocol/common/shard.go create mode 100644 protocol/migrations/sqlite/1693311981_community_shard.up.sql create mode 100644 protocol/protobuf/community_shard_key.pb.go create mode 100644 protocol/protobuf/community_shard_key.proto create mode 100644 protocol/protobuf/shard.pb.go create mode 100644 protocol/protobuf/shard.proto create mode 100644 protocol/requests/set_community_shard.go diff --git a/.golangci.yml b/.golangci.yml index 1707bdbfb..ec6cf2c03 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -30,7 +30,7 @@ linters-settings: gofmt: simplify: true goimports: - local-prefixes: github.com/ethereum/go-ethereum,github.com/status-im/status-go + local-prefixes: github.com/ethereum/go-ethereum,github.com/status-im/status-go,github.com/waku-org/go-waku maligned: suggest-new: true dupl: diff --git a/VERSION b/VERSION index 093061e62..fb48c88f1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.168.1 +0.169.0 diff --git a/cmd/ping-community/main.go b/cmd/ping-community/main.go index b30852a66..8e0d37751 100644 --- a/cmd/ping-community/main.go +++ b/cmd/ping-community/main.go @@ -47,6 +47,8 @@ var ( seedPhrase = flag.String("seed-phrase", "", "Seed phrase") version = flag.Bool("version", false, "Print version and dump configuration") communityID = flag.String("community-id", "", "The id of the community") + shardCluster = flag.Int("shard-cluster", common.UndefinedShardValue, "The shard cluster in which the of the community is published") + shardIndex = flag.Int("shard-index", common.UndefinedShardValue, "The shard index in which the community is published") chatID = flag.String("chat-id", "", "The id of the chat") dataDir = flag.String("dir", getDefaultDataDir(), "Directory used by node to store data") @@ -145,7 +147,15 @@ func main() { messenger := wakuextservice.Messenger() - community, err := messenger.RequestCommunityInfoFromMailserver(*communityID, true) + var shard *common.Shard = nil + if shardCluster != nil && shardIndex != nil && *shardCluster != common.UndefinedShardValue && *shardIndex != common.UndefinedShardValue { + shard = &common.Shard{ + Cluster: uint16(*shardCluster), + Index: uint16(*shardIndex), + } + } + + community, err := messenger.RequestCommunityInfoFromMailserver(*communityID, shard, true) if err != nil { logger.Error("community error", "error", err) diff --git a/eth-node/bridge/geth/waku.go b/eth-node/bridge/geth/waku.go index d69cabe17..8f5a5f4d0 100644 --- a/eth-node/bridge/geth/waku.go +++ b/eth-node/bridge/geth/waku.go @@ -69,7 +69,13 @@ func (w *gethWakuWrapper) SubscribeToPubsubTopic(topic string, optPublicKey *ecd return errors.New("not available in WakuV1") } +func (w *gethWakuWrapper) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) { + // not available in WakuV1 + return nil, errors.New("not available in WakuV1") +} + func (w *gethWakuWrapper) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error { + // not available in WakuV1 return errors.New("not available in WakuV1") } diff --git a/eth-node/bridge/geth/wakuv2.go b/eth-node/bridge/geth/wakuv2.go index 65e066d68..b88f1733a 100644 --- a/eth-node/bridge/geth/wakuv2.go +++ b/eth-node/bridge/geth/wakuv2.go @@ -7,6 +7,7 @@ import ( "time" "github.com/libp2p/go-libp2p/core/peer" + "github.com/waku-org/go-waku/waku/v2/protocol/store" storepb "github.com/waku-org/go-waku/waku/v2/protocol/store/pb" @@ -235,6 +236,10 @@ func (w *gethWakuV2Wrapper) SubscribeToPubsubTopic(topic string, optPublicKey *e return w.waku.SubscribeToPubsubTopic(topic, optPublicKey) } +func (w *gethWakuV2Wrapper) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) { + return w.waku.RetrievePubsubTopicKey(topic) +} + func (w *gethWakuV2Wrapper) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error { return w.waku.StorePubsubTopicKey(topic, privKey) } diff --git a/eth-node/types/waku.go b/eth-node/types/waku.go index 65d1851f4..fd602aa19 100644 --- a/eth-node/types/waku.go +++ b/eth-node/types/waku.go @@ -92,6 +92,8 @@ type Waku interface { StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error + RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) + AddStorePeer(address string) (peer.ID, error) AddRelayPeer(address string) (peer.ID, error) diff --git a/protocol/common/message_sender.go b/protocol/common/message_sender.go index b0ad1d2f5..ec7a78309 100644 --- a/protocol/common/message_sender.go +++ b/protocol/common/message_sender.go @@ -13,6 +13,8 @@ import ( datasyncproto "github.com/vacp2p/mvds/protobuf" "go.uber.org/zap" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/protocol/datasync" @@ -187,6 +189,39 @@ func (s *MessageSender) SendCommunityMessage( return s.sendCommunity(ctx, &rawMessage) } +// SendPubsubTopicKey sends the protected topic key for a community to a list of recipients +func (s *MessageSender) SendPubsubTopicKey( + ctx context.Context, + rawMessage *RawMessage, +) ([]byte, error) { + s.logger.Debug( + "sending the protected topic key for a community", + zap.String("communityId", types.EncodeHex(rawMessage.CommunityID)), + zap.String("site", "SendPubsubTopicKey"), + ) + rawMessage.Sender = s.identity + messageID, err := s.getMessageID(rawMessage) + if err != nil { + return nil, err + } + + rawMessage.ID = types.EncodeHex(messageID) + + // Notify before dispatching, otherwise the dispatch subscription might happen + // earlier than the scheduled + s.notifyOnScheduledMessage(nil, rawMessage) + + // Send to each recipients + for _, recipient := range rawMessage.Recipients { + _, err = s.sendPrivate(ctx, recipient, rawMessage) + if err != nil { + return nil, errors.Wrap(err, "failed to send message") + } + } + return messageID, nil + +} + // SendGroup takes encoded data, encrypts it and sends through the wire, // always return the messageID func (s *MessageSender) SendGroup( @@ -364,6 +399,7 @@ func (s *MessageSender) sendPrivate( messageID := v1protocol.MessageID(&rawMessage.Sender.PublicKey, wrappedMessage) rawMessage.ID = types.EncodeHex(messageID) + rawMessage.PubsubTopic = relay.DefaultWakuTopic // TODO: determine which pubsub topic should be used for 1:1 messages if rawMessage.BeforeDispatch != nil { if err := rawMessage.BeforeDispatch(rawMessage); err != nil { diff --git a/protocol/common/shard.go b/protocol/common/shard.go new file mode 100644 index 000000000..9cd507d65 --- /dev/null +++ b/protocol/common/shard.go @@ -0,0 +1,47 @@ +package common + +import ( + "github.com/status-im/status-go/protocol/protobuf" + "github.com/status-im/status-go/protocol/transport" +) + +type Shard struct { + Cluster uint16 `json:"cluster"` + Index uint16 `json:"index"` +} + +func ShardFromProtobuff(p *protobuf.Shard) *Shard { + if p == nil { + return nil + } + + return &Shard{ + Cluster: uint16(p.Cluster), + Index: uint16(p.Index), + } +} + +func (s *Shard) TransportShard() *transport.Shard { + if s == nil { + return nil + } + + return &transport.Shard{ + Cluster: s.Cluster, + Index: s.Index, + } +} + +func (s *Shard) Protobuffer() *protobuf.Shard { + if s == nil { + return nil + } + + return &protobuf.Shard{ + Cluster: int32(s.Cluster), + Index: int32(s.Index), + } +} + +const MainStatusShard = 16 +const UndefinedShardValue = 0 diff --git a/protocol/communities/community.go b/protocol/communities/community.go index e74f48a14..504809489 100644 --- a/protocol/communities/community.go +++ b/protocol/communities/community.go @@ -10,9 +10,10 @@ import ( "time" "github.com/golang/protobuf/proto" - "github.com/waku-org/go-waku/waku/v2/protocol/relay" "go.uber.org/zap" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/images" @@ -43,6 +44,7 @@ type Config struct { MemberIdentity *ecdsa.PublicKey SyncedAt uint64 EventsData *EventsData + Shard *common.Shard } type EventsData struct { @@ -139,13 +141,18 @@ func (o *Community) MarshalPublicAPIJSON() ([]byte, error) { TokenPermissions map[string]*CommunityTokenPermission `json:"tokenPermissions"` CommunityTokensMetadata []*protobuf.CommunityTokenMetadata `json:"communityTokensMetadata"` ActiveMembersCount uint64 `json:"activeMembersCount"` + PubsubTopic string `json:"pubsubTopic"` + Shard *common.Shard `json:"shard"` }{ - ID: o.ID(), - Verified: o.config.Verified, - Chats: make(map[string]CommunityChat), - Categories: make(map[string]CommunityCategory), - Tags: o.Tags(), + ID: o.ID(), + Verified: o.config.Verified, + Chats: make(map[string]CommunityChat), + Categories: make(map[string]CommunityCategory), + Tags: o.Tags(), + PubsubTopic: o.PubsubTopic(), + Shard: o.Shard(), } + if o.config.CommunityDescription != nil { for id, c := range o.config.CommunityDescription.Categories { category := CommunityCategory{ @@ -178,7 +185,12 @@ func (o *Community) MarshalPublicAPIJSON() ([]byte, error) { communityItem.TokenPermissions = o.tokenPermissions() communityItem.MembersCount = len(o.config.CommunityDescription.Members) + communityItem.Link = fmt.Sprintf("https://join.status.im/c/0x%x", o.ID()) + if o.Shard() != nil { + communityItem.Link = fmt.Sprintf("%s/%d/%d", communityItem.Link, o.Shard().Cluster, o.Shard().Index) + } + communityItem.IntroMessage = o.config.CommunityDescription.IntroMessage communityItem.OutroMessage = o.config.CommunityDescription.OutroMessage communityItem.CommunityTokensMetadata = o.config.CommunityDescription.CommunityTokensMetadata @@ -245,6 +257,8 @@ func (o *Community) MarshalJSON() ([]byte, error) { TokenPermissions map[string]*CommunityTokenPermission `json:"tokenPermissions"` CommunityTokensMetadata []*protobuf.CommunityTokenMetadata `json:"communityTokensMetadata"` ActiveMembersCount uint64 `json:"activeMembersCount"` + PubsubTopic string `json:"pubsubTopic"` + Shard *common.Shard `json:"shard"` }{ ID: o.ID(), MemberRole: o.MemberRole(o.MemberIdentity()), @@ -264,6 +278,8 @@ func (o *Community) MarshalJSON() ([]byte, error) { MuteTill: o.config.MuteTill, Tags: o.Tags(), Encrypted: o.Encrypted(), + PubsubTopic: o.PubsubTopic(), + Shard: o.Shard(), } if o.config.CommunityDescription != nil { for id, c := range o.config.CommunityDescription.Categories { @@ -358,6 +374,14 @@ func (o *Community) DescriptionText() string { return "" } +func (o *Community) Shard() *common.Shard { + if o != nil && o.config != nil { + return o.config.Shard + } + + return nil +} + func (o *Community) IntroMessage() string { if o != nil && o.config != nil && @@ -1230,7 +1254,7 @@ func (o *Community) MemberUpdateChannelID() string { } func (o *Community) PubsubTopic() string { - return transport.GetPubsubTopic(o.ID()) + return transport.GetPubsubTopic(o.Shard().TransportShard()) } func (o *Community) DefaultFilters() []transport.FiltersToInitialize { @@ -1243,7 +1267,8 @@ func (o *Community) DefaultFilters() []transport.FiltersToInitialize { communityPubsubTopic := o.PubsubTopic() return []transport.FiltersToInitialize{ - {ChatID: cID, PubsubTopic: relay.DefaultWakuTopic}, // TODO: verify if this goes into default topic + {ChatID: cID, PubsubTopic: communityPubsubTopic}, + {ChatID: uncompressedPubKey, PubsubTopic: relay.DefaultWakuTopic}, // TODO: messages that are not protected are sent in default pubsub topic for now {ChatID: uncompressedPubKey, PubsubTopic: communityPubsubTopic}, {ChatID: updatesChannelID, PubsubTopic: communityPubsubTopic}, {ChatID: mlChannelID, PubsubTopic: communityPubsubTopic}, diff --git a/protocol/communities/manager.go b/protocol/communities/manager.go index 6e0997539..c668ec71a 100644 --- a/protocol/communities/manager.go +++ b/protocol/communities/manager.go @@ -21,6 +21,8 @@ import ( "github.com/anacrolix/torrent/metainfo" "github.com/golang/protobuf/proto" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + "github.com/google/uuid" "github.com/pkg/errors" "go.uber.org/zap" @@ -511,11 +513,17 @@ func (m *Manager) All() ([]*Community, error) { return communities, nil } +type CommunityShard struct { + CommunityID string `json:"communityID"` + Shard *common.Shard `json:"shard"` +} + type KnownCommunitiesResponse struct { - ContractCommunities []string `json:"contractCommunities"` - ContractFeaturedCommunities []string `json:"contractFeaturedCommunities"` + ContractCommunities []string `json:"contractCommunities"` // TODO: use CommunityShard + ContractFeaturedCommunities []string `json:"contractFeaturedCommunities"` // TODO: use CommunityShard Descriptions map[string]*Community `json:"communities"` - UnknownCommunities []string `json:"unknownCommunities"` + UnknownCommunities []string `json:"unknownCommunities"` // TODO: use CommunityShard + } func (m *Manager) GetStoredDescriptionForCommunities(communityIDs []types.HexBytes) (response *KnownCommunitiesResponse, err error) { @@ -531,12 +539,20 @@ func (m *Manager) GetStoredDescriptionForCommunities(communityIDs []types.HexByt return } - response.ContractCommunities = append(response.ContractCommunities, communityID) + // TODO: use CommunityShard instead of appending the communityID + + response.ContractCommunities = append(response.ContractCommunities, communityID) // , CommunityShard{ + // CommunityID: communityID, + // Shard: community.Shard(), + // } if community != nil { response.Descriptions[community.IDString()] = community } else { - response.UnknownCommunities = append(response.UnknownCommunities, communityID) + response.UnknownCommunities = append(response.UnknownCommunities, communityID) // CommunityShard{ + // CommunityID: communityID, + // Shard: community.Shard(), + // }) } } @@ -653,6 +669,7 @@ func (m *Manager) CreateCommunity(request *requests.CreateCommunity, publish boo Joined: true, MemberIdentity: &m.identity.PublicKey, CommunityDescription: description, + Shard: nil, } community, err := New(config, m.timesource) if err != nil { @@ -931,6 +948,34 @@ func (m *Manager) DeleteCommunity(id types.HexBytes) error { return m.persistence.DeleteCommunitySettings(id) } +func (m *Manager) UpdateShard(community *Community, shard *common.Shard) error { + community.config.Shard = shard + return m.persistence.SaveCommunity(community) +} + +// SetShard assigns a shard to a community +func (m *Manager) SetShard(communityID types.HexBytes, shard *common.Shard) (*Community, error) { + community, err := m.GetByID(communityID) + if err != nil { + return nil, err + } + if community == nil { + return nil, ErrOrgNotFound + } + if !community.IsControlNode() { + return nil, errors.New("not admin or owner") + } + + err = m.UpdateShard(community, shard) + if err != nil { + return nil, err + } + + m.publish(&Subscription{Community: community}) + + return community, nil +} + // EditCommunity takes a description, updates the community with the description, // saves it and returns it func (m *Manager) EditCommunity(request *requests.EditCommunity) (*Community, error) { @@ -1310,7 +1355,7 @@ func (m *Manager) DeleteCategory(request *requests.DeleteCommunityCategory) (*Co return changes.Community, changes, nil } -func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, payload []byte) (*CommunityResponse, error) { +func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, payload []byte, shard *common.Shard) (*CommunityResponse, error) { if signer == nil { return nil, errors.New("signer can't be nil") } @@ -1332,6 +1377,7 @@ func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, des CommunityDescriptionProtocolMessage: payload, MemberIdentity: &m.identity.PublicKey, ID: signer, + Shard: shard, } community, err = New(config, m.timesource) if err != nil { @@ -2880,7 +2926,7 @@ func (m *Manager) HandleCommunityRequestToLeave(signer *ecdsa.PublicKey, proto * return nil } -func (m *Manager) HandleWrappedCommunityDescriptionMessage(payload []byte) (*CommunityResponse, error) { +func (m *Manager) HandleWrappedCommunityDescriptionMessage(payload []byte, shard *common.Shard) (*CommunityResponse, error) { m.logger.Debug("Handling wrapped community description message") applicationMetadataMessage := &protobuf.ApplicationMetadataMessage{} @@ -2903,7 +2949,7 @@ func (m *Manager) HandleWrappedCommunityDescriptionMessage(payload []byte) (*Com return nil, err } - return m.HandleCommunityDescriptionMessage(signer, description, payload) + return m.HandleCommunityDescriptionMessage(signer, description, payload, shard) } func (m *Manager) JoinCommunity(id types.HexBytes, forceJoin bool) (*Community, error) { @@ -3294,6 +3340,20 @@ func (m *Manager) AcceptedPendingRequestsToJoinForCommunity(id types.HexBytes) ( func (m *Manager) DeclinedPendingRequestsToJoinForCommunity(id types.HexBytes) ([]*RequestToJoin, error) { return m.persistence.DeclinedPendingRequestsToJoinForCommunity(id) + +} + +func (m *Manager) GetPubsubTopic(communityID string) (string, error) { + community, err := m.GetByIDString(communityID) + if err != nil { + return "", err + } + + if community == nil { + return relay.DefaultWakuTopic, nil + } + + return transport.GetPubsubTopic(community.Shard().TransportShard()), nil } func (m *Manager) CanPost(pk *ecdsa.PublicKey, communityID string, chatID string, grant []byte) (bool, error) { diff --git a/protocol/communities/persistence.go b/protocol/communities/persistence.go index dd34c3dcb..f19eb2b92 100644 --- a/protocol/communities/persistence.go +++ b/protocol/communities/persistence.go @@ -33,7 +33,7 @@ var ErrOldRequestToLeave = errors.New("old request to leave") const OR = " OR " const communitiesBaseQuery = ` - SELECT c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, r.clock, ae.raw_events, ae.raw_description + SELECT c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, r.clock, ae.raw_events, ae.raw_description, c.shard_cluster, c.shard_index FROM communities_communities c LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ? LEFT JOIN communities_events ae ON c.id = ae.id` @@ -46,9 +46,17 @@ func (p *Persistence) SaveCommunity(community *Community) error { return err } + var shardIndex, shardCluster *uint + if community.Shard() != nil { + index := uint(community.Shard().Index) + shardIndex = &index + cluster := uint(community.Shard().Cluster) + shardCluster = &cluster + } + _, err = p.db.Exec(` - INSERT INTO communities_communities (id, private_key, description, joined, spectated, verified, muted, muted_till) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, - id, crypto.FromECDSA(privateKey), wrappedCommunity, community.config.Joined, community.config.Spectated, community.config.Verified, community.config.Muted, community.config.MuteTill) + INSERT INTO communities_communities (id, private_key, description, joined, spectated, verified, muted, muted_till, shard_cluster, shard_index) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + id, crypto.FromECDSA(privateKey), wrappedCommunity, community.config.Joined, community.config.Spectated, community.config.Verified, community.config.Muted, community.config.MuteTill, shardCluster, shardIndex) return err } @@ -101,9 +109,8 @@ func (p *Persistence) ShouldHandleSyncCommunitySettings(settings *protobuf.SyncC func (p *Persistence) ShouldHandleSyncCommunity(community *protobuf.SyncInstallationCommunity) (bool, error) { // TODO see if there is a way to make this more elegant - // Keep the "*". // When the test for this function fails because the table has changed we should update sync functionality - qr := p.db.QueryRow(`SELECT * FROM communities_communities WHERE id = ? AND synced_at > ?`, community.Id, community.Clock) + qr := p.db.QueryRow(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities WHERE id = ? AND synced_at > ?`, community.Id, community.Clock) _, err := p.scanRowToStruct(qr.Scan) switch err { @@ -140,16 +147,28 @@ func (p *Persistence) queryCommunities(memberIdentity *ecdsa.PublicKey, query st var publicKeyBytes, privateKeyBytes, descriptionBytes []byte var joined, spectated, verified, muted bool var muteTill sql.NullTime - var requestedToJoinAt sql.NullInt64 + var cluster, index, requestedToJoinAt sql.NullInt64 // Community events specific fields var eventsBytes, eventsDescriptionBytes []byte - err := rows.Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes) + err := rows.Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes, &cluster, &index) if err != nil { return nil, err } - org, err := p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, p.logger) + var clusterValue *uint + if cluster.Valid { + v := uint(cluster.Int64) + clusterValue = &v + } + + var indexValue *uint + if index.Valid { + v := uint(index.Int64) + indexValue = &v + } + + org, err := p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, clusterValue, indexValue, p.logger) if err != nil { return nil, err } @@ -192,6 +211,7 @@ func (p *Persistence) rowsToCommunities(memberIdentity *ecdsa.PublicKey, rows *s var publicKeyBytes, privateKeyBytes, descriptionBytes []byte var joined, spectated, verified, muted bool var muteTill sql.NullTime + var cluster, index sql.NullInt64 // Request to join specific fields var rtjID, rtjCommunityID []byte @@ -203,12 +223,25 @@ func (p *Persistence) rowsToCommunities(memberIdentity *ecdsa.PublicKey, rows *s err = rows.Scan( &publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, - &rtjID, &rtjPublicKey, &rtjClock, &rtjENSName, &rtjChatID, &rtjCommunityID, &rtjState, &eventsBytes, &eventsDescriptionBytes) + &rtjID, &rtjPublicKey, &rtjClock, &rtjENSName, &rtjChatID, &rtjCommunityID, &rtjState, &eventsBytes, + &eventsDescriptionBytes, &cluster, &index) if err != nil { return nil, err } - comm, err = p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(rtjClock.Int64), eventsBytes, eventsDescriptionBytes, p.logger) + var clusterValue *uint + if cluster.Valid { + v := uint(cluster.Int64) + clusterValue = &v + } + + var indexValue *uint + if index.Valid { + v := uint(index.Int64) + indexValue = &v + } + + comm, err = p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(rtjClock.Int64), eventsBytes, eventsDescriptionBytes, clusterValue, indexValue, p.logger) if err != nil { return nil, err } @@ -226,7 +259,8 @@ func (p *Persistence) rowsToCommunities(memberIdentity *ecdsa.PublicKey, rows *s func (p *Persistence) JoinedAndPendingCommunitiesWithRequests(memberIdentity *ecdsa.PublicKey) (comms []*Community, err error) { query := `SELECT c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, -r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description +r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description, +c.shard_cluster, c.shard_index FROM communities_communities c LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ? LEFT JOIN communities_events ae ON c.id = ae.id @@ -243,7 +277,8 @@ WHERE c.Joined OR r.state = ?` func (p *Persistence) DeletedCommunities(memberIdentity *ecdsa.PublicKey) (comms []*Community, err error) { query := `SELECT c.id, c.private_key, c.description, c.joined, c.spectated, c.verified, c.muted, c.muted_till, -r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description +r.id, r.public_key, r.clock, r.ens_name, r.chat_id, r.community_id, r.state, ae.raw_events, ae.raw_description, +c.shard_cluster, c.shard_index FROM communities_communities c LEFT JOIN communities_requests_to_join r ON c.id = r.community_id AND r.public_key = ? LEFT JOIN communities_events ae ON c.id = ae.id @@ -269,24 +304,36 @@ func (p *Persistence) GetByID(memberIdentity *ecdsa.PublicKey, id []byte) (*Comm var verified bool var muted bool var muteTill sql.NullTime - var requestedToJoinAt sql.NullInt64 + var requestedToJoinAt, cluster, index sql.NullInt64 // Community events specific fields var eventsBytes, eventsDescriptionBytes []byte - err := p.db.QueryRow(communitiesBaseQuery+` WHERE c.id = ?`, common.PubkeyToHex(memberIdentity), id).Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes) + err := p.db.QueryRow(communitiesBaseQuery+` WHERE c.id = ?`, common.PubkeyToHex(memberIdentity), id).Scan(&publicKeyBytes, &privateKeyBytes, &descriptionBytes, &joined, &spectated, &verified, &muted, &muteTill, &requestedToJoinAt, &eventsBytes, &eventsDescriptionBytes, &cluster, &index) if err == sql.ErrNoRows { return nil, nil } else if err != nil { return nil, err } - return p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, p.logger) + var clusterValue *uint + if cluster.Valid { + v := uint(cluster.Int64) + clusterValue = &v + } + + var indexValue *uint + if index.Valid { + v := uint(index.Int64) + indexValue = &v + } + + return p.unmarshalCommunityFromDB(memberIdentity, publicKeyBytes, privateKeyBytes, descriptionBytes, joined, spectated, verified, muted, muteTill.Time, uint64(requestedToJoinAt.Int64), eventsBytes, eventsDescriptionBytes, clusterValue, indexValue, p.logger) } func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey, publicKeyBytes, privateKeyBytes, wrappedCommunity []byte, joined, spectated, verified, muted bool, muteTill time.Time, requestedToJoinAt uint64, eventsBytes []byte, - eventsDescriptionBytes []byte, logger *zap.Logger) (*Community, error) { + eventsDescriptionBytes []byte, cluster *uint, index *uint, logger *zap.Logger) (*Community, error) { var privateKey *ecdsa.PrivateKey var err error @@ -313,6 +360,14 @@ func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey, return nil, err } + var shard *common.Shard = nil + if cluster != nil && index != nil { + shard = &common.Shard{ + Cluster: uint16(*cluster), + Index: uint16(*index), + } + } + config := Config{ PrivateKey: privateKey, CommunityDescription: description, @@ -327,6 +382,7 @@ func (p *Persistence) unmarshalCommunityFromDB(memberIdentity *ecdsa.PublicKey, Joined: joined, Spectated: spectated, EventsData: eventsData, + Shard: shard, } community, err := New(config, p.timesource) if err != nil { diff --git a/protocol/communities/persistence_test_helpers.go b/protocol/communities/persistence_test_helpers.go index eddd8787e..6e19bf147 100644 --- a/protocol/communities/persistence_test_helpers.go +++ b/protocol/communities/persistence_test_helpers.go @@ -58,7 +58,7 @@ func (p *Persistence) scanRowToStruct(rowScan func(dest ...interface{}) error) ( func (p *Persistence) getAllCommunitiesRaw() (rcrs []*RawCommunityRow, err error) { var rows *sql.Rows // Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing. - rows, err = p.db.Query(`SELECT * FROM communities_communities`) + rows, err = p.db.Query(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities`) if err != nil { return nil, err } @@ -85,14 +85,12 @@ func (p *Persistence) getAllCommunitiesRaw() (rcrs []*RawCommunityRow, err error } func (p *Persistence) getRawCommunityRow(id []byte) (*RawCommunityRow, error) { - // Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing. - qr := p.db.QueryRow(`SELECT * FROM communities_communities WHERE id = ?`, id) + qr := p.db.QueryRow(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities WHERE id = ?`, id) return p.scanRowToStruct(qr.Scan) } func (p *Persistence) getSyncedRawCommunity(id []byte) (*RawCommunityRow, error) { - // Keep "*", if the db table is updated, syncing needs to match, this fail will force us to update syncing. - qr := p.db.QueryRow(`SELECT * FROM communities_communities WHERE id = ? AND synced_at > 0`, id) + qr := p.db.QueryRow(`SELECT id, private_key, description, joined, verified, spectated, muted, muted_till, synced_at FROM communities_communities WHERE id = ? AND synced_at > 0`, id) return p.scanRowToStruct(qr.Scan) } diff --git a/protocol/messenger.go b/protocol/messenger.go index 2b10fe01c..c068036b0 100644 --- a/protocol/messenger.go +++ b/protocol/messenger.go @@ -19,10 +19,11 @@ import ( "github.com/golang/protobuf/proto" "github.com/google/uuid" "github.com/pkg/errors" - "github.com/waku-org/go-waku/waku/v2/protocol/relay" "go.uber.org/zap" "golang.org/x/time/rate" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/event" @@ -1687,8 +1688,8 @@ func (m *Messenger) Init() error { for _, c := range controlledCommunities { communityFiltersToInitialize = append(communityFiltersToInitialize, transport.CommunityFilterToInitialize{ - CommunityID: c.ID(), - PrivKey: c.PrivateKey(), + Shard: c.Shard().TransportShard(), + PrivKey: c.PrivateKey(), }) } @@ -1720,6 +1721,8 @@ func (m *Messenger) Init() error { continue } + communityInfo := make(map[string]*communities.Community) + switch chat.ChatType { case ChatTypePublic, ChatTypeProfile: filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: relay.DefaultWakuTopic}) @@ -1728,7 +1731,17 @@ func (m *Messenger) Init() error { if err != nil { return err } - filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: transport.GetPubsubTopic(communityID)}) + + community, ok := communityInfo[chat.CommunityID] + if !ok { + community, err = m.communitiesManager.GetByID(communityID) + if err != nil { + return err + } + communityInfo[chat.CommunityID] = community + } + + filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: transport.GetPubsubTopic(community.Shard().TransportShard())}) case ChatTypeOneToOne: pk, err := chat.PublicKey() if err != nil { @@ -2085,13 +2098,11 @@ func (m *Messenger) dispatchMessage(ctx context.Context, rawMessage common.RawMe return rawMessage, err } case ChatTypeCommunityChat: - communityID, err := hexutil.Decode(chat.CommunityID) + rawMessage.PubsubTopic, err = m.communitiesManager.GetPubsubTopic(chat.CommunityID) if err != nil { return rawMessage, err } - rawMessage.PubsubTopic = transport.GetPubsubTopic(communityID) - // TODO: add grant canPost, err := m.communitiesManager.CanPost(&m.identity.PublicKey, chat.CommunityID, chat.CommunityChatID(), nil) if err != nil { @@ -2261,7 +2272,9 @@ func (m *Messenger) sendChatMessage(ctx context.Context, message *common.Message if err != nil { return nil, err } + message.Payload = &protobuf.ChatMessage_Community{Community: wrappedCommunity} + message.Shard = community.Shard().Protobuffer() message.ContentType = protobuf.ChatMessage_COMMUNITY } else if len(message.AudioPath) != 0 { diff --git a/protocol/messenger_communities.go b/protocol/messenger_communities.go index e6ac2a3d0..71b4a95a2 100644 --- a/protocol/messenger_communities.go +++ b/protocol/messenger_communities.go @@ -17,6 +17,8 @@ import ( "github.com/golang/protobuf/proto" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -81,12 +83,13 @@ func (m *Messenger) publishOrg(org *communities.Community) error { // we don't want to wrap in an encryption layer message SkipProtocolLayer: true, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_DESCRIPTION, + PubsubTopic: org.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic } _, err = m.sender.SendPublic(context.Background(), org.IDString(), rawMessage) return err } -func (m *Messenger) publishCommunityEvents(msg *communities.CommunityEventsMessage) error { +func (m *Messenger) publishCommunityEvents(community *communities.Community, msg *communities.CommunityEventsMessage) error { m.logger.Debug("publishing community events", zap.String("admin-id", common.PubkeyToHex(&m.identity.PublicKey)), zap.Any("event", msg)) payload, err := msg.Marshal() @@ -100,7 +103,7 @@ func (m *Messenger) publishCommunityEvents(msg *communities.CommunityEventsMessa // we don't want to wrap in an encryption layer message SkipProtocolLayer: true, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE, - PubsubTopic: transport.GetPubsubTopic(msg.CommunityID), // TODO: confirm if it should be sent in community pubsub topic + PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic } // TODO: resend in case of failure? @@ -301,7 +304,7 @@ func (m *Messenger) handleCommunitiesSubscription(c chan *communities.Subscripti } if sub.CommunityEventsMessage != nil { - err := m.publishCommunityEvents(sub.CommunityEventsMessage) + err := m.publishCommunityEvents(sub.Community, sub.CommunityEventsMessage) if err != nil { m.logger.Warn("failed to publish community events", zap.Error(err)) } @@ -576,12 +579,12 @@ func (m *Messenger) CuratedCommunities() (*communities.KnownCommunitiesResponse, callOpts := &bind.CallOpts{Context: context.Background(), Pending: false} - communities, err := directory.GetCommunities(callOpts) + curatedCommunities, err := directory.GetCommunities(callOpts) if err != nil { return nil, err } var communityIDs []types.HexBytes - for _, c := range communities { + for _, c := range curatedCommunities { communityIDs = append(communityIDs, c) } @@ -594,11 +597,30 @@ func (m *Messenger) CuratedCommunities() (*communities.KnownCommunitiesResponse, if err != nil { return nil, err } + + // TODO: The curated communities smart contract should also store the community shard cluster and index + for _, c := range featuredCommunities { response.ContractFeaturedCommunities = append(response.ContractFeaturedCommunities, types.HexBytes(c).String()) + // TODO: use CommunityShard instead of communityID + /*response.ContractFeaturedCommunities = append(response.ContractFeaturedCommunities, communities.CommunityShard{ + CommunityID: types.HexBytes(c).String(), + // Shard: c.Shard, // TODO: obtain this value + })*/ } - go m.requestCommunitiesFromMailserver(response.UnknownCommunities) + // TODO: this loop is added just to not revert the change from requestCommunitiesFromMailserver + // Once support for shards is added in the contract, just pass the `response.UnknownCommunities` directly to + // the function + + var unknownCommunities []communities.CommunityShard + for _, u := range response.UnknownCommunities { + unknownCommunities = append(unknownCommunities, communities.CommunityShard{ + CommunityID: u, + }) + } + + go m.requestCommunitiesFromMailserver(unknownCommunities) return response, nil } @@ -625,8 +647,8 @@ func (m *Messenger) initCommunityChats(community *communities.Community) ([]*Cha if community.IsControlNode() { // Init the community filter so we can receive messages on the community communityFilters, err := m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{ - CommunityID: community.ID(), - PrivKey: community.PrivateKey(), + Shard: community.Shard().TransportShard(), + PrivKey: community.PrivateKey(), }}) if err != nil { @@ -700,14 +722,25 @@ func (m *Messenger) JoinCommunity(ctx context.Context, communityID types.HexByte return mr, nil } -func (m *Messenger) subscribeToCommunityShard(communityID []byte) error { - // TODO: store private key and topic - // TODO: determine pubsub topic and public key for community - // TODO: this should probably be moved completely to transport once pubsub topic logic is implemented +func (m *Messenger) subscribeToCommunityShard(communityID []byte, shard *common.Shard) error { + if m.transport.WakuVersion() != 2 { + return nil + } - pubsubTopic := transport.GetPubsubTopic(communityID) - // var communityPubKey *ecdsa.PublicKey - return m.transport.SubscribeToPubsubTopic(pubsubTopic, nil) + // TODO: this should probably be moved completely to transport once pubsub topic logic is implemented + pubsubTopic := transport.GetPubsubTopic(shard.TransportShard()) + + privK, err := m.transport.RetrievePubsubTopicKey(pubsubTopic) + if err != nil { + return err + } + + var pubK *ecdsa.PublicKey + if privK != nil { + pubK = &privK.PublicKey + } + + return m.transport.SubscribeToPubsubTopic(pubsubTopic, pubK) } func (m *Messenger) joinCommunity(ctx context.Context, communityID types.HexBytes, forceJoin bool) (*MessengerResponse, error) { @@ -733,7 +766,7 @@ func (m *Messenger) joinCommunity(ctx context.Context, communityID types.HexByte return nil, err } - if err = m.subscribeToCommunityShard(communityID); err != nil { + if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil { return nil, err } } @@ -787,7 +820,7 @@ func (m *Messenger) SpectateCommunity(communityID types.HexBytes) (*MessengerRes response.AddCommunity(community) - if err = m.subscribeToCommunityShard(community.ID()); err != nil { + if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil { return nil, err } @@ -1064,7 +1097,7 @@ func (m *Messenger) RequestToJoinCommunity(request *requests.RequestToJoinCommun CommunityID: community.ID(), SkipProtocolLayer: true, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_REQUEST_TO_JOIN, - PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic + PubsubTopic: relay.DefaultWakuTopic, // TODO: this should be sent on a non protected pubsub topic. } _, err = m.sender.SendCommunityMessage(context.Background(), rawMessage) @@ -1218,7 +1251,7 @@ func (m *Messenger) EditSharedAddressesForCommunity(request *requests.EditShared CommunityID: community.ID(), SkipProtocolLayer: true, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EDIT_SHARED_ADDRESSES, - PubsubTopic: community.PubsubTopic(), + PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic } _, err = m.sender.SendCommunityMessage(context.Background(), rawMessage) @@ -1382,7 +1415,7 @@ func (m *Messenger) CancelRequestToJoinCommunity(request *requests.CancelRequest CommunityID: community.ID(), SkipProtocolLayer: true, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_CANCEL_REQUEST_TO_JOIN, - PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be send in community pubsub topic + PubsubTopic: relay.DefaultWakuTopic, // TODO: this should be sent on a non protected pubsub topic. } _, err = m.sender.SendCommunityMessage(context.Background(), rawMessage) @@ -1461,12 +1494,22 @@ func (m *Messenger) AcceptRequestToJoinCommunity(request *requests.AcceptRequest return nil, err } + var key *ecdsa.PrivateKey + if m.transport.WakuVersion() == 2 { + key, err = m.transport.RetrievePubsubTopicKey(community.PubsubTopic()) + if err != nil { + return nil, err + } + } + requestToJoinResponseProto := &protobuf.CommunityRequestToJoinResponse{ - Clock: community.Clock(), - Accepted: true, - CommunityId: community.ID(), - Community: community.Description(), - Grant: grant, + Clock: community.Clock(), + Accepted: true, + CommunityId: community.ID(), + Community: community.Description(), + Grant: grant, + ProtectedTopicPrivateKey: crypto.FromECDSA(key), + Shard: community.Shard().Protobuffer(), } if m.torrentClientReady() && m.communitiesManager.TorrentFileExists(community.IDString()) { @@ -1654,12 +1697,17 @@ func (m *Messenger) LeaveCommunity(communityID types.HexBytes) (*MessengerRespon return nil, err } + community, err := m.communitiesManager.GetByID(communityID) + if err != nil { + return nil, err + } + rawMessage := common.RawMessage{ Payload: payload, CommunityID: communityID, SkipProtocolLayer: true, MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_REQUEST_TO_LEAVE, - PubsubTopic: transport.GetPubsubTopic(communityID), // TODO: confirm if it should be sent in the community pubsub topic + PubsubTopic: community.PubsubTopic(), // TODO: confirm if it should be sent in the community pubsub topic } _, err = m.sender.SendCommunityMessage(context.Background(), rawMessage) if err != nil { @@ -1912,14 +1960,14 @@ func (m *Messenger) CreateCommunity(request *requests.CreateCommunity, createDef return nil, err } - if err = m.subscribeToCommunityShard(community.ID()); err != nil { + if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil { return nil, err } // Init the community filter so we can receive messages on the community _, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{ - CommunityID: community.ID(), - PrivKey: community.PrivateKey(), + Shard: community.Shard().TransportShard(), + PrivKey: community.PrivateKey(), }}) if err != nil { return nil, err @@ -1966,6 +2014,95 @@ func (m *Messenger) CreateCommunity(request *requests.CreateCommunity, createDef return response, nil } +func (m *Messenger) SetCommunityShard(request *requests.SetCommunityShard) (*MessengerResponse, error) { + if err := request.Validate(); err != nil { + return nil, err + } + + community, err := m.communitiesManager.SetShard(request.CommunityID, request.Shard) + if err != nil { + return nil, err + } + + var topicPrivKey *ecdsa.PrivateKey + if request.PrivateKey != nil { + topicPrivKey, err = crypto.ToECDSA(*request.PrivateKey) + } else { + topicPrivKey, err = crypto.GenerateKey() + } + if err != nil { + return nil, err + } + + err = m.UpdateCommunityFilters(community, topicPrivKey) + if err != nil { + return nil, err + } + + err = m.SendCommunityShardKey(community, community.GetMemberPubkeys()) + if err != nil { + return nil, err + } + + response := &MessengerResponse{} + response.AddProtectedTopic(community.PubsubTopic(), topicPrivKey) + + return response, nil +} + +func (m *Messenger) UpdateCommunityFilters(community *communities.Community, privKey *ecdsa.PrivateKey) error { + if m.transport.WakuVersion() == 2 && privKey != nil { + if err := m.transport.StorePubsubTopicKey(community.PubsubTopic(), privKey); err != nil { + return err + } + } + + publicFiltersToInit := make([]transport.FiltersToInitialize, 0, len(community.DefaultFilters())+len(community.Chats())) + + for _, df := range community.DefaultFilters() { + _, err := m.transport.RemoveFilterByChatID(df.ChatID) + if err != nil { + return err + } + publicFiltersToInit = append(publicFiltersToInit, df) + } + + for chatID := range community.Chats() { + communityChatID := community.IDString() + chatID + _, err := m.transport.RemoveFilterByChatID(communityChatID) + if err != nil { + return err + } + publicFiltersToInit = append(publicFiltersToInit, transport.FiltersToInitialize{ChatID: communityChatID, PubsubTopic: community.PubsubTopic()}) + } + + _, err := m.transport.InitPublicFilters(publicFiltersToInit) + if err != nil { + return err + } + + // Init the community filter so we can receive messages on the community + _, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{ + Shard: community.Shard().TransportShard(), + PrivKey: community.PrivateKey(), + }}) + if err != nil { + return err + } + + // Init the default community filters + _, err = m.transport.InitPublicFilters(publicFiltersToInit) + if err != nil { + return err + } + + if err = m.subscribeToCommunityShard(community.ID(), community.Shard()); err != nil { + return err + } + + return nil +} + func (m *Messenger) CreateCommunityTokenPermission(request *requests.CreateCommunityTokenPermission) (*MessengerResponse, error) { if err := request.Validate(); err != nil { return nil, err @@ -2147,7 +2284,7 @@ func (m *Messenger) ImportCommunity(ctx context.Context, key *ecdsa.PrivateKey) return nil, err } - _, err = m.RequestCommunityInfoFromMailserver(community.IDString(), false) + _, err = m.RequestCommunityInfoFromMailserver(community.IDString(), community.Shard(), false) if err != nil { // TODO In the future we should add a mechanism to re-apply next steps (adding owner, joining) // if there is no connection with mailserver. Otherwise changes will be overwritten. @@ -2289,6 +2426,48 @@ func (m *Messenger) RemoveUserFromCommunity(id types.HexBytes, pkString string) return response, nil } +func (m *Messenger) SendCommunityShardKey(community *communities.Community, pubkeys []*ecdsa.PublicKey) error { + if m.transport.WakuVersion() != 2 { + return nil + } + + if !community.IsControlNode() { + return nil + } + + key, err := m.transport.RetrievePubsubTopicKey(community.PubsubTopic()) + if err != nil { + return err + } + + if key == nil { + return nil // No community shard key available + } + + communityShardKey := &protobuf.CommunityShardKey{ + Clock: m.getTimesource().GetCurrentTime(), + CommunityId: community.ID(), + PrivateKey: crypto.FromECDSA(key), + Shard: community.Shard().Protobuffer(), + } + + encodedMessage, err := proto.Marshal(communityShardKey) + if err != nil { + return err + } + + rawMessage := common.RawMessage{ + Recipients: pubkeys, + ResendAutomatically: true, + MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_SHARD_KEY, + Payload: encodedMessage, + } + + _, err = m.sender.SendPubsubTopicKey(context.Background(), &rawMessage) + + return err +} + func (m *Messenger) UnbanUserFromCommunity(request *requests.UnbanUserFromCommunity) (*MessengerResponse, error) { community, err := m.communitiesManager.UnbanUserFromCommunity(request) if err != nil { @@ -2375,7 +2554,7 @@ func (m *Messenger) GetCommunityIDFromKey(communityKey string) string { // RequestCommunityInfoFromMailserver installs filter for community and requests its details // from mailserver. It waits until it has the community before returning it. // If useDatabase is true, it searches for community in database and does not request mailserver. -func (m *Messenger) RequestCommunityInfoFromMailserver(privateOrPublicKey string, useDatabase bool) (*communities.Community, error) { +func (m *Messenger) RequestCommunityInfoFromMailserver(privateOrPublicKey string, shard *common.Shard, useDatabase bool) (*communities.Community, error) { communityID := m.GetCommunityIDFromKey(privateOrPublicKey) if useDatabase { community, err := m.findCommunityInfoFromDB(communityID) @@ -2387,12 +2566,12 @@ func (m *Messenger) RequestCommunityInfoFromMailserver(privateOrPublicKey string } } - return m.requestCommunityInfoFromMailserver(communityID, true) + return m.requestCommunityInfoFromMailserver(communityID, shard, true) } // RequestCommunityInfoFromMailserverAsync installs filter for community and requests its details // from mailserver. When response received it will be passed through signals handler -func (m *Messenger) RequestCommunityInfoFromMailserverAsync(privateOrPublicKey string) error { +func (m *Messenger) RequestCommunityInfoFromMailserverAsync(privateOrPublicKey string, shard *common.Shard) error { communityID := m.GetCommunityIDFromKey(privateOrPublicKey) community, err := m.findCommunityInfoFromDB(communityID) @@ -2403,13 +2582,13 @@ func (m *Messenger) RequestCommunityInfoFromMailserverAsync(privateOrPublicKey s m.config.messengerSignalsHandler.CommunityInfoFound(community) return nil } - _, err = m.requestCommunityInfoFromMailserver(communityID, false) + _, err = m.requestCommunityInfoFromMailserver(communityID, shard, false) return err } // RequestCommunityInfoFromMailserver installs filter for community and requests its details // from mailserver. When response received it will be passed through signals handler -func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitForResponse bool) (*communities.Community, error) { +func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, shard *common.Shard, waitForResponse bool) (*communities.Community, error) { m.requestedCommunitiesLock.Lock() defer m.requestedCommunitiesLock.Unlock() @@ -2417,18 +2596,13 @@ func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitF return nil, nil } - id, err := hexutil.Decode(communityID) - if err != nil { - return nil, err - } - //If filter wasn't installed we create it and remember for deinstalling after //response received filter := m.transport.FilterByChatID(communityID) if filter == nil { filters, err := m.transport.InitPublicFilters([]transport.FiltersToInitialize{{ ChatID: communityID, - PubsubTopic: transport.GetPubsubTopic(id), + PubsubTopic: transport.GetPubsubTopic(shard.TransportShard()), }}) if err != nil { return nil, fmt.Errorf("Can't install filter for community: %v", err) @@ -2448,7 +2622,7 @@ func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitF to := uint32(m.transport.GetCurrentTime() / 1000) from := to - oneMonthInSeconds - _, err = m.performMailserverRequest(func() (*MessengerResponse, error) { + _, err := m.performMailserverRequest(func() (*MessengerResponse, error) { batch := MailserverBatch{From: from, To: to, Topics: []types.TopicType{filter.ContentTopic}} m.logger.Info("Requesting historic") err := m.processMailserverBatch(batch) @@ -2485,28 +2659,23 @@ func (m *Messenger) requestCommunityInfoFromMailserver(communityID string, waitF // RequestCommunityInfoFromMailserver installs filter for community and requests its details // from mailserver. When response received it will be passed through signals handler -func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) { +func (m *Messenger) requestCommunitiesFromMailserver(communities []communities.CommunityShard) { m.requestedCommunitiesLock.Lock() defer m.requestedCommunitiesLock.Unlock() var topics []types.TopicType - for _, communityID := range communityIDs { - if _, ok := m.requestedCommunities[communityID]; ok { - continue - } - - id, err := hexutil.Decode(communityID) - if err != nil { + for _, c := range communities { + if _, ok := m.requestedCommunities[c.CommunityID]; ok { continue } //If filter wasn't installed we create it and remember for deinstalling after //response received - filter := m.transport.FilterByChatID(communityID) + filter := m.transport.FilterByChatID(c.CommunityID) if filter == nil { filters, err := m.transport.InitPublicFilters([]transport.FiltersToInitialize{{ - ChatID: communityID, - PubsubTopic: transport.GetPubsubTopic(id), + ChatID: c.CommunityID, + PubsubTopic: transport.GetPubsubTopic(c.Shard.TransportShard()), }}) if err != nil { m.logger.Error("Can't install filter for community", zap.Error(err)) @@ -2517,10 +2686,10 @@ func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) { continue } filter = filters[0] - m.requestedCommunities[communityID] = filter + m.requestedCommunities[c.CommunityID] = filter } else { //we don't remember filter id associated with community because it was already installed - m.requestedCommunities[communityID] = nil + m.requestedCommunities[c.CommunityID] = nil } topics = append(topics, filter.ContentTopic) } @@ -2549,8 +2718,8 @@ func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) { select { case <-time.After(200 * time.Millisecond): allLoaded := true - for _, c := range communityIDs { - community, err := m.communitiesManager.GetByIDString(c) + for _, c := range communities { + community, err := m.communitiesManager.GetByIDString(c.CommunityID) if err != nil { m.logger.Error("Error loading community", zap.Error(err)) break @@ -2571,8 +2740,8 @@ func (m *Messenger) requestCommunitiesFromMailserver(communityIDs []string) { } } - for _, c := range communityIDs { - m.forgetCommunityRequest(c) + for _, c := range communities { + m.forgetCommunityRequest(c.CommunityID) } } @@ -2622,7 +2791,7 @@ func (m *Messenger) passStoredCommunityInfoToSignalHandler(communityID string) { // handleCommunityDescription handles an community description func (m *Messenger) handleCommunityDescription(state *ReceivedMessageState, signer *ecdsa.PublicKey, description *protobuf.CommunityDescription, rawPayload []byte) error { - communityResponse, err := m.communitiesManager.HandleCommunityDescriptionMessage(signer, description, rawPayload) + communityResponse, err := m.communitiesManager.HandleCommunityDescriptionMessage(signer, description, rawPayload, nil) if err != nil { return err } @@ -2764,7 +2933,63 @@ func (m *Messenger) HandleCommunityEventsMessageRejected(state *ReceivedMessageS return nil } - err = m.publishCommunityEvents(reapplyEventsMessage) + community, err := m.communitiesManager.GetByID(reapplyEventsMessage.CommunityID) + if err != nil { + return err + } + + err = m.publishCommunityEvents(community, reapplyEventsMessage) + if err != nil { + return err + } + + return nil +} + +// HandleCommunityShardKey handles the private keys for the community shards +func (m *Messenger) HandleCommunityShardKey(state *ReceivedMessageState, message *protobuf.CommunityShardKey, statusMessage *v1protocol.StatusMessage) error { + // TODO: @cammellos: This is risky, it does not seem to support out of order messages + // (say that the community changes shards twice, last one wins, but we don't check clock + // etc) + + // TODO: @cammellos: getbyid returns nil if the community is not in the db, so we need to handle it + community, err := m.communitiesManager.GetByID(message.CommunityId) + if err != nil { + return err + } + + // If we haven't joined the community, nothing to do + if !community.Joined() { + return nil + } + + signer := state.CurrentMessageState.PublicKey + if signer == nil { + return errors.New("signer can't be nil") + } + + if !community.IsMemberOwner(signer) { + return communities.ErrNotAuthorized + } + + return m.handleCommunityShardAndFiltersFromProto(community, common.ShardFromProtobuff(message.Shard), message.PrivateKey) +} + +func (m *Messenger) handleCommunityShardAndFiltersFromProto(community *communities.Community, shard *common.Shard, privateKeyBytes []byte) error { + err := m.communitiesManager.UpdateShard(community, shard) + if err != nil { + return err + } + + var privKey *ecdsa.PrivateKey = nil + if privateKeyBytes != nil { + privKey, err = crypto.ToECDSA(privateKeyBytes) + if err != nil { + return err + } + } + + err = m.UpdateCommunityFilters(community, privKey) if err != nil { return err } @@ -4265,8 +4490,8 @@ func (m *Messenger) RequestImportDiscordCommunity(request *requests.ImportDiscor // Init the community filter so we can receive messages on the community _, err = m.transport.InitCommunityFilters([]transport.CommunityFilterToInitialize{{ - CommunityID: discordCommunity.ID(), - PrivKey: discordCommunity.PrivateKey(), + Shard: discordCommunity.Shard().TransportShard(), + PrivKey: discordCommunity.PrivateKey(), }}) if err != nil { m.cleanUpImport(communityID) diff --git a/protocol/messenger_contacts.go b/protocol/messenger_contacts.go index 4b738abc2..c79e64d9a 100644 --- a/protocol/messenger_contacts.go +++ b/protocol/messenger_contacts.go @@ -8,9 +8,10 @@ import ( "time" "github.com/golang/protobuf/proto" - "github.com/waku-org/go-waku/waku/v2/protocol/relay" "go.uber.org/zap" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + "github.com/status-im/status-go/deprecation" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" diff --git a/protocol/messenger_handler.go b/protocol/messenger_handler.go index 3d0aef94c..e3163eb89 100644 --- a/protocol/messenger_handler.go +++ b/protocol/messenger_handler.go @@ -1570,6 +1570,16 @@ func (m *Messenger) HandleCommunityRequestToJoinResponse(state *ReceivedMessageS } if requestToJoinResponseProto.Accepted { + community, err := m.communitiesManager.GetByID(requestToJoinResponseProto.CommunityId) + if err != nil { + return err + } + + err = m.handleCommunityShardAndFiltersFromProto(community, common.ShardFromProtobuff(requestToJoinResponseProto.Shard), requestToJoinResponseProto.ProtectedTopicPrivateKey) + if err != nil { + return err + } + response, err := m.JoinCommunity(context.Background(), requestToJoinResponseProto.CommunityId, false) if err != nil { return err @@ -1664,8 +1674,8 @@ func (m *Messenger) HandleCommunityRequestToLeave(state *ReceivedMessageState, r } // handleWrappedCommunityDescriptionMessage handles a wrapped community description -func (m *Messenger) handleWrappedCommunityDescriptionMessage(payload []byte) (*communities.CommunityResponse, error) { - return m.communitiesManager.HandleWrappedCommunityDescriptionMessage(payload) +func (m *Messenger) handleWrappedCommunityDescriptionMessage(payload []byte, shard *common.Shard) (*communities.CommunityResponse, error) { + return m.communitiesManager.HandleWrappedCommunityDescriptionMessage(payload, shard) } func (m *Messenger) handleEditMessage(state *ReceivedMessageState, editMessage EditMessage) error { @@ -2265,7 +2275,7 @@ func (m *Messenger) handleChatMessage(state *ReceivedMessageState, forceSeen boo if receivedMessage.ContentType == protobuf.ChatMessage_COMMUNITY { m.logger.Debug("Handling community content type") - communityResponse, err := m.handleWrappedCommunityDescriptionMessage(receivedMessage.GetCommunity()) + communityResponse, err := m.handleWrappedCommunityDescriptionMessage(receivedMessage.GetCommunity(), common.ShardFromProtobuff(receivedMessage.Shard)) if err != nil { return err } diff --git a/protocol/messenger_handlers.go b/protocol/messenger_handlers.go index 699871a6e..b2da15186 100644 --- a/protocol/messenger_handlers.go +++ b/protocol/messenger_handlers.go @@ -226,6 +226,9 @@ func (m *Messenger) dispatchToHandler(messageState *ReceivedMessageState, protoB case protobuf.ApplicationMetadataMessage_COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE: return m.handleCommunityPrivilegedUserSyncMessageProtobuf(messageState, protoBytes, msg, filter) + case protobuf.ApplicationMetadataMessage_COMMUNITY_SHARD_KEY: + return m.handleCommunityShardKeyProtobuf(messageState, protoBytes, msg, filter) + default: m.logger.Info("protobuf type not found", zap.String("type", string(msg.Type))) return errors.New("protobuf type not found") @@ -1608,3 +1611,21 @@ func (m *Messenger) handleCommunityPrivilegedUserSyncMessageProtobuf(messageStat } +func (m *Messenger) handleCommunityShardKeyProtobuf(messageState *ReceivedMessageState, protoBytes []byte, msg *v1protocol.StatusMessage, filter transport.Filter) error { + m.logger.Info("handling CommunityShardKey") + + + + p := &protobuf.CommunityShardKey{} + err := proto.Unmarshal(protoBytes, p) + if err != nil { + return err + } + + m.outputToCSV(msg.TransportMessage.Timestamp, msg.ID, messageState.CurrentMessageState.Contact.ID, filter.ContentTopic, filter.ChatID, msg.Type, p) + + return m.HandleCommunityShardKey(messageState, p, msg) + +} + + diff --git a/protocol/messenger_mailserver.go b/protocol/messenger_mailserver.go index f2042410b..bb0f08a56 100644 --- a/protocol/messenger_mailserver.go +++ b/protocol/messenger_mailserver.go @@ -9,9 +9,10 @@ import ( "time" "github.com/pkg/errors" - "github.com/waku-org/go-waku/waku/v2/protocol/relay" "go.uber.org/zap" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + "github.com/status-im/status-go/connection" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/types" diff --git a/protocol/messenger_response.go b/protocol/messenger_response.go index ecd6000f9..a65a2e057 100644 --- a/protocol/messenger_response.go +++ b/protocol/messenger_response.go @@ -1,8 +1,11 @@ package protocol import ( + "crypto/ecdsa" "encoding/json" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/status-im/status-go/eth-node/crypto" ensservice "github.com/status-im/status-go/services/ens" "github.com/status-im/status-go/services/browsers" @@ -34,6 +37,11 @@ type ClearedHistory struct { ClearedAt uint64 `json:"clearedAt"` } +type ProtectedTopic struct { + PubsubTopic string `json:"pubsubTopic"` + PublicKey string `json:"publicKey"` +} + type MessengerResponse struct { Contacts []*Contact Installations []*multidevice.Installation @@ -62,6 +70,7 @@ type MessengerResponse struct { removedMessages map[string]*RemovedMessage communities map[string]*communities.Community communitiesSettings map[string]*communities.CommunitySettings + protectedTopics map[string]*ecdsa.PrivateKey activityCenterNotifications map[string]*ActivityCenterNotification activityCenterState *ActivityCenterState messages map[string]*common.Message @@ -103,6 +112,7 @@ func (r *MessengerResponse) MarshalJSON() ([]byte, error) { Notifications []*localnotifications.Notification `json:"notifications"` Communities []*communities.Community `json:"communities,omitempty"` CommunitiesSettings []*communities.CommunitySettings `json:"communitiesSettings,omitempty"` + ProtectedTopics []ProtectedTopic `json:"protectedTopics,omitempty"` ActivityCenterNotifications []*ActivityCenterNotification `json:"activityCenterNotifications,omitempty"` ActivityCenterState *ActivityCenterState `json:"activityCenterState,omitempty"` CurrentStatus *UserStatus `json:"currentStatus,omitempty"` @@ -144,6 +154,7 @@ func (r *MessengerResponse) MarshalJSON() ([]byte, error) { Chats: r.Chats(), Communities: r.Communities(), CommunitiesSettings: r.CommunitiesSettings(), + ProtectedTopics: r.ProtectedTopics(), RemovedChats: r.RemovedChats(), RemovedMessages: r.RemovedMessages(), ClearedHistories: r.ClearedHistories(), @@ -211,6 +222,17 @@ func (r *MessengerResponse) CommunitiesSettings() []*communities.CommunitySettin return settings } +func (r *MessengerResponse) ProtectedTopics() []ProtectedTopic { + protectedTopics := make([]ProtectedTopic, 0, len(r.protectedTopics)) + for pubsubTopic, privKey := range r.protectedTopics { + protectedTopics = append(protectedTopics, ProtectedTopic{ + PubsubTopic: pubsubTopic, + PublicKey: hexutil.Encode(crypto.FromECDSAPub(&privKey.PublicKey)), + }) + } + return protectedTopics +} + func (r *MessengerResponse) Notifications() []*localnotifications.Notification { var notifications []*localnotifications.Notification for _, n := range r.notifications { @@ -355,6 +377,14 @@ func (r *MessengerResponse) AddRequestsToJoinCommunity(requestsToJoin []*communi r.RequestsToJoinCommunity = append(r.RequestsToJoinCommunity, requestsToJoin...) } +func (r *MessengerResponse) AddProtectedTopic(pubsubTopic string, privKey *ecdsa.PrivateKey) { + if r.protectedTopics == nil { + r.protectedTopics = make(map[string]*ecdsa.PrivateKey) + } + + r.protectedTopics[pubsubTopic] = privKey +} + func (r *MessengerResponse) AddRequestToJoinCommunity(requestToJoin *communities.RequestToJoin) { r.RequestsToJoinCommunity = append(r.RequestsToJoinCommunity, requestToJoin) } diff --git a/protocol/messenger_share_urls.go b/protocol/messenger_share_urls.go index 9e8d4531f..94f37ab48 100644 --- a/protocol/messenger_share_urls.go +++ b/protocol/messenger_share_urls.go @@ -44,6 +44,7 @@ type URLDataResponse struct { Community CommunityURLData `json:"community"` Channel CommunityChannelURLData `json:"channel"` Contact ContactURLData `json:"contact"` + Shard *common.Shard `json:"shard,omitempty"` } const baseShareURL = "https://status.app" @@ -119,6 +120,7 @@ func (m *Messenger) parseCommunityURLWithChatKey(urlData string) (*URLDataRespon return &URLDataResponse{ Community: m.prepareCommunityData(community), + Shard: community.Shard(), }, nil } @@ -138,6 +140,7 @@ func (m *Messenger) prepareEncodedCommunityData(community *communities.Community urlDataProto := &protobuf.URLData{ Content: communityData, + Shard: community.Shard().Protobuffer(), } urlData, err := proto.Marshal(urlDataProto) @@ -208,6 +211,7 @@ func (m *Messenger) parseCommunityURLWithData(data string, chatKey string) (*URL TagIndices: communityProto.TagIndices, CommunityID: types.EncodeHex(communityID), }, + Shard: common.ShardFromProtobuff(urlDataProto.Shard), }, nil } @@ -274,6 +278,7 @@ func (m *Messenger) parseCommunityChannelURLWithChatKey(channelID string, public return &URLDataResponse{ Community: m.prepareCommunityData(community), Channel: m.prepareCommunityChannelData(channel), + Shard: community.Shard(), }, nil } @@ -302,6 +307,7 @@ func (m *Messenger) prepareEncodedCommunityChannelData(community *communities.Co urlDataProto := &protobuf.URLData{ Content: channelData, + Shard: community.Shard().Protobuffer(), } urlData, err := proto.Marshal(urlDataProto) @@ -392,6 +398,7 @@ func (m *Messenger) parseCommunityChannelURLWithData(data string, chatKey string Color: channelProto.Color, ChannelUUID: channelProto.Uuid, }, + Shard: common.ShardFromProtobuff(urlDataProto.Shard), }, nil } diff --git a/protocol/migrations/migrations.go b/protocol/migrations/migrations.go index 95a69d466..e297adc77 100644 --- a/protocol/migrations/migrations.go +++ b/protocol/migrations/migrations.go @@ -101,6 +101,7 @@ // 1689266326_create_communities_events_table.up.sql (164B) // 1689931300_add_community_tokens_deployer_and_priv_level.up.sql (156B) // 1693311881_add_unfurled_links_to_message_edits.up.sql (64B) +// 1693311981_community_shard.up.sql (156B) // README.md (554B) // doc.go (850B) @@ -186,7 +187,7 @@ func _000001_initDownDbSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xbb, 0x3f, 0x1, 0x75, 0x19, 0x70, 0x86, 0xa7, 0x34, 0x40, 0x17, 0x34, 0x3e, 0x18, 0x51, 0x79, 0xd4, 0x22, 0xad, 0x8f, 0x80, 0xcc, 0xa6, 0xcc, 0x6, 0x2b, 0x62, 0x2, 0x47, 0xba, 0xf9}} return a, nil } @@ -206,7 +207,7 @@ func _000001_initUpDbSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x60, 0xdc, 0xeb, 0xe, 0xc2, 0x4f, 0x75, 0xa, 0xf6, 0x3e, 0xc7, 0xc4, 0x4, 0xe2, 0xe1, 0xa4, 0x73, 0x2f, 0x4a, 0xad, 0x1a, 0x0, 0xc3, 0x93, 0x9d, 0x77, 0x3e, 0x31, 0x91, 0x77, 0x2e, 0xc8}} return a, nil } @@ -226,7 +227,7 @@ func _000002_add_last_ens_clock_valueUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0x3, 0x8f, 0xd5, 0x85, 0x83, 0x47, 0xbe, 0xf9, 0x82, 0x7e, 0x81, 0xa4, 0xbd, 0xaa, 0xd5, 0x98, 0x18, 0x5, 0x2d, 0x82, 0x42, 0x3b, 0x3, 0x50, 0xc3, 0x1e, 0x84, 0x35, 0xf, 0xb6, 0x2b}} return a, nil } @@ -246,7 +247,7 @@ func _1586358095_add_replaceUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd2, 0xb3, 0xa9, 0xc7, 0x7f, 0x9d, 0x8f, 0x43, 0x8c, 0x9e, 0x58, 0x8d, 0x44, 0xbc, 0xfa, 0x6b, 0x5f, 0x3f, 0x5a, 0xbe, 0xe8, 0xb1, 0x16, 0xf, 0x91, 0x2a, 0xa0, 0x71, 0xbb, 0x8d, 0x6b, 0xcb}} return a, nil } @@ -266,7 +267,7 @@ func _1588665364_add_image_dataUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd6, 0xc6, 0x35, 0xb4, 0x4c, 0x39, 0x96, 0x29, 0x30, 0xda, 0xf4, 0x8f, 0xcb, 0xf1, 0x9f, 0x84, 0xdc, 0x88, 0xd4, 0xd5, 0xbc, 0xb6, 0x5b, 0x46, 0x78, 0x67, 0x76, 0x1a, 0x5, 0x36, 0xdc, 0xe5}} return a, nil } @@ -286,7 +287,7 @@ func _1589365189_add_pow_targetUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4e, 0x3a, 0xe2, 0x2e, 0x7d, 0xaf, 0xbb, 0xcc, 0x21, 0xa1, 0x7a, 0x41, 0x9a, 0xd0, 0xbb, 0xa9, 0xc8, 0x35, 0xf9, 0x32, 0x34, 0x46, 0x44, 0x9a, 0x86, 0x40, 0x7c, 0xb9, 0x23, 0xc7, 0x3, 0x3f}} return a, nil } @@ -306,7 +307,7 @@ func _1591277220_add_index_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9c, 0xfe, 0xbe, 0xd5, 0xb8, 0x8f, 0xdd, 0xef, 0xbb, 0xa8, 0xad, 0x7f, 0xed, 0x5b, 0x5b, 0x2f, 0xe6, 0x82, 0x27, 0x78, 0x1f, 0xb9, 0x57, 0xdc, 0x8, 0xc2, 0xb2, 0xa9, 0x9a, 0x4, 0xe1, 0x7a}} return a, nil } @@ -326,7 +327,7 @@ func _1593087212_add_mute_chat_and_raw_message_fieldsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0x99, 0x61, 0xd1, 0xaa, 0xb4, 0xbf, 0xaf, 0xd7, 0x20, 0x17, 0x40, 0xf9, 0x2, 0xfb, 0xcc, 0x40, 0x2a, 0xd, 0x86, 0x36, 0x30, 0x88, 0x89, 0x25, 0x80, 0x42, 0xb0, 0x5b, 0xe9, 0x73, 0x78}} return a, nil } @@ -346,7 +347,7 @@ func _1595862781_add_audio_dataUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xae, 0xd2, 0xee, 0x55, 0xfb, 0x36, 0xa4, 0x92, 0x66, 0xe, 0x81, 0x62, 0x1e, 0x7a, 0x69, 0xa, 0xd5, 0x4b, 0xa5, 0x6a, 0x8d, 0x1d, 0xce, 0xf3, 0x3e, 0xc0, 0x5f, 0x9c, 0x66, 0x1b, 0xb4, 0xed}} return a, nil } @@ -366,7 +367,7 @@ func _1595865249_create_emoji_reactions_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3e, 0xc5, 0x43, 0x5c, 0x3d, 0x53, 0x43, 0x2c, 0x1a, 0xa5, 0xb6, 0xbf, 0x7, 0x4, 0x5a, 0x3e, 0x40, 0x8b, 0xa4, 0x57, 0x12, 0x58, 0xbc, 0x42, 0xe2, 0xc3, 0xde, 0x76, 0x98, 0x80, 0xe2, 0xbe}} return a, nil } @@ -386,7 +387,7 @@ func _1596805115_create_group_chat_invitations_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6d, 0xb1, 0x14, 0x6d, 0x54, 0x28, 0x67, 0xc3, 0x23, 0x6a, 0xfc, 0x80, 0xdf, 0x9e, 0x4c, 0x35, 0x36, 0xf, 0xf8, 0xf3, 0x5f, 0xae, 0xad, 0xb, 0xc1, 0x51, 0x8e, 0x17, 0x7, 0xe5, 0x7f, 0x91}} return a, nil } @@ -406,7 +407,7 @@ func _1597322655_add_invitation_admin_chat_fieldUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa9, 0x7a, 0xa0, 0xf2, 0xdb, 0x13, 0x91, 0x91, 0xa8, 0x34, 0x1a, 0xa1, 0x49, 0x68, 0xd5, 0xae, 0x2c, 0xd8, 0xd5, 0xea, 0x8f, 0x8c, 0xc7, 0x2, 0x4e, 0x58, 0x2c, 0x3a, 0x14, 0xd4, 0x4f, 0x2c}} return a, nil } @@ -426,7 +427,7 @@ func _1597757544_add_nicknameUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0xa2, 0x64, 0x50, 0xc5, 0x4, 0xb9, 0x8b, 0xd1, 0x18, 0x9b, 0xc3, 0x91, 0x36, 0x2a, 0x1f, 0xc3, 0x6c, 0x2d, 0x92, 0xf8, 0x5e, 0xff, 0xb1, 0x59, 0x61, 0x2, 0x1c, 0xe1, 0x85, 0x90, 0xa4}} return a, nil } @@ -446,7 +447,7 @@ func _1598955122_add_mentionsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8d, 0x22, 0x17, 0x92, 0xd2, 0x11, 0x4e, 0x7, 0x93, 0x9a, 0x55, 0xfd, 0xb, 0x97, 0xc4, 0x63, 0x6a, 0x81, 0x97, 0xcd, 0xb2, 0xf8, 0x4b, 0x5f, 0x3c, 0xfa, 0x3a, 0x38, 0x53, 0x10, 0xed, 0x9d}} return a, nil } @@ -466,7 +467,7 @@ func _1599641390_add_emoji_reactions_indexUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0xd8, 0xdc, 0xa7, 0xb, 0x92, 0x7a, 0x61, 0x37, 0x24, 0x1c, 0x77, 0x5e, 0xe, 0x7e, 0xfc, 0x9f, 0x98, 0x7b, 0x65, 0xe7, 0xf9, 0x71, 0x57, 0x89, 0x2d, 0x90, 0x1b, 0xf6, 0x5e, 0x37, 0xe8}} return a, nil } @@ -486,7 +487,7 @@ func _1599720851_add_seen_index_remove_long_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x24, 0x1c, 0xc4, 0x78, 0x91, 0xc7, 0xeb, 0xfe, 0xc8, 0xa0, 0xd8, 0x13, 0x27, 0x97, 0xc8, 0x96, 0x56, 0x97, 0x33, 0x2c, 0x1e, 0x16, 0x8a, 0xd3, 0x49, 0x99, 0x3, 0xe9, 0xbb, 0xc4, 0x5, 0x3c}} return a, nil } @@ -506,7 +507,7 @@ func _1603198582_add_profile_chat_fieldUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0xca, 0xe, 0x46, 0xa0, 0x9, 0x9d, 0x47, 0x57, 0xe9, 0xfb, 0x17, 0xeb, 0x9c, 0xf6, 0xb8, 0x1d, 0xe9, 0xd, 0x0, 0xd5, 0xe5, 0xd8, 0x9e, 0x60, 0xa, 0xbf, 0x32, 0x2c, 0x52, 0x7f, 0x6a}} return a, nil } @@ -526,7 +527,7 @@ func _1603816533_add_linksUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x24, 0xd6, 0x1d, 0xa, 0x83, 0x1e, 0x4d, 0xf, 0xae, 0x4d, 0x8c, 0x51, 0x32, 0xa8, 0x37, 0xb0, 0x14, 0xfb, 0x32, 0x34, 0xc8, 0xc, 0x4e, 0x5b, 0xc5, 0x15, 0x65, 0x73, 0x0, 0x0, 0x1d}} return a, nil } @@ -546,7 +547,7 @@ func _1603888149_create_chat_identity_last_published_tableUpSql() (*asset, error return nil, err } - info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x9, 0xf, 0xfb, 0xdb, 0x3c, 0x86, 0x70, 0x82, 0xda, 0x10, 0x25, 0xe2, 0x4e, 0x40, 0x45, 0xab, 0x8b, 0x1c, 0x91, 0x7c, 0xf1, 0x70, 0x2e, 0x81, 0xf3, 0x71, 0x45, 0xda, 0xe2, 0xa4, 0x57}} return a, nil } @@ -566,7 +567,7 @@ func _1605075346_add_communitiesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1f, 0x64, 0xea, 0xb4, 0xae, 0x9e, 0xdb, 0x9, 0x58, 0xb6, 0x5c, 0x7a, 0x50, 0xc5, 0xfe, 0x93, 0x5d, 0x36, 0x85, 0x5d, 0x6a, 0xba, 0xc9, 0x7e, 0x84, 0xd7, 0xbf, 0x2a, 0x53, 0xf3, 0x97, 0xf1}} return a, nil } @@ -586,7 +587,7 @@ func _1610117927_add_message_cacheUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xf1, 0xf0, 0x82, 0x79, 0x28, 0x19, 0xc2, 0x39, 0x6a, 0xa5, 0x96, 0x59, 0x23, 0xa0, 0xed, 0x60, 0x58, 0x86, 0x9, 0xb9, 0xad, 0xfb, 0xa, 0xe3, 0x47, 0x6e, 0xa1, 0x18, 0xe8, 0x39, 0x2c}} return a, nil } @@ -606,7 +607,7 @@ func _1610959908_add_dont_wrap_to_raw_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x71, 0x2, 0x9a, 0xca, 0xd4, 0x38, 0x44, 0x30, 0x2b, 0xa8, 0x27, 0x32, 0x63, 0x53, 0x22, 0x60, 0x59, 0x84, 0x23, 0x96, 0x77, 0xf0, 0x56, 0xd7, 0x94, 0xe0, 0x95, 0x28, 0x6, 0x1d, 0x4e, 0xb1}} return a, nil } @@ -626,7 +627,7 @@ func _1610960912_add_send_on_personal_topicUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0xac, 0x2f, 0xc4, 0xd, 0xa7, 0x1b, 0x37, 0x30, 0xc2, 0x68, 0xee, 0xde, 0x54, 0x5e, 0xbf, 0x3f, 0xa0, 0xd6, 0xc6, 0x9f, 0xd4, 0x34, 0x12, 0x76, 0x1e, 0x66, 0x4a, 0xfc, 0xf, 0xee, 0xc9}} return a, nil } @@ -646,7 +647,7 @@ func _1612870480_add_datasync_idUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0x9a, 0xbc, 0xfa, 0xaa, 0x8c, 0x9c, 0x37, 0x67, 0x15, 0x9c, 0x7e, 0x78, 0x75, 0x66, 0x82, 0x18, 0x72, 0x10, 0xbc, 0xd4, 0xab, 0x44, 0xfe, 0x57, 0x85, 0x6d, 0x19, 0xf5, 0x96, 0x8a, 0xbe}} return a, nil } @@ -666,7 +667,7 @@ func _1614152139_add_communities_request_to_joinUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x11, 0x3, 0x26, 0xf9, 0x29, 0x50, 0x4f, 0xcd, 0x46, 0xe5, 0xb1, 0x6b, 0xb9, 0x2, 0x40, 0xb1, 0xdf, 0x4a, 0x4c, 0x7a, 0xda, 0x3, 0x35, 0xcd, 0x2d, 0xcc, 0x80, 0x7d, 0x57, 0x5f, 0x3, 0x5c}} return a, nil } @@ -686,7 +687,7 @@ func _1615374373_add_confirmationsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdd, 0xa6, 0x65, 0xc5, 0x1d, 0xb2, 0x77, 0x36, 0xe3, 0x79, 0xda, 0xe8, 0x7a, 0xa4, 0xdf, 0x45, 0xae, 0xd8, 0xb4, 0xba, 0x90, 0xfd, 0x74, 0x71, 0x14, 0x75, 0x73, 0x72, 0xb9, 0x9e, 0x1, 0x81}} return a, nil } @@ -706,7 +707,7 @@ func _1617694931_add_notification_centerUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x45, 0xc6, 0xc9, 0x73, 0xbb, 0x1f, 0xda, 0xa3, 0x4d, 0x19, 0x98, 0x85, 0x2d, 0xca, 0xda, 0xcc, 0x3b, 0x32, 0xff, 0xc7, 0x7b, 0xe3, 0x9f, 0x9b, 0x2a, 0x93, 0xf5, 0xdf, 0x65, 0x38, 0x91}} return a, nil } @@ -726,7 +727,7 @@ func _1618923660_create_pin_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x61, 0x44, 0x3a, 0xbe, 0x30, 0xd2, 0x7e, 0xc0, 0xe2, 0x8e, 0x65, 0x53, 0x54, 0xbb, 0x7a, 0x1c, 0xb3, 0x5d, 0xd2, 0xa6, 0xa9, 0x28, 0xb7, 0xa4, 0x5f, 0x8b, 0x9, 0x5f, 0x17, 0xc1, 0x85, 0x21}} return a, nil } @@ -746,7 +747,7 @@ func _1619094007_add_joined_chat_fieldUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x30, 0x81, 0x3a, 0x2f, 0x9f, 0xb3, 0x0, 0x55, 0x8e, 0x1d, 0xa8, 0xb0, 0x68, 0xf0, 0x40, 0x1a, 0x6c, 0xaa, 0xfc, 0x33, 0xd1, 0xd1, 0x55, 0x3f, 0xf2, 0xbd, 0x54, 0xa1, 0x2b, 0x40, 0x95}} return a, nil } @@ -766,7 +767,7 @@ func _1619099821_add_last_synced_fieldUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x52, 0x22, 0xe, 0x2f, 0xd7, 0x93, 0x5f, 0x42, 0xc2, 0x93, 0x4, 0x35, 0x6f, 0xc9, 0x19, 0xed, 0x6b, 0x52, 0x6f, 0xae, 0x99, 0xe2, 0x68, 0x3d, 0x4f, 0x40, 0xe, 0xe1, 0xa, 0x47, 0x21}} return a, nil } @@ -786,7 +787,7 @@ func _1621933219_add_mentionedUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x76, 0x8a, 0xc9, 0x7, 0x8f, 0xa5, 0xcb, 0x12, 0x21, 0x4e, 0xfe, 0x96, 0x77, 0xcf, 0x7f, 0x76, 0x75, 0x36, 0x2c, 0xf8, 0x1d, 0x13, 0xcb, 0xcd, 0x6e, 0x70, 0xbf, 0xf5, 0x93, 0x67, 0xd1}} return a, nil } @@ -806,7 +807,7 @@ func _1622010048_add_unviewed_mentions_countUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7c, 0x16, 0x85, 0xa6, 0x5b, 0xe1, 0x66, 0xb9, 0x84, 0xbe, 0x7f, 0xa, 0x77, 0x23, 0xb9, 0xef, 0x8e, 0x2, 0x8, 0xfc, 0x61, 0xb2, 0x43, 0xa9, 0x63, 0xae, 0xb4, 0xdf, 0x30, 0xb1, 0x61, 0x4b}} return a, nil } @@ -826,7 +827,7 @@ func _1622061278_add_message_activity_center_notification_fieldUpSql() (*asset, return nil, err } - info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8, 0xc, 0xa6, 0x1f, 0xa5, 0xc6, 0x7c, 0x6f, 0xab, 0x2c, 0x2d, 0xb5, 0xa4, 0xdd, 0xc1, 0xd6, 0x44, 0x83, 0xf9, 0xb1, 0xa5, 0xce, 0x34, 0x3d, 0x2, 0xa9, 0x35, 0xcf, 0xc6, 0xb2, 0x43, 0x37}} return a, nil } @@ -846,7 +847,7 @@ func _1622464518_set_synced_to_fromUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x33, 0x3e, 0x2b, 0xa, 0x1e, 0xc7, 0x6d, 0x6f, 0xd1, 0x1d, 0xe8, 0x4b, 0xdd, 0x92, 0x76, 0xea, 0xf2, 0x3e, 0x15, 0x85, 0xc4, 0xc3, 0x31, 0xf1, 0xc0, 0xa2, 0xd7, 0x47, 0xde, 0x4e, 0xfd, 0xc6}} return a, nil } @@ -866,7 +867,7 @@ func _1622464519_add_chat_descriptionUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x2e, 0x89, 0x31, 0xec, 0xef, 0xeb, 0x43, 0xf5, 0x96, 0x6d, 0xce, 0x91, 0x8a, 0x37, 0x2a, 0x11, 0x7a, 0x3f, 0xd9, 0x10, 0xbb, 0xa1, 0xbc, 0x7, 0xe0, 0x3b, 0xa5, 0xf4, 0xa6, 0xf4, 0xa1}} return a, nil } @@ -886,7 +887,7 @@ func _1622622253_add_pinned_by_to_pin_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9b, 0x94, 0xa3, 0x45, 0x91, 0x1e, 0x66, 0xd1, 0x96, 0x5a, 0xaf, 0xfa, 0x29, 0x39, 0xa8, 0x3a, 0x97, 0x4c, 0x65, 0x6, 0x96, 0x90, 0x4c, 0xfe, 0xce, 0x7d, 0x5d, 0xd4, 0xb3, 0x8, 0x6d, 0x5f}} return a, nil } @@ -906,7 +907,7 @@ func _1623938329_add_author_activity_center_notification_fieldUpSql() (*asset, e return nil, err } - info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0xe6, 0xa7, 0xd5, 0x26, 0xff, 0xab, 0x92, 0x88, 0xf0, 0xd3, 0x34, 0xd9, 0x2f, 0xe7, 0x18, 0x1a, 0x40, 0xf9, 0xbe, 0x8e, 0xfc, 0xd0, 0x4f, 0x1f, 0x4a, 0xb9, 0x83, 0x3f, 0xa9, 0xde, 0xb}} return a, nil } @@ -926,7 +927,7 @@ func _1623938330_add_edit_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xd2, 0xce, 0xe, 0x5c, 0x19, 0xbe, 0x5e, 0x29, 0xbe, 0x9b, 0x31, 0x53, 0x76, 0xb2, 0xc8, 0x56, 0xf0, 0x82, 0xfe, 0x7d, 0x6c, 0xe8, 0x5c, 0xe9, 0x7a, 0x5d, 0x5, 0xc4, 0x92, 0x38, 0xe3}} return a, nil } @@ -946,7 +947,7 @@ func _1624978434_add_muted_communityUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6, 0xdc, 0x6e, 0x6f, 0x97, 0xc7, 0x3d, 0x50, 0xab, 0x80, 0x87, 0x44, 0x43, 0x38, 0xe6, 0xc5, 0xc1, 0x91, 0x26, 0xf, 0x16, 0xe, 0xd9, 0x32, 0x37, 0x25, 0x96, 0x25, 0x6, 0xc8, 0xb5, 0x4a}} return a, nil } @@ -966,7 +967,7 @@ func _1625018910_add_repply_message_activity_center_notification_fieldUpSql() (* return nil, err } - info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf2, 0x52, 0x12, 0x40, 0xd8, 0x6f, 0x71, 0x97, 0x46, 0x39, 0xaa, 0x74, 0x41, 0xcd, 0x45, 0x4c, 0xe8, 0xd9, 0xe2, 0x56, 0x8e, 0x78, 0x18, 0x62, 0xf6, 0xa8, 0x36, 0xe9, 0x9a, 0x1f, 0xc, 0xb1}} return a, nil } @@ -986,7 +987,7 @@ func _1625762506_add_deleted_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x61, 0x42, 0xb6, 0x8c, 0x7f, 0x2d, 0xec, 0xa9, 0x6d, 0x3d, 0x0, 0xa3, 0x32, 0xd8, 0x4a, 0x38, 0x5c, 0x97, 0xfc, 0x68, 0xde, 0xa9, 0xb7, 0xd8, 0xde, 0xb, 0x29, 0x93, 0xdc, 0x81, 0xf8}} return a, nil } @@ -1006,7 +1007,7 @@ func _1627388946_add_communities_synced_atUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc1, 0xbd, 0x9b, 0x6a, 0xc9, 0x1a, 0x7a, 0x34, 0xcf, 0x5f, 0x80, 0x9e, 0x8c, 0x1c, 0xc0, 0xec, 0x4e, 0x78, 0xb0, 0x2d, 0x15, 0x77, 0x38, 0x4a, 0x6a, 0x5, 0x84, 0xf5, 0x8d, 0x8b, 0xbe, 0x9}} return a, nil } @@ -1026,7 +1027,7 @@ func _1628280060_createUsermessagesIndexSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x6f, 0x70, 0x47, 0x40, 0xab, 0xa8, 0x60, 0xe0, 0xf9, 0x8, 0x7e, 0x19, 0x9d, 0xba, 0x33, 0x16, 0xfc, 0x3c, 0xdc, 0xa8, 0xa6, 0x53, 0x61, 0x39, 0x82, 0x91, 0xcf, 0x69, 0xd8, 0xf2, 0xcf}} return a, nil } @@ -1046,7 +1047,7 @@ func _1632303896_modify_contacts_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x1e, 0x6c, 0x3c, 0xd, 0xd7, 0x7d, 0xbb, 0x19, 0xbc, 0xe4, 0x7, 0xfd, 0xf8, 0x66, 0x6d, 0x78, 0xf6, 0x4, 0xe6, 0x51, 0xe4, 0xe6, 0xdc, 0xe, 0x5a, 0x2e, 0xac, 0xe6, 0xe7, 0x24, 0x69}} return a, nil } @@ -1066,7 +1067,7 @@ func _1633349838_add_emoji_column_in_chatsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x33, 0xcb, 0x3b, 0xa9, 0x99, 0x77, 0x6a, 0xea, 0xc4, 0x39, 0xd7, 0xa1, 0x49, 0xa7, 0xdf, 0xff, 0x72, 0xda, 0x34, 0x21, 0x67, 0x66, 0xca, 0x65, 0x46, 0x1, 0xa6, 0x4e, 0xf9, 0x38, 0x86}} return a, nil } @@ -1086,7 +1087,7 @@ func _1634831235_add_highlight_column_in_chatsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0x63, 0x5c, 0x73, 0x19, 0x83, 0xbd, 0x35, 0x80, 0x9f, 0x66, 0xec, 0x4c, 0xbc, 0x9d, 0x2d, 0x52, 0x91, 0x6d, 0xb3, 0x2b, 0x87, 0xde, 0x24, 0x46, 0x5c, 0xd, 0xfd, 0x78, 0xf5, 0xe3, 0xe9}} return a, nil } @@ -1106,7 +1107,7 @@ func _1634896007_add_last_updated_locally_and_removedUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0xa8, 0x34, 0xe2, 0xc0, 0x62, 0xc8, 0xd6, 0x5a, 0x87, 0xe3, 0x70, 0xe1, 0xc4, 0x16, 0x9c, 0x60, 0x2e, 0x98, 0xf0, 0x91, 0x84, 0xbe, 0xe0, 0xdf, 0x3e, 0x4d, 0x24, 0xc4, 0x6c, 0x40, 0x17}} return a, nil } @@ -1126,7 +1127,7 @@ func _1635840039_add_clock_read_at_column_in_chatsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6c, 0xba, 0x3f, 0xba, 0x1a, 0x71, 0xa8, 0x9, 0x19, 0xbe, 0x1e, 0x38, 0x50, 0x30, 0x3a, 0x52, 0x15, 0x29, 0xee, 0x49, 0x19, 0x6f, 0x53, 0xc2, 0xc6, 0x6c, 0xd9, 0x80, 0x7e, 0xb9, 0x58, 0x7a}} return a, nil } @@ -1146,7 +1147,7 @@ func _1637852321_add_received_invitation_admin_column_in_chatsUpSql() (*asset, e return nil, err } - info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x70, 0x8b, 0x92, 0x56, 0x83, 0x70, 0x7f, 0x6, 0xb2, 0xd, 0x1c, 0x2f, 0xcc, 0x93, 0xc3, 0x85, 0x8c, 0xc2, 0x38, 0x94, 0x7e, 0x88, 0x3f, 0x39, 0x34, 0xf8, 0x90, 0xcf, 0x83, 0x68, 0x3d, 0xe5}} return a, nil } @@ -1166,7 +1167,7 @@ func _1645034601_display_nameUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x15, 0xfc, 0xda, 0x70, 0x53, 0x19, 0x90, 0x20, 0x4, 0x1c, 0x99, 0x42, 0x53, 0x1a, 0xd6, 0xb8, 0xbb, 0x8a, 0xe8, 0xbe, 0xcc, 0xb7, 0xc, 0x7f, 0x73, 0x50, 0x18, 0xf1, 0x8b, 0x18, 0x54, 0x64}} return a, nil } @@ -1186,7 +1187,7 @@ func _1645034602_add_mutual_contact_requestUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1a, 0xe0, 0x5d, 0x68, 0xb8, 0x50, 0xa4, 0xbb, 0x3e, 0x4f, 0x2, 0x87, 0xad, 0x87, 0x6e, 0x38, 0xdf, 0xc8, 0x4c, 0xe2, 0x5f, 0xd1, 0x6, 0xdc, 0xe7, 0xbd, 0x4a, 0x9c, 0xf3, 0x91, 0xa1, 0x51}} return a, nil } @@ -1206,7 +1207,7 @@ func _1650373957_add_contact_request_stateUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xc1, 0x3f, 0x29, 0xe, 0x19, 0x86, 0x1a, 0x4c, 0x6c, 0x2a, 0x90, 0x9d, 0xdf, 0xb1, 0xb, 0x72, 0x25, 0xcd, 0x6c, 0x5f, 0xd, 0x51, 0x9e, 0x85, 0xc0, 0x9, 0xb7, 0xbc, 0x87, 0x23, 0xec}} return a, nil } @@ -1226,7 +1227,7 @@ func _1656958989_contact_verificationUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3a, 0x3f, 0x28, 0x38, 0x33, 0xdb, 0xe9, 0x4d, 0xc0, 0x54, 0x8c, 0x2a, 0x73, 0xc4, 0xdd, 0x5c, 0xc5, 0x1a, 0x93, 0x4b, 0x6, 0x13, 0xbe, 0x42, 0xd2, 0x7f, 0xd4, 0xc, 0xc5, 0x4e, 0x6d, 0xce}} return a, nil } @@ -1246,7 +1247,7 @@ func _1658236268_add_discord_message_authors_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3d, 0xb7, 0xdb, 0x79, 0x1, 0x15, 0xe7, 0x76, 0x5d, 0x22, 0x54, 0x82, 0x9a, 0xbe, 0x24, 0xc1, 0x82, 0xcf, 0x67, 0x91, 0x53, 0xcc, 0xac, 0x74, 0x18, 0x61, 0x69, 0x68, 0x19, 0xca, 0x2b, 0xa8}} return a, nil } @@ -1266,7 +1267,7 @@ func _1659619997_add_discord_messages_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x12, 0x9c, 0x96, 0xe2, 0x42, 0x3f, 0x94, 0x62, 0xc2, 0x76, 0xab, 0x3b, 0x4c, 0x85, 0x36, 0x48, 0xcc, 0x73, 0x60, 0x93, 0x5a, 0xd6, 0x7, 0xd6, 0x0, 0xee, 0x1b, 0x1e, 0x34, 0x58, 0x99}} return a, nil } @@ -1286,7 +1287,7 @@ func _1660226788_create_chat_identity_social_linksUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3c, 0x76, 0x40, 0xe9, 0x85, 0xc4, 0x38, 0xf8, 0xe5, 0x5d, 0xe8, 0x13, 0x46, 0x1b, 0xc, 0x1, 0xe9, 0x2f, 0x74, 0xd1, 0x79, 0x59, 0xa4, 0xdb, 0x4a, 0x4a, 0xf4, 0x98, 0x58, 0x3c, 0x57, 0xd3}} return a, nil } @@ -1306,7 +1307,7 @@ func _1660226789_add_walletconnectsessions_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf8, 0x5c, 0x72, 0x2, 0xed, 0x36, 0x19, 0x91, 0x4d, 0x1a, 0xc1, 0xab, 0x84, 0xfa, 0x41, 0xb1, 0x46, 0xa5, 0xdb, 0x3f, 0x76, 0x47, 0xd3, 0x75, 0x3c, 0x6a, 0x8e, 0x78, 0xe6, 0x41, 0xdc, 0x7f}} return a, nil } @@ -1326,7 +1327,7 @@ func _1661242854_add_communities_requests_to_leaveUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x2e, 0x7d, 0x14, 0xef, 0x6e, 0x95, 0x4b, 0x6, 0x70, 0x2e, 0xd1, 0xf6, 0x59, 0xf9, 0xe, 0x56, 0xa, 0x9c, 0x80, 0x18, 0xca, 0xb9, 0x49, 0x19, 0xf, 0x89, 0x94, 0x36, 0x6d, 0x93, 0x9a}} return a, nil } @@ -1346,7 +1347,7 @@ func _1662044232_add_chat_imageUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x74, 0xdf, 0x50, 0x79, 0x73, 0x9e, 0xd0, 0xff, 0xa4, 0xd3, 0x87, 0xc3, 0x48, 0x31, 0x6c, 0xdf, 0xa6, 0x20, 0x85, 0xe6, 0x4e, 0x19, 0x9d, 0xef, 0xcc, 0x84, 0x2b, 0x5d, 0x44, 0x34, 0x6}} return a, nil } @@ -1366,7 +1367,7 @@ func _1662106895_add_chat_first_message_timestampUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8b, 0x55, 0x74, 0xfa, 0xf5, 0x51, 0x85, 0x19, 0xfd, 0xfb, 0x6, 0x79, 0x4d, 0x1d, 0xd, 0x3, 0x46, 0x66, 0x34, 0x1e, 0xce, 0x91, 0x21, 0x29, 0xf6, 0x71, 0xe7, 0x31, 0x39, 0x8f, 0x9d, 0x5}} return a, nil } @@ -1386,7 +1387,7 @@ func _1662723928_add_discord_author_image_fieldsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1e, 0x5b, 0x48, 0x57, 0x98, 0x55, 0x9a, 0xf1, 0x75, 0xf7, 0xb5, 0x41, 0x5e, 0x96, 0xc5, 0xce, 0xfc, 0x30, 0x5c, 0x15, 0x35, 0x9e, 0x4e, 0x4a, 0x3b, 0x38, 0x42, 0xc4, 0x27, 0x3c, 0x87, 0xbf}} return a, nil } @@ -1406,7 +1407,7 @@ func _1664195977_add_deleted_for_mesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7d, 0x9d, 0x13, 0x9, 0xaa, 0x44, 0x14, 0x93, 0xe2, 0xf5, 0x53, 0xb7, 0x79, 0xa8, 0x18, 0xf0, 0x6c, 0xa4, 0x9c, 0x73, 0xc1, 0xaa, 0xc5, 0x2e, 0xc5, 0x41, 0xd7, 0x24, 0xb0, 0xd7, 0xb8, 0xdf}} return a, nil } @@ -1426,7 +1427,7 @@ func _1664367420_add_discord_attachments_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x48, 0xe1, 0xb6, 0x4f, 0x6f, 0x92, 0x0, 0xb4, 0xf, 0x55, 0x12, 0x1c, 0x98, 0x6d, 0xbc, 0x1e, 0xfd, 0xae, 0x1c, 0xce, 0xd1, 0x3d, 0x2, 0x21, 0x2e, 0xc0, 0x13, 0xa, 0xb2, 0xec, 0x81, 0x13}} return a, nil } @@ -1446,7 +1447,7 @@ func _1665079662_add_spectated_column_in_communitiesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0x5d, 0xfe, 0xe2, 0xbe, 0xdf, 0xba, 0x45, 0xe9, 0xfc, 0xa7, 0x5f, 0xda, 0x19, 0xdb, 0x40, 0x96, 0x59, 0x78, 0xa, 0xd7, 0x4a, 0xca, 0x1a, 0x93, 0xfb, 0xae, 0x6d, 0x74, 0x7, 0x36, 0xdd}} return a, nil } @@ -1466,7 +1467,7 @@ func _1665479047_add_community_id_in_notificationsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd9, 0x8f, 0x8b, 0x1c, 0xaa, 0x6a, 0x56, 0xd6, 0xa5, 0x88, 0x57, 0x13, 0x8f, 0xea, 0xb9, 0x23, 0x82, 0x50, 0xb7, 0x65, 0x1f, 0xab, 0xfa, 0x23, 0x6f, 0x0, 0x7, 0xb6, 0x6e, 0xb5, 0x85, 0x44}} return a, nil } @@ -1486,7 +1487,7 @@ func _1665484435_add_encrypted_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0x5c, 0x1e, 0x1c, 0x7f, 0xae, 0x5f, 0xeb, 0x3c, 0x6c, 0xcd, 0xc2, 0x99, 0x48, 0x5c, 0x83, 0xa0, 0xa2, 0x97, 0x5, 0x39, 0x82, 0x71, 0x90, 0x47, 0x21, 0x84, 0x29, 0x19, 0xa4, 0x7a, 0x90}} return a, nil } @@ -1506,7 +1507,7 @@ func _1665560200_add_contact_verification_individualUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0664), modTime: time.Unix(1667843815, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc5, 0xbb, 0x61, 0xfd, 0xbf, 0x33, 0x1d, 0x4e, 0x5f, 0xbd, 0x86, 0x42, 0xb0, 0x6c, 0xf7, 0x39, 0x19, 0x6e, 0x72, 0x35, 0xfd, 0x1b, 0xd6, 0xbd, 0xf6, 0x81, 0x21, 0xc4, 0xaa, 0x6, 0x62, 0x40}} return a, nil } @@ -1526,7 +1527,7 @@ func _1670921937_add_album_idUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0664), modTime: time.Unix(1671559305, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xae, 0x83, 0x58, 0xb7, 0x77, 0x5, 0xca, 0xe3, 0xda, 0x32, 0x8f, 0x7b, 0xa4, 0x2f, 0x4c, 0xaf, 0x5f, 0xfa, 0x94, 0x36, 0xe4, 0xf9, 0x7, 0xc6, 0xd6, 0xb7, 0x90, 0xf3, 0xe5, 0xb5, 0x3}} return a, nil } @@ -1546,7 +1547,7 @@ func _1673373000_add_repliedUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0664), modTime: time.Unix(1673398499, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x1c, 0xae, 0xf2, 0xf, 0xb4, 0xc2, 0xba, 0x3c, 0xfe, 0x7b, 0xb0, 0xf, 0xf, 0xd5, 0xbc, 0xe2, 0xa7, 0xad, 0x50, 0xd9, 0x5a, 0xe8, 0x96, 0x22, 0x65, 0x89, 0xcf, 0x4a, 0x9a, 0x1b, 0x94}} return a, nil } @@ -1566,7 +1567,7 @@ func _1673428910_add_image_width_heightUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0664), modTime: time.Unix(1673527384, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x74, 0xda, 0x93, 0x2a, 0x9b, 0x6b, 0xb7, 0x96, 0xcd, 0xac, 0xf, 0xaf, 0x54, 0x89, 0x9e, 0x91, 0x5b, 0xd0, 0x4a, 0xa, 0x8d, 0x9e, 0x80, 0x66, 0x26, 0x9e, 0xb5, 0xa9, 0x8, 0xec, 0x2d, 0x6c}} return a, nil } @@ -1586,7 +1587,7 @@ func _1674210659_add_contact_request_local_clockUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0x72, 0x39, 0xfe, 0x72, 0x98, 0xfc, 0x91, 0x20, 0x10, 0xe8, 0xf5, 0xac, 0x79, 0xa8, 0x1c, 0xca, 0x7b, 0x35, 0xa, 0xc1, 0x56, 0x49, 0x9a, 0xfc, 0xbd, 0x64, 0x9d, 0xdf, 0xd2, 0x60, 0x70}} return a, nil } @@ -1606,7 +1607,7 @@ func _1675212323_add_deleted_byUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x85, 0x37, 0x29, 0x2f, 0xd, 0x5a, 0xb6, 0xdb, 0xa7, 0x8, 0x86, 0xfc, 0x7a, 0x70, 0xd8, 0x4d, 0xe6, 0xf0, 0x57, 0xe7, 0xd1, 0x95, 0xd5, 0x4, 0x40, 0x2f, 0x7a, 0x5, 0x4f, 0xc2, 0x97, 0xbc}} return a, nil } @@ -1626,7 +1627,7 @@ func _1675247084_add_activity_center_statesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0664), modTime: time.Unix(1676987564, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xba, 0x90, 0x7d, 0x55, 0xc7, 0x40, 0x29, 0x26, 0x97, 0x45, 0x5c, 0xdf, 0xba, 0x61, 0xb, 0xfc, 0x3d, 0x7a, 0x6c, 0x42, 0xe4, 0x95, 0x78, 0xb0, 0xc5, 0x1f, 0x73, 0xe9, 0x33, 0x51, 0xc8, 0x81}} return a, nil } @@ -1646,7 +1647,7 @@ func _1675272329_fix_protocol_migrationUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0664), modTime: time.Unix(1675294606, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb6, 0xe0, 0x11, 0x4c, 0x66, 0x55, 0x72, 0xd3, 0xe6, 0x98, 0xa4, 0xe7, 0x44, 0xf9, 0x3b, 0x3a, 0x3f, 0xd9, 0x91, 0x1e, 0x4f, 0xfc, 0x56, 0x63, 0xe5, 0xa4, 0x83, 0xfc, 0x7c, 0xcf, 0x18, 0x99}} return a, nil } @@ -1666,7 +1667,7 @@ func _1676998418_fix_activity_center_migrationUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0664), modTime: time.Unix(1677251785, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8a, 0xdc, 0x64, 0xb1, 0x47, 0x67, 0xda, 0x2c, 0x26, 0x29, 0x6b, 0x6f, 0xb, 0xfa, 0x45, 0xf3, 0xad, 0x8b, 0x1a, 0x5f, 0x1c, 0xed, 0xd7, 0xea, 0x54, 0xf5, 0x3f, 0xb8, 0xf6, 0xf9, 0x44, 0x53}} return a, nil } @@ -1686,7 +1687,7 @@ func _1677278861_add_deleted_column_to_activity_center_notifications_tableUpSql( return nil, err } - info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0664), modTime: time.Unix(1677714914, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0x3a, 0x95, 0xaf, 0x81, 0xb0, 0x85, 0x8d, 0x73, 0xda, 0x7b, 0x2a, 0x35, 0xa6, 0xaa, 0xcc, 0x4c, 0x35, 0xa3, 0xa8, 0xbd, 0xd1, 0x37, 0xe8, 0x5d, 0x83, 0xa4, 0x33, 0x1f, 0x10, 0xe4, 0xe6}} return a, nil } @@ -1706,7 +1707,7 @@ func _1677486338_add_community_tokens_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0664), modTime: time.Unix(1677714914, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfb, 0x7b, 0x3d, 0x7e, 0x79, 0xc4, 0x3a, 0xf1, 0xda, 0x4b, 0xc6, 0xd1, 0xd, 0xfb, 0xb2, 0xb9, 0x7f, 0x81, 0x29, 0xab, 0xd8, 0x1, 0x20, 0xd7, 0xe1, 0xaf, 0x3e, 0x67, 0x1b, 0xdb, 0xf9, 0xd5}} return a, nil } @@ -1726,7 +1727,7 @@ func _1678292329_add_collapsed_categoriesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x46, 0x63, 0x86, 0xd5, 0x7, 0xe2, 0x25, 0x15, 0x1b, 0xfe, 0xf3, 0xe, 0x50, 0x48, 0x11, 0x3c, 0x7c, 0xc6, 0xe5, 0xab, 0x8d, 0x1f, 0xe8, 0x3c, 0xcb, 0xf0, 0x8d, 0xa7, 0x49, 0x4c, 0x16, 0x4f}} return a, nil } @@ -1746,7 +1747,7 @@ func _1678800760_add_index_to_raw_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9d, 0xd9, 0x8d, 0x22, 0x46, 0xae, 0x7b, 0x53, 0x3e, 0x51, 0x39, 0xad, 0xad, 0x38, 0x50, 0x6, 0xfa, 0xb9, 0xc4, 0x9f, 0x8d, 0xd2, 0x67, 0x0, 0xef, 0x58, 0x13, 0xab, 0x6a, 0x67, 0xf3, 0x7e}} return a, nil } @@ -1766,7 +1767,7 @@ func _1678877478_add_communities_requests_to_join_revealed_addresses_tableUpSql( return nil, err } - info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0664), modTime: time.Unix(1679924157, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x82, 0x1, 0xb4, 0xb2, 0x94, 0x25, 0xd5, 0x2e, 0x45, 0xc3, 0xb1, 0x2c, 0xeb, 0x1a, 0x52, 0xe0, 0x4b, 0x9b, 0x46, 0xf4, 0xc, 0xac, 0x1, 0x1e, 0x90, 0xbc, 0x64, 0x38, 0x10, 0xf1, 0xaf, 0xac}} return a, nil } @@ -1786,7 +1787,7 @@ func _1679326850_add_community_token_ownersUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0664), modTime: time.Unix(1680094975, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe9, 0xe6, 0x25, 0x67, 0xd1, 0xd6, 0x54, 0x88, 0xb1, 0x80, 0x1e, 0x2d, 0x9c, 0xfa, 0x1c, 0xc7, 0x63, 0x6e, 0xf9, 0x66, 0xb1, 0x68, 0xc6, 0xf8, 0x51, 0xb6, 0xd5, 0x4e, 0x93, 0x39, 0x5e, 0xc0}} return a, nil } @@ -1806,7 +1807,7 @@ func _1680011500_add_album_images_countUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0664), modTime: time.Unix(1681392552, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0x55, 0x99, 0x31, 0xcc, 0x80, 0x78, 0xc3, 0x51, 0x13, 0x63, 0x6f, 0x1a, 0xfd, 0x53, 0xd2, 0xf4, 0x13, 0x4b, 0xb2, 0x4f, 0x99, 0xb8, 0x7b, 0x7, 0x99, 0xb6, 0xab, 0x88, 0x2e, 0x7, 0x8}} return a, nil } @@ -1826,7 +1827,7 @@ func _1680114896_add_index_on_album_idUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0664), modTime: time.Unix(1681392552, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x7e, 0xd5, 0xcd, 0x2d, 0xab, 0xd4, 0x32, 0x26, 0x50, 0x3a, 0x5b, 0x8e, 0x1c, 0xcc, 0x35, 0xf8, 0xa1, 0x2a, 0xc1, 0x23, 0xf6, 0x90, 0xfe, 0x84, 0x3, 0xde, 0x5a, 0xee, 0xc6, 0xfc, 0x2a}} return a, nil } @@ -1846,7 +1847,7 @@ func _1681655289_add_mute_tillUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0664), modTime: time.Unix(1683581866, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0xbe, 0xce, 0xb8, 0xe1, 0x30, 0xe7, 0xa7, 0xe0, 0x7d, 0x97, 0xf4, 0x26, 0xb8, 0x57, 0x1d, 0x2a, 0xed, 0x18, 0xf2, 0xa, 0xe3, 0x77, 0x29, 0x18, 0x55, 0x9, 0x74, 0x2c, 0x24, 0x5a, 0x19}} return a, nil } @@ -1866,7 +1867,7 @@ func _1681934966_add_index_response_toUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0664), modTime: time.Unix(1683581866, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3b, 0xed, 0xa6, 0x7e, 0x51, 0xf2, 0xa1, 0x3c, 0x78, 0x9a, 0xa7, 0x7a, 0x51, 0x25, 0x7d, 0xdd, 0x4b, 0xf3, 0x45, 0xeb, 0x3f, 0xad, 0x23, 0x3e, 0xac, 0x16, 0x28, 0x62, 0x7, 0x8c, 0xe0, 0xa0}} return a, nil } @@ -1886,7 +1887,7 @@ func _1682528339_add_index_user_messages_unseenUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0664), modTime: time.Unix(1683581871, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x35, 0xfa, 0x98, 0xdd, 0x74, 0x5e, 0x21, 0x1f, 0xf2, 0x56, 0x17, 0x96, 0xfe, 0xbb, 0x44, 0x4c, 0xa1, 0xd8, 0x9f, 0x2e, 0x6, 0x2f, 0xd8, 0x23, 0xec, 0x94, 0x8c, 0x53, 0xf3, 0xf0, 0x40, 0xe7}} return a, nil } @@ -1906,7 +1907,7 @@ func _1683707289_recreate_deleted_for_mesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0664), modTime: time.Unix(1683894948, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0x9d, 0xd6, 0x45, 0x41, 0x29, 0x44, 0xf6, 0x14, 0x38, 0xeb, 0xdf, 0x6b, 0x5d, 0x9c, 0x45, 0x4b, 0xc3, 0xa8, 0xbd, 0x38, 0x14, 0xd9, 0x73, 0xf1, 0x51, 0xbb, 0x9f, 0x14, 0x36, 0xf2, 0x11}} return a, nil } @@ -1926,7 +1927,7 @@ func _1683725607_mark_discord_messages_as_seenUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0664), modTime: time.Unix(1683894948, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd7, 0x2a, 0xc3, 0x43, 0xea, 0x5e, 0x3, 0x2e, 0xce, 0x79, 0xea, 0xa5, 0x67, 0x61, 0x8c, 0xe4, 0xb9, 0xb7, 0x4d, 0xd5, 0xd5, 0xb0, 0x35, 0xc8, 0x2b, 0xa0, 0x3f, 0xd8, 0xde, 0xea, 0x4e, 0x16}} return a, nil } @@ -1946,7 +1947,7 @@ func _1684174617_add_url_previews_to_user_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0xb0, 0x72, 0xe3, 0xe4, 0xa9, 0x63, 0x82, 0xea, 0x52, 0x70, 0xb6, 0xa0, 0x73, 0x55, 0x7a, 0x78, 0xa8, 0xd2, 0xb0, 0xf4, 0x78, 0x8a, 0xd, 0x5a, 0xa2, 0x9d, 0x92, 0xdc, 0xce, 0x1c, 0x71}} return a, nil } @@ -1966,7 +1967,7 @@ func _1684175608_add_token_balancesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0664), modTime: time.Unix(1685365190, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1b, 0x4e, 0xe0, 0x48, 0x34, 0x1, 0x4d, 0x88, 0x11, 0x54, 0x20, 0x52, 0x5c, 0x57, 0x14, 0xa9, 0xa9, 0x36, 0xa4, 0x28, 0x59, 0x48, 0xa8, 0xa, 0x76, 0xec, 0x37, 0xee, 0x9e, 0xd2, 0x20, 0xaa}} return a, nil } @@ -1986,7 +1987,7 @@ func _1684979808_sync_activity_center_notificationsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1684979808_sync_activity_center_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1684979808_sync_activity_center_notifications.up.sql", size: 169, mode: os.FileMode(0664), modTime: time.Unix(1687991048, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0xf5, 0xf7, 0x94, 0xa9, 0xa1, 0x60, 0x26, 0x9d, 0xca, 0x31, 0xf, 0x14, 0xd, 0x70, 0xf8, 0xab, 0x40, 0x29, 0x73, 0x61, 0xbd, 0x1b, 0xb6, 0xc4, 0x31, 0x77, 0x9e, 0x32, 0xa8, 0xce, 0x6d}} return a, nil } @@ -2006,7 +2007,7 @@ func _1685383829_add_communities_mute_tillUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1685383829_add_communities_mute_till.up.sql", size: 69, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1685383829_add_communities_mute_till.up.sql", size: 69, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbf, 0x58, 0x96, 0xe5, 0x66, 0xcb, 0xde, 0xed, 0x76, 0xb8, 0x5a, 0x86, 0x81, 0x9a, 0x60, 0x51, 0x12, 0x37, 0x54, 0x9a, 0x36, 0x3e, 0xd1, 0x4a, 0xbe, 0x9a, 0xab, 0x20, 0x7f, 0x1d, 0xf4, 0x73}} return a, nil } @@ -2026,7 +2027,7 @@ func _1685964183_add_chainids_to_revealed_addressesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1685964183_add_chainids_to_revealed_addresses.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1685964183_add_chainids_to_revealed_addresses.up.sql", size: 88, mode: os.FileMode(0664), modTime: time.Unix(1687991048, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0xb5, 0xa8, 0xd7, 0xad, 0x9c, 0x54, 0xa5, 0xe9, 0xdb, 0x42, 0x2d, 0xd0, 0xd7, 0x22, 0x1, 0x93, 0xf3, 0x4f, 0x53, 0xf7, 0x1e, 0xbe, 0x4b, 0xac, 0xc7, 0x63, 0x15, 0xdf, 0xe0, 0x6, 0xf8}} return a, nil } @@ -2046,7 +2047,7 @@ func _1687370421_add_communities_muted_till_newUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1687370421_add_communities_muted_till_new.up.sql", size: 635, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1687370421_add_communities_muted_till_new.up.sql", size: 635, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x65, 0x73, 0x96, 0x1d, 0xc8, 0x3e, 0xca, 0xf5, 0xdc, 0xe3, 0xac, 0x3f, 0x9c, 0xc3, 0x67, 0x12, 0x9c, 0x19, 0x1, 0x4, 0x2b, 0xea, 0x6b, 0xe1, 0x59, 0x59, 0x89, 0x3d, 0xef, 0x4a, 0x6e, 0xbe}} return a, nil } @@ -2066,7 +2067,7 @@ func _1687416607_add_communities_check_channel_permission_responses_tableUpSql() return nil, err } - info := bindataFileInfo{name: "1687416607_add_communities_check_channel_permission_responses_table.up.sql", size: 739, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1687416607_add_communities_check_channel_permission_responses_table.up.sql", size: 739, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc2, 0x6, 0x3, 0x1a, 0xde, 0x9d, 0xbc, 0x50, 0x9d, 0xf1, 0x6d, 0x5a, 0x1c, 0x28, 0x92, 0x19, 0x89, 0x76, 0x4e, 0x8b, 0x60, 0xa9, 0xf, 0xe9, 0x76, 0xf1, 0xee, 0x75, 0x92, 0xbd, 0xda, 0x72}} return a, nil } @@ -2086,7 +2087,7 @@ func _1687856939_add_community_tokens_decimalsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1687856939_add_community_tokens_decimals.up.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1687856939_add_community_tokens_decimals.up.sql", size: 65, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x59, 0x76, 0x42, 0x70, 0xc9, 0x7b, 0x16, 0xf6, 0xfe, 0x7, 0x1c, 0x99, 0xe5, 0x38, 0xfd, 0xa0, 0x3b, 0x93, 0x40, 0xbc, 0x66, 0xc2, 0xd1, 0xdd, 0xe9, 0xc7, 0xbf, 0xae, 0x36, 0xcc, 0x46, 0x57}} return a, nil } @@ -2106,7 +2107,7 @@ func _1687959987_modify_community_tokens_supply_as_stringUpSql() (*asset, error) return nil, err } - info := bindataFileInfo{name: "1687959987_modify_community_tokens_supply_as_string.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1687959987_modify_community_tokens_supply_as_string.up.sql", size: 77, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x57, 0x89, 0xbf, 0x9b, 0xed, 0x9b, 0x18, 0x3f, 0x84, 0xb5, 0x3c, 0x78, 0x40, 0x60, 0xea, 0x33, 0x26, 0x50, 0x3, 0xda, 0x28, 0x92, 0xd3, 0xb6, 0xff, 0x40, 0xa7, 0x19, 0x2, 0xa7, 0x17, 0xf9}} return a, nil } @@ -2126,7 +2127,7 @@ func _1689258900_add_airdrop_address_to_revealed_addressesUpSql() (*asset, error return nil, err } - info := bindataFileInfo{name: "1689258900_add_airdrop_address_to_revealed_addresses.up.sql", size: 99, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1689258900_add_airdrop_address_to_revealed_addresses.up.sql", size: 99, mode: os.FileMode(0664), modTime: time.Unix(1692114327, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0x7e, 0xaf, 0x5c, 0xd, 0xe5, 0x1e, 0x67, 0x1a, 0x6d, 0xd, 0x28, 0x20, 0x7a, 0x1a, 0x45, 0x6e, 0xba, 0x80, 0x91, 0xb0, 0xd6, 0xfd, 0xc2, 0xb9, 0x42, 0x5c, 0x8d, 0x6e, 0x3e, 0x6e, 0xb2}} return a, nil } @@ -2146,7 +2147,7 @@ func _1689266326_create_communities_events_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1689266326_create_communities_events_table.up.sql", size: 164, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1689266326_create_communities_events_table.up.sql", size: 164, mode: os.FileMode(0664), modTime: time.Unix(1692814344, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0x4e, 0xe, 0xba, 0x29, 0x16, 0x46, 0x38, 0x19, 0xa4, 0x5, 0x40, 0x46, 0xaf, 0x9a, 0x6, 0x89, 0xe0, 0x9c, 0xcc, 0xec, 0x8a, 0xb, 0x40, 0x85, 0x6f, 0xcc, 0x5, 0x24, 0x2a, 0x33, 0xfa}} return a, nil } @@ -2166,7 +2167,7 @@ func _1689931300_add_community_tokens_deployer_and_priv_levelUpSql() (*asset, er return nil, err } - info := bindataFileInfo{name: "1689931300_add_community_tokens_deployer_and_priv_level.up.sql", size: 156, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1689931300_add_community_tokens_deployer_and_priv_level.up.sql", size: 156, mode: os.FileMode(0664), modTime: time.Unix(1692814344, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3f, 0x24, 0xd9, 0x4d, 0xe, 0x4b, 0xe3, 0x4c, 0xd1, 0xc, 0x72, 0xd4, 0x99, 0xe4, 0xb9, 0xb8, 0xe9, 0x38, 0x9e, 0x11, 0x48, 0xea, 0xe3, 0x5d, 0xd9, 0xd0, 0xef, 0x96, 0x38, 0x5a, 0xd4, 0xa5}} return a, nil } @@ -2186,11 +2187,31 @@ func _1693311881_add_unfurled_links_to_message_editsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1693311881_add_unfurled_links_to_message_edits.up.sql", size: 64, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "1693311881_add_unfurled_links_to_message_edits.up.sql", size: 64, mode: os.FileMode(0664), modTime: time.Unix(1694098269, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6b, 0xc7, 0x7c, 0xe4, 0x80, 0x6f, 0xf8, 0x96, 0xb, 0x37, 0xff, 0xa2, 0xab, 0x1c, 0xbd, 0x25, 0x8d, 0x1e, 0x9a, 0x65, 0xe9, 0x45, 0xaf, 0x7f, 0x77, 0x84, 0x1b, 0x10, 0x1b, 0x1a, 0x5, 0xcc}} return a, nil } +var __1693311981_community_shardUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x72\xf4\x09\x71\x0d\x52\x08\x71\x74\xf2\x71\x55\x48\xce\xcf\xcd\x2d\xcd\xcb\x2c\xc9\x4c\x2d\x8e\x47\x62\x2b\x38\xba\xb8\x28\x38\xfb\xfb\x84\xfa\xfa\x29\x14\x67\x24\x16\xa5\xc4\x27\xe7\x94\x16\x97\xa4\x16\x29\x78\xfa\x85\x28\xb8\xb8\xba\x39\x86\xfa\x84\x28\xf8\x85\xfa\xf8\x58\x73\x91\x65\x5c\x66\x5e\x4a\x6a\x05\x16\xc3\x00\x01\x00\x00\xff\xff\xe7\x6c\xc4\x0e\x9c\x00\x00\x00") + +func _1693311981_community_shardUpSqlBytes() ([]byte, error) { + return bindataRead( + __1693311981_community_shardUpSql, + "1693311981_community_shard.up.sql", + ) +} + +func _1693311981_community_shardUpSql() (*asset, error) { + bytes, err := _1693311981_community_shardUpSqlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "1693311981_community_shard.up.sql", size: 156, mode: os.FileMode(0664), modTime: time.Unix(1694098617, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x12, 0xf9, 0xde, 0x49, 0x9f, 0x95, 0xaa, 0x22, 0x5e, 0x54, 0x5a, 0x1, 0xd, 0xc6, 0x1f, 0x42, 0x93, 0xe8, 0x69, 0x30, 0x11, 0x69, 0x41, 0x7f, 0x87, 0x57, 0x56, 0x2a, 0x32, 0xb9, 0x3e}} + return a, nil +} + var _readmeMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x54\x91\xc1\xce\xd3\x30\x10\x84\xef\x7e\x8a\x91\x7a\x01\xa9\x2a\x8f\xc0\x0d\x71\x82\x03\x48\x1c\xc9\x36\x9e\x36\x96\x1c\x6f\xf0\xae\x93\xe6\xed\x91\xa3\xc2\xdf\xff\x66\xed\xd8\x33\xdf\x78\x4f\xa7\x13\xbe\xea\x06\x57\x6c\x35\x39\x31\xa7\x7b\x15\x4f\x5a\xec\x73\x08\xbf\x08\x2d\x79\x7f\x4a\x43\x5b\x86\x17\xfd\x8c\x21\xea\x56\x5e\x47\x90\x4a\x14\x75\x48\xde\x64\x37\x2c\x6a\x96\xae\x99\x48\x05\xf6\x27\x77\x13\xad\x08\xae\x8a\x51\xe7\x25\xf3\xf1\xa9\x9f\xf9\x58\x58\x2c\xad\xbc\xe0\x8b\x56\xf0\x21\x5d\xeb\x4c\x95\xb3\xae\x84\x60\xd4\xdc\xe6\x82\x5d\x1b\x36\x6d\x39\x62\x92\xf5\xb8\x11\xdb\x92\xd3\x28\xce\xe0\x13\xe1\x72\xcd\x3c\x63\xd4\x65\x87\xae\xac\xe8\xc3\x28\x2e\x67\x44\x66\x3a\x21\x25\xa2\x72\xac\x14\x67\xbc\x84\x9f\x53\x32\x8c\x52\x70\x25\x56\xd6\xfd\x8d\x05\x37\xad\x30\x9d\x9f\xa6\x86\x0f\xcd\x58\x7f\xcf\x34\x93\x3b\xed\x90\x9f\xa4\x1f\xcf\x30\x85\x4d\x07\x58\xaf\x7f\x25\xc4\x9d\xf3\x72\x64\x84\xd0\x7f\xf9\x9b\x3a\x2d\x84\xef\x85\x48\x66\x8d\xd8\x88\x9b\x8c\x8c\x98\x5b\xf6\x74\x14\x4e\x33\x0d\xc9\xe0\x93\x38\xda\x12\xc5\x69\xbd\xe4\xf0\x2e\x7a\x78\x07\x1c\xfe\x13\x9f\x91\x29\x31\x95\x7b\x7f\x62\x59\x37\xb4\xe5\x5e\x25\xfe\x33\xee\xd5\x53\x71\xd6\xda\x3a\xd8\xcb\xde\x2e\xf8\xa1\x90\x55\x53\x0c\xc7\xaa\x0d\xe9\x76\x14\x29\x1c\x7b\x68\xdd\x2f\xe1\x6f\x00\x00\x00\xff\xff\x3c\x0a\xc2\xfe\x2a\x02\x00\x00") func readmeMdBytes() ([]byte, error) { @@ -2206,7 +2227,7 @@ func readmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1c, 0x6e, 0xfb, 0xcc, 0x81, 0x94, 0x4d, 0x8c, 0xa0, 0x3b, 0x5, 0xb0, 0x18, 0xd6, 0xbb, 0xb3, 0x79, 0xc8, 0x8f, 0xff, 0xc1, 0x10, 0xf9, 0xf, 0x20, 0x1b, 0x4a, 0x74, 0x96, 0x42, 0xd7, 0xa8}} return a, nil } @@ -2226,7 +2247,7 @@ func docGo() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0644), modTime: time.Unix(1694703775, 0)} + info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0664), modTime: time.Unix(1663713040, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0xcc, 0x41, 0xe1, 0x61, 0x12, 0x97, 0xe, 0x36, 0x8c, 0xa7, 0x9e, 0xe0, 0x6e, 0x59, 0x9e, 0xee, 0xd5, 0x4a, 0xcf, 0x1e, 0x60, 0xd6, 0xc3, 0x3a, 0xc9, 0x6c, 0xf2, 0x86, 0x5a, 0xb4, 0x1e}} return a, nil } @@ -2524,6 +2545,8 @@ var _bindata = map[string]func() (*asset, error){ "1693311881_add_unfurled_links_to_message_edits.up.sql": _1693311881_add_unfurled_links_to_message_editsUpSql, + "1693311981_community_shard.up.sql": _1693311981_community_shardUpSql, + "README.md": readmeMd, "doc.go": docGo, @@ -2671,8 +2694,9 @@ var _bintree = &bintree{nil, map[string]*bintree{ "1689266326_create_communities_events_table.up.sql": &bintree{_1689266326_create_communities_events_tableUpSql, map[string]*bintree{}}, "1689931300_add_community_tokens_deployer_and_priv_level.up.sql": &bintree{_1689931300_add_community_tokens_deployer_and_priv_levelUpSql, map[string]*bintree{}}, "1693311881_add_unfurled_links_to_message_edits.up.sql": &bintree{_1693311881_add_unfurled_links_to_message_editsUpSql, map[string]*bintree{}}, - "README.md": &bintree{readmeMd, map[string]*bintree{}}, - "doc.go": &bintree{docGo, map[string]*bintree{}}, + "1693311981_community_shard.up.sql": &bintree{_1693311981_community_shardUpSql, map[string]*bintree{}}, + "README.md": &bintree{readmeMd, map[string]*bintree{}}, + "doc.go": &bintree{docGo, map[string]*bintree{}}, }} // RestoreAsset restores an asset under the given directory. diff --git a/protocol/migrations/sqlite/1693311981_community_shard.up.sql b/protocol/migrations/sqlite/1693311981_community_shard.up.sql new file mode 100644 index 000000000..88d68c8c7 --- /dev/null +++ b/protocol/migrations/sqlite/1693311981_community_shard.up.sql @@ -0,0 +1,2 @@ +ALTER TABLE communities_communities ADD COLUMN shard_cluster INT DEFAULT NULL; +ALTER TABLE communities_communities ADD COLUMN shard_index INT DEFAULT NULL; diff --git a/protocol/protobuf/application_metadata_message.pb.go b/protocol/protobuf/application_metadata_message.pb.go index 4476d7994..c31d53452 100644 --- a/protocol/protobuf/application_metadata_message.pb.go +++ b/protocol/protobuf/application_metadata_message.pb.go @@ -95,6 +95,7 @@ const ( ApplicationMetadataMessage_SYNC_ACCOUNTS_POSITIONS ApplicationMetadataMessage_Type = 70 ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE_REJECTED ApplicationMetadataMessage_Type = 71 ApplicationMetadataMessage_COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE ApplicationMetadataMessage_Type = 72 + ApplicationMetadataMessage_COMMUNITY_SHARD_KEY ApplicationMetadataMessage_Type = 73 ) var ApplicationMetadataMessage_Type_name = map[int32]string{ @@ -170,6 +171,7 @@ var ApplicationMetadataMessage_Type_name = map[int32]string{ 70: "SYNC_ACCOUNTS_POSITIONS", 71: "COMMUNITY_EVENTS_MESSAGE_REJECTED", 72: "COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE", + 73: "COMMUNITY_SHARD_KEY", } var ApplicationMetadataMessage_Type_value = map[string]int32{ @@ -245,6 +247,7 @@ var ApplicationMetadataMessage_Type_value = map[string]int32{ "SYNC_ACCOUNTS_POSITIONS": 70, "COMMUNITY_EVENTS_MESSAGE_REJECTED": 71, "COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE": 72, + "COMMUNITY_SHARD_KEY": 73, } func (x ApplicationMetadataMessage_Type) String() string { @@ -323,72 +326,73 @@ func init() { } var fileDescriptor_ad09a6406fcf24c7 = []byte{ - // 1066 bytes of a gzipped FileDescriptorProto + // 1077 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x56, 0x5b, 0x53, 0x1b, 0x37, 0x14, 0x2e, 0x84, 0x02, 0x11, 0x97, 0x08, 0x85, 0x8b, 0x01, 0x73, 0x73, 0x08, 0x21, 0x49, 0xeb, 0xb4, 0xa4, 0xed, 0xb4, 0x4d, 0xd3, 0x56, 0x96, 0x0e, 0xb6, 0xf0, 0xae, 0xb4, 0x91, 0xb4, 0xee, - 0x38, 0x2f, 0x1a, 0xa7, 0x71, 0x33, 0xcc, 0x24, 0xc1, 0x13, 0x9c, 0x07, 0xde, 0xfa, 0x7b, 0xfb, - 0x2b, 0x3a, 0xda, 0xab, 0x01, 0x13, 0x9e, 0x60, 0x75, 0x3e, 0x1d, 0xe9, 0x7c, 0xe7, 0x3b, 0x9f, + 0x38, 0x2f, 0x1a, 0xa7, 0x71, 0x33, 0xcc, 0x24, 0xc1, 0x13, 0x9c, 0x07, 0x9e, 0xfb, 0x2b, 0xfa, + 0x6f, 0x3b, 0xda, 0xab, 0x01, 0x13, 0x9e, 0x60, 0x75, 0x3e, 0x1d, 0xe9, 0x7c, 0xe7, 0x3b, 0x9f, 0x8c, 0x6a, 0xbd, 0xc1, 0xe0, 0xfd, 0xe9, 0xdf, 0xbd, 0xe1, 0xe9, 0xd9, 0x47, 0xf7, 0xa1, 0x3f, 0xec, 0xbd, 0xed, 0x0d, 0x7b, 0xee, 0x43, 0xff, 0xfc, 0xbc, 0xf7, 0xae, 0x5f, 0x1f, 0x7c, 0x3a, - 0x1b, 0x9e, 0x91, 0xd9, 0xe4, 0xcf, 0x9b, 0xcf, 0xff, 0xd4, 0xfe, 0x25, 0x68, 0x83, 0x96, 0x1b, + 0x1b, 0x9e, 0x91, 0xd9, 0xe4, 0xcf, 0x9b, 0xcf, 0xff, 0xd4, 0xfe, 0x23, 0x68, 0x83, 0x96, 0x1b, 0xc2, 0x0c, 0x1f, 0xa6, 0x70, 0x52, 0x45, 0x77, 0xcf, 0x4f, 0xdf, 0x7d, 0xec, 0x0d, 0x3f, 0x7f, 0xea, 0x57, 0x26, 0x76, 0x27, 0x0e, 0xe7, 0x75, 0xb9, 0x40, 0x2a, 0x68, 0x66, 0xd0, 0xbb, 0x78, 0x7f, 0xd6, 0x7b, 0x5b, 0x99, 0x4c, 0x62, 0xf9, 0x27, 0x79, 0x89, 0xa6, 0x86, 0x17, 0x83, 0x7e, 0xe5, 0xce, 0xee, 0xc4, 0xe1, 0xe2, 0xd1, 0xe3, 0x7a, 0x7e, 0x5e, 0xfd, 0xe6, 0xb3, 0xea, 0xf6, - 0x62, 0xd0, 0xd7, 0xc9, 0xb6, 0xda, 0x7f, 0x18, 0x4d, 0xf9, 0x4f, 0x32, 0x87, 0x66, 0x62, 0xd9, - 0x96, 0xea, 0x2f, 0x89, 0xbf, 0x22, 0x18, 0xcd, 0xb3, 0x16, 0xb5, 0x2e, 0x04, 0x63, 0x68, 0x13, - 0xf0, 0x04, 0x21, 0x68, 0x91, 0x29, 0x69, 0x29, 0xb3, 0x2e, 0x8e, 0x38, 0xb5, 0x80, 0x27, 0xc9, - 0x16, 0x5a, 0x0f, 0x21, 0x6c, 0x80, 0x36, 0x2d, 0x11, 0x65, 0xcb, 0xc5, 0x96, 0x3b, 0x64, 0x03, - 0xad, 0x9a, 0xae, 0x64, 0x2e, 0xa2, 0x42, 0x3b, 0x21, 0x8d, 0xa5, 0x41, 0x40, 0xad, 0x50, 0x12, - 0x4f, 0x91, 0x7d, 0x54, 0xe5, 0x10, 0x69, 0x60, 0xd4, 0x02, 0x77, 0x09, 0xec, 0x12, 0xe2, 0xeb, - 0x8d, 0xc9, 0xd9, 0x09, 0xf2, 0x00, 0xed, 0x68, 0x78, 0x15, 0x83, 0xb1, 0x8e, 0x72, 0xae, 0xc1, - 0x18, 0x77, 0xac, 0xb4, 0xb3, 0x9a, 0x4a, 0x43, 0x59, 0x02, 0x9c, 0x26, 0x4f, 0xd0, 0x01, 0x65, - 0x0c, 0x22, 0xeb, 0x6e, 0xc3, 0xce, 0x90, 0xa7, 0xe8, 0x11, 0x07, 0x16, 0x08, 0x09, 0xb7, 0x82, - 0x67, 0xc9, 0x1a, 0xba, 0x9f, 0x83, 0x46, 0x03, 0x77, 0xc9, 0x32, 0xc2, 0x06, 0x24, 0xbf, 0xb4, - 0x8a, 0xc8, 0x0e, 0xda, 0xbc, 0x9a, 0x7b, 0x14, 0x30, 0x47, 0x76, 0x51, 0xf5, 0x5a, 0xa1, 0x2e, - 0x27, 0xb5, 0x73, 0x84, 0xe7, 0x3d, 0xa1, 0xd7, 0x11, 0x94, 0x31, 0x15, 0x4b, 0x8b, 0x17, 0xc8, - 0x1e, 0xda, 0xba, 0x1e, 0x8e, 0xe2, 0x46, 0x20, 0x98, 0xf3, 0xed, 0xc2, 0x8b, 0x64, 0x1b, 0x6d, - 0xe4, 0x19, 0x99, 0xe2, 0xe0, 0x28, 0xef, 0x80, 0xb6, 0xc2, 0x40, 0x08, 0xd2, 0xe2, 0x7b, 0xa4, - 0x86, 0xb6, 0xa3, 0xd8, 0xb4, 0x9c, 0x54, 0x56, 0x1c, 0x0b, 0x96, 0xa6, 0xd0, 0xd0, 0x14, 0xc6, - 0xea, 0x94, 0x79, 0xec, 0x49, 0xfa, 0x32, 0xc6, 0x69, 0x30, 0x91, 0x92, 0x06, 0xf0, 0x12, 0xd9, - 0x44, 0x6b, 0xd7, 0xc1, 0xaf, 0x62, 0xd0, 0x5d, 0x4c, 0xc8, 0x3e, 0xda, 0xbd, 0x21, 0x58, 0xa6, - 0xb8, 0xef, 0xab, 0x1e, 0x77, 0x5e, 0x42, 0x21, 0x5e, 0xf6, 0x25, 0x8d, 0x0b, 0x67, 0xdb, 0x57, - 0xbc, 0x32, 0x21, 0x54, 0x27, 0xc2, 0x69, 0xc8, 0xa8, 0x5e, 0x25, 0xeb, 0x68, 0xa5, 0xa9, 0x55, - 0x1c, 0x25, 0xb4, 0x38, 0x21, 0x3b, 0xc2, 0xa6, 0xd5, 0xad, 0x91, 0x25, 0xb4, 0x90, 0x2e, 0x72, - 0x90, 0x56, 0xd8, 0x2e, 0xae, 0x78, 0x34, 0x53, 0x61, 0x18, 0x4b, 0x61, 0xbb, 0x8e, 0x83, 0x61, - 0x5a, 0x44, 0x09, 0x7a, 0x9d, 0x54, 0xd1, 0x72, 0x19, 0x1a, 0xc9, 0xb3, 0x91, 0xe8, 0x73, 0x0b, - 0xad, 0x97, 0xd1, 0xa2, 0xe9, 0xca, 0x9d, 0x28, 0x21, 0xf1, 0x26, 0xb9, 0x87, 0xe6, 0x22, 0x21, - 0x8b, 0x89, 0xa8, 0xfa, 0xb1, 0x02, 0x2e, 0xca, 0xb1, 0xda, 0xf2, 0xb7, 0x31, 0x96, 0xda, 0xd8, - 0xe4, 0x53, 0xb5, 0xed, 0xeb, 0xe1, 0x10, 0xc0, 0xc8, 0x28, 0xed, 0x78, 0x6d, 0x8d, 0x93, 0x4e, - 0x76, 0x34, 0xde, 0xf5, 0xb3, 0x46, 0xa5, 0x92, 0xdd, 0x50, 0xc5, 0xc6, 0x85, 0x60, 0xb5, 0x60, - 0xae, 0x41, 0x2d, 0x6b, 0xe1, 0x3d, 0xb2, 0x82, 0x96, 0x92, 0xcd, 0x49, 0xd9, 0x1a, 0x42, 0xd5, - 0x01, 0x8e, 0x6b, 0xbe, 0x73, 0xe5, 0x72, 0x76, 0x94, 0xf1, 0x24, 0x72, 0xfc, 0x80, 0x20, 0x34, - 0xdd, 0xa0, 0xac, 0x1d, 0x47, 0x78, 0xbf, 0x50, 0xa5, 0x67, 0xb7, 0xe3, 0x2b, 0x65, 0x20, 0x2d, - 0xe8, 0x14, 0xfa, 0xb0, 0x50, 0xe5, 0xd5, 0x70, 0x3a, 0x94, 0xc0, 0xf1, 0x81, 0x57, 0xdd, 0x58, - 0x08, 0x17, 0x26, 0x14, 0xc6, 0x00, 0xc7, 0x8f, 0x12, 0x26, 0x3c, 0xa6, 0xa1, 0x54, 0x3b, 0xa4, - 0xba, 0x8d, 0x0f, 0xc9, 0x2a, 0x22, 0xe9, 0x0d, 0x03, 0xa0, 0xda, 0xb5, 0x84, 0xb1, 0x4a, 0x77, - 0xf1, 0x63, 0x4f, 0x63, 0xb2, 0x6e, 0xc0, 0x5a, 0x21, 0x9b, 0xf8, 0x09, 0x39, 0x44, 0xfb, 0x65, - 0x23, 0xb2, 0x5a, 0x1c, 0xd5, 0xac, 0x25, 0x3a, 0xe0, 0x42, 0xda, 0x94, 0x60, 0x03, 0x21, 0xdb, - 0xf8, 0xa9, 0xef, 0x75, 0x6a, 0x4a, 0x5a, 0x1d, 0x8b, 0x00, 0x5c, 0x24, 0x98, 0x8d, 0x35, 0x18, - 0xfc, 0x4d, 0x91, 0x36, 0x1f, 0xb8, 0x6f, 0x13, 0x56, 0x53, 0x6b, 0xc9, 0x87, 0x2a, 0x97, 0x65, - 0xdd, 0xd3, 0xa7, 0xc1, 0xea, 0x74, 0xd2, 0x2e, 0x07, 0x9f, 0x91, 0x03, 0x54, 0xbb, 0x51, 0x18, - 0xa5, 0x76, 0xbf, 0x2b, 0x7b, 0x50, 0x80, 0xb3, 0x9a, 0x0c, 0xfe, 0xde, 0xfb, 0x45, 0xbe, 0xb5, - 0x70, 0x09, 0xd0, 0xc5, 0x0c, 0xe0, 0x23, 0x2f, 0x8b, 0x2b, 0xf7, 0xbb, 0x04, 0x78, 0xee, 0x53, - 0xe4, 0x9e, 0x34, 0x16, 0xf1, 0x43, 0x21, 0x0e, 0xab, 0x63, 0xe3, 0xad, 0x38, 0x36, 0xa0, 0xf1, - 0x8f, 0x45, 0xcf, 0x47, 0xd1, 0x45, 0x7d, 0x3f, 0x15, 0x3d, 0xbf, 0x52, 0xb9, 0xe3, 0xc0, 0x84, - 0xf1, 0x89, 0x7f, 0x4e, 0x9d, 0x68, 0x0c, 0x05, 0x01, 0xd0, 0x0e, 0xe0, 0x5f, 0x7c, 0x3c, 0x49, - 0x91, 0x69, 0xdd, 0xdb, 0x6f, 0x58, 0x4a, 0xfe, 0xd7, 0xa2, 0xf9, 0x86, 0x76, 0x80, 0xe7, 0x2e, - 0x8d, 0x5f, 0x78, 0x4f, 0x29, 0xf3, 0x32, 0x2a, 0x19, 0x04, 0xd7, 0x46, 0xef, 0x37, 0xcf, 0x4c, - 0x16, 0x1b, 0x5b, 0xf7, 0xcb, 0xa2, 0xd9, 0x6d, 0xe8, 0xfa, 0xf7, 0x09, 0xff, 0x5e, 0x30, 0x61, - 0x14, 0x13, 0x34, 0x70, 0x5e, 0x2f, 0x06, 0xff, 0x41, 0xaa, 0xa8, 0x92, 0x2c, 0x83, 0x34, 0x09, - 0x39, 0x92, 0x86, 0xe0, 0x38, 0x58, 0x2a, 0x02, 0xfc, 0xa7, 0x6f, 0xf4, 0x58, 0x65, 0x8f, 0x9a, - 0x95, 0xc1, 0xd4, 0x7b, 0xea, 0xad, 0x38, 0xe7, 0x9d, 0x00, 0x70, 0xc3, 0x1f, 0x59, 0x96, 0x08, - 0x1d, 0x90, 0xd6, 0x14, 0xc4, 0x30, 0xff, 0x28, 0x8e, 0x44, 0xbd, 0x9d, 0x98, 0x16, 0xd5, 0x25, - 0x47, 0x60, 0x30, 0xf7, 0x2c, 0x8d, 0x6a, 0xd9, 0xb1, 0xd8, 0x58, 0x15, 0x8a, 0xd7, 0xb9, 0x73, - 0x04, 0x4a, 0x63, 0x28, 0xe4, 0x97, 0xa1, 0x8c, 0x8b, 0x94, 0x11, 0xe9, 0x95, 0x8f, 0xc9, 0x43, - 0xb4, 0x77, 0xd3, 0x2d, 0x9c, 0x86, 0x13, 0x60, 0x7e, 0xb6, 0x9b, 0xfe, 0xf9, 0x2d, 0x61, 0x91, - 0x16, 0x1d, 0x11, 0x40, 0x33, 0x13, 0x52, 0xfa, 0xb0, 0xe7, 0x57, 0x6f, 0x35, 0x16, 0x5e, 0xcf, - 0xd5, 0x9f, 0xbd, 0xc8, 0x7f, 0xa1, 0xbc, 0x99, 0x4e, 0xfe, 0x7b, 0xfe, 0x7f, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xec, 0x56, 0x69, 0xd7, 0x48, 0x09, 0x00, 0x00, + 0x62, 0xd0, 0xd7, 0xc9, 0xb6, 0xda, 0xbf, 0x4b, 0x68, 0xca, 0x7f, 0x92, 0x39, 0x34, 0x13, 0xcb, + 0xb6, 0x54, 0x7f, 0x49, 0xfc, 0x15, 0xc1, 0x68, 0x9e, 0xb5, 0xa8, 0x75, 0x21, 0x18, 0x43, 0x9b, + 0x80, 0x27, 0x08, 0x41, 0x8b, 0x4c, 0x49, 0x4b, 0x99, 0x75, 0x71, 0xc4, 0xa9, 0x05, 0x3c, 0x49, + 0xb6, 0xd0, 0x7a, 0x08, 0x61, 0x03, 0xb4, 0x69, 0x89, 0x28, 0x5b, 0x2e, 0xb6, 0xdc, 0x21, 0x1b, + 0x68, 0xd5, 0x74, 0x25, 0x73, 0x11, 0x15, 0xda, 0x09, 0x69, 0x2c, 0x0d, 0x02, 0x6a, 0x85, 0x92, + 0x78, 0x8a, 0xec, 0xa3, 0x2a, 0x87, 0x48, 0x03, 0xa3, 0x16, 0xb8, 0x4b, 0x60, 0x97, 0x10, 0x5f, + 0x6f, 0x4c, 0xce, 0x4e, 0x90, 0x07, 0x68, 0x47, 0xc3, 0xab, 0x18, 0x8c, 0x75, 0x94, 0x73, 0x0d, + 0xc6, 0xb8, 0x63, 0xa5, 0x9d, 0xd5, 0x54, 0x1a, 0xca, 0x12, 0xe0, 0x34, 0x79, 0x82, 0x0e, 0x28, + 0x63, 0x10, 0x59, 0x77, 0x1b, 0x76, 0x86, 0x3c, 0x45, 0x8f, 0x38, 0xb0, 0x40, 0x48, 0xb8, 0x15, + 0x3c, 0x4b, 0xd6, 0xd0, 0xfd, 0x1c, 0x34, 0x1a, 0xb8, 0x4b, 0x96, 0x11, 0x36, 0x20, 0xf9, 0xa5, + 0x55, 0x44, 0x76, 0xd0, 0xe6, 0xd5, 0xdc, 0xa3, 0x80, 0x39, 0xb2, 0x8b, 0xaa, 0xd7, 0x0a, 0x75, + 0x39, 0xa9, 0x9d, 0x23, 0x3c, 0xef, 0x09, 0xbd, 0x8e, 0xa0, 0x8c, 0xa9, 0x58, 0x5a, 0xbc, 0x40, + 0xf6, 0xd0, 0xd6, 0xf5, 0x70, 0x14, 0x37, 0x02, 0xc1, 0x9c, 0x6f, 0x17, 0x5e, 0x24, 0xdb, 0x68, + 0x23, 0xcf, 0xc8, 0x14, 0x07, 0x47, 0x79, 0x07, 0xb4, 0x15, 0x06, 0x42, 0x90, 0x16, 0xdf, 0x23, + 0x35, 0xb4, 0x1d, 0xc5, 0xa6, 0xe5, 0xa4, 0xb2, 0xe2, 0x58, 0xb0, 0x34, 0x85, 0x86, 0xa6, 0x30, + 0x56, 0xa7, 0xcc, 0x63, 0x4f, 0xd2, 0x97, 0x31, 0x4e, 0x83, 0x89, 0x94, 0x34, 0x80, 0x97, 0xc8, + 0x26, 0x5a, 0xbb, 0x0e, 0x7e, 0x15, 0x83, 0xee, 0x62, 0x42, 0xf6, 0xd1, 0xee, 0x0d, 0xc1, 0x32, + 0xc5, 0x7d, 0x5f, 0xf5, 0xb8, 0xf3, 0x12, 0x0a, 0xf1, 0xb2, 0x2f, 0x69, 0x5c, 0x38, 0xdb, 0xbe, + 0xe2, 0x95, 0x09, 0xa1, 0x3a, 0x11, 0x4e, 0x43, 0x46, 0xf5, 0x2a, 0x59, 0x47, 0x2b, 0x4d, 0xad, + 0xe2, 0x28, 0xa1, 0xc5, 0x09, 0xd9, 0x11, 0x36, 0xad, 0x6e, 0x8d, 0x2c, 0xa1, 0x85, 0x74, 0x91, + 0x83, 0xb4, 0xc2, 0x76, 0x71, 0xc5, 0xa3, 0x99, 0x0a, 0xc3, 0x58, 0x0a, 0xdb, 0x75, 0x1c, 0x0c, + 0xd3, 0x22, 0x4a, 0xd0, 0xeb, 0xa4, 0x8a, 0x96, 0xcb, 0xd0, 0x48, 0x9e, 0x8d, 0x44, 0x9f, 0x5b, + 0x68, 0xbd, 0x8c, 0x16, 0x4d, 0x57, 0xee, 0x44, 0x09, 0x89, 0x37, 0xc9, 0x3d, 0x34, 0x17, 0x09, + 0x59, 0x4c, 0x44, 0xd5, 0x8f, 0x15, 0x70, 0x51, 0x8e, 0xd5, 0x96, 0xbf, 0x8d, 0xb1, 0xd4, 0xc6, + 0x26, 0x9f, 0xaa, 0x6d, 0x5f, 0x0f, 0x87, 0x00, 0x46, 0x46, 0x69, 0xc7, 0x6b, 0x6b, 0x9c, 0x74, + 0xb2, 0xa3, 0xf1, 0xae, 0x9f, 0x35, 0x2a, 0x95, 0xec, 0x86, 0x2a, 0x36, 0x2e, 0x04, 0xab, 0x05, + 0x73, 0x0d, 0x6a, 0x59, 0x0b, 0xef, 0x91, 0x15, 0xb4, 0x94, 0x6c, 0x4e, 0xca, 0xd6, 0x10, 0xaa, + 0x0e, 0x70, 0x5c, 0xf3, 0x9d, 0x2b, 0x97, 0xb3, 0xa3, 0x8c, 0x27, 0x91, 0xe3, 0x07, 0x04, 0xa1, + 0xe9, 0x06, 0x65, 0xed, 0x38, 0xc2, 0xfb, 0x85, 0x2a, 0x3d, 0xbb, 0x1d, 0x5f, 0x29, 0x03, 0x69, + 0x41, 0xa7, 0xd0, 0x87, 0x85, 0x2a, 0xaf, 0x86, 0xd3, 0xa1, 0x04, 0x8e, 0x0f, 0xbc, 0xea, 0xc6, + 0x42, 0xb8, 0x30, 0xa1, 0x30, 0x06, 0x38, 0x7e, 0x94, 0x30, 0xe1, 0x31, 0x0d, 0xa5, 0xda, 0x21, + 0xd5, 0x6d, 0x7c, 0x48, 0x56, 0x11, 0x49, 0x6f, 0x18, 0x00, 0xd5, 0xae, 0x25, 0x8c, 0x55, 0xba, + 0x8b, 0x1f, 0x7b, 0x1a, 0x93, 0x75, 0x03, 0xd6, 0x0a, 0xd9, 0xc4, 0x4f, 0xc8, 0x21, 0xda, 0x2f, + 0x1b, 0x91, 0xd5, 0xe2, 0xa8, 0x66, 0x2d, 0xd1, 0x01, 0x17, 0xd2, 0xa6, 0x04, 0x1b, 0x08, 0xd9, + 0xc6, 0x4f, 0x7d, 0xaf, 0x53, 0x53, 0xd2, 0xea, 0x58, 0x04, 0xe0, 0x22, 0xc1, 0x6c, 0xac, 0xc1, + 0xe0, 0x6f, 0x8a, 0xb4, 0xf9, 0xc0, 0x7d, 0x9b, 0xb0, 0x9a, 0x5a, 0x4b, 0x3e, 0x54, 0xb9, 0x2c, + 0xeb, 0x9e, 0x3e, 0x0d, 0x56, 0xa7, 0x93, 0x76, 0x39, 0xf8, 0x8c, 0x1c, 0xa0, 0xda, 0x8d, 0xc2, + 0x28, 0xb5, 0xfb, 0x5d, 0xd9, 0x83, 0x02, 0x9c, 0xd5, 0x64, 0xf0, 0xf7, 0xde, 0x2f, 0xf2, 0xad, + 0x85, 0x4b, 0x80, 0x2e, 0x66, 0x00, 0x1f, 0x79, 0x59, 0x5c, 0xb9, 0xdf, 0x25, 0xc0, 0x73, 0x9f, + 0x22, 0xf7, 0xa4, 0xb1, 0x88, 0x1f, 0x0a, 0x71, 0x58, 0x1d, 0x1b, 0x6f, 0xc5, 0xb1, 0x01, 0x8d, + 0x7f, 0x2c, 0x7a, 0x3e, 0x8a, 0x2e, 0xea, 0xfb, 0xa9, 0xe8, 0xf9, 0x95, 0xca, 0x1d, 0x07, 0x26, + 0x8c, 0x4f, 0xfc, 0x73, 0xea, 0x44, 0x63, 0x28, 0x08, 0x80, 0x76, 0x00, 0xff, 0xe2, 0xe3, 0x49, + 0x8a, 0x4c, 0xeb, 0xde, 0x7e, 0xc3, 0x52, 0xf2, 0xbf, 0x16, 0xcd, 0x37, 0xb4, 0x03, 0x3c, 0x77, + 0x69, 0xfc, 0xc2, 0x7b, 0x4a, 0x99, 0x97, 0x51, 0xc9, 0x20, 0xb8, 0x36, 0x7a, 0xbf, 0x79, 0x66, + 0xb2, 0xd8, 0xd8, 0xba, 0x5f, 0x16, 0xcd, 0x6e, 0x43, 0xd7, 0xbf, 0x4f, 0xf8, 0xf7, 0x82, 0x09, + 0xa3, 0x98, 0xa0, 0x81, 0xf3, 0x7a, 0x31, 0xf8, 0x0f, 0x52, 0x45, 0x95, 0x64, 0x19, 0xa4, 0x49, + 0xc8, 0x91, 0x34, 0x04, 0xc7, 0xc1, 0x52, 0x11, 0xe0, 0x3f, 0x7d, 0xa3, 0xc7, 0x2a, 0x7b, 0xd4, + 0xac, 0x0c, 0xa6, 0xde, 0x53, 0x6f, 0xc5, 0x39, 0xef, 0x04, 0x80, 0x1b, 0xfe, 0xc8, 0xb2, 0x44, + 0xe8, 0x80, 0xb4, 0xa6, 0x20, 0x86, 0xf9, 0x47, 0x71, 0x24, 0xea, 0xed, 0xc4, 0xb4, 0xa8, 0x2e, + 0x39, 0x02, 0x83, 0xb9, 0x67, 0x69, 0x54, 0xcb, 0x8e, 0xc5, 0xc6, 0xaa, 0x50, 0xbc, 0xce, 0x9d, + 0x23, 0x50, 0x1a, 0x43, 0x21, 0xbf, 0x0c, 0x65, 0x5c, 0xa4, 0x8c, 0x48, 0xaf, 0x7c, 0x4c, 0x1e, + 0xa2, 0xbd, 0x9b, 0x6e, 0xe1, 0x34, 0x9c, 0x00, 0xf3, 0xb3, 0xdd, 0xf4, 0xcf, 0x6f, 0x09, 0x8b, + 0xb4, 0xe8, 0x88, 0x00, 0x9a, 0x99, 0x90, 0xd2, 0x87, 0x3d, 0xbf, 0x7a, 0xcb, 0xbf, 0xa8, 0x23, + 0x4a, 0x6f, 0x51, 0xcd, 0x3d, 0xff, 0x58, 0x34, 0x16, 0x5e, 0xcf, 0xd5, 0x9f, 0xbd, 0xc8, 0x7f, + 0xba, 0xbc, 0x99, 0x4e, 0xfe, 0x7b, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0xc9, 0x3a, + 0x61, 0x61, 0x09, 0x00, 0x00, } diff --git a/protocol/protobuf/application_metadata_message.proto b/protocol/protobuf/application_metadata_message.proto index 68ad324ee..a5ab58963 100644 --- a/protocol/protobuf/application_metadata_message.proto +++ b/protocol/protobuf/application_metadata_message.proto @@ -85,5 +85,6 @@ message ApplicationMetadataMessage { SYNC_ACCOUNTS_POSITIONS = 70; COMMUNITY_EVENTS_MESSAGE_REJECTED = 71; COMMUNITY_PRIVILEGED_USER_SYNC_MESSAGE = 72; + COMMUNITY_SHARD_KEY = 73; } } diff --git a/protocol/protobuf/chat_message.pb.go b/protocol/protobuf/chat_message.pb.go index 8adb9e8c2..864dc674a 100644 --- a/protocol/protobuf/chat_message.pb.go +++ b/protocol/protobuf/chat_message.pb.go @@ -1018,6 +1018,7 @@ type ChatMessage struct { DisplayName string `protobuf:"bytes,14,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` ContactRequestPropagatedState *ContactRequestPropagatedState `protobuf:"bytes,15,opt,name=contact_request_propagated_state,json=contactRequestPropagatedState,proto3" json:"contact_request_propagated_state,omitempty"` UnfurledLinks []*UnfurledLink `protobuf:"bytes,16,rep,name=unfurled_links,json=unfurledLinks,proto3" json:"unfurled_links,omitempty"` + Shard *Shard `protobuf:"bytes,17,opt,name=shard,proto3" json:"shard,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1208,6 +1209,13 @@ func (m *ChatMessage) GetUnfurledLinks() []*UnfurledLink { return nil } +func (m *ChatMessage) GetShard() *Shard { + if m != nil { + return m.Shard + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*ChatMessage) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -1242,99 +1250,101 @@ func init() { } var fileDescriptor_263952f55fd35689 = []byte{ - // 1497 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcd, 0x6e, 0xdb, 0xc6, - 0x13, 0xb7, 0xbe, 0xc5, 0xd1, 0x87, 0x99, 0x8d, 0xe3, 0x30, 0x41, 0x1c, 0x2b, 0xfa, 0x07, 0x88, - 0xff, 0x68, 0xa1, 0x02, 0x49, 0x5a, 0x04, 0x28, 0x8a, 0x82, 0x96, 0x18, 0x9b, 0x8d, 0xf5, 0x51, - 0x8a, 0x72, 0xea, 0x5e, 0x08, 0x9a, 0x5c, 0x5b, 0x84, 0x29, 0x52, 0x25, 0x57, 0x6d, 0xd5, 0x97, - 0xea, 0xad, 0xa7, 0x1e, 0x7b, 0xe8, 0xa1, 0xd7, 0x1e, 0xfa, 0x02, 0x7d, 0x82, 0x3e, 0x40, 0xb1, - 0xbb, 0xfc, 0x54, 0x6d, 0xa7, 0xcd, 0x45, 0xda, 0x99, 0x9d, 0x59, 0xce, 0xfc, 0x76, 0x76, 0x7e, - 0x03, 0xc8, 0x9a, 0x9b, 0xc4, 0x58, 0xe0, 0x30, 0x34, 0x2f, 0x71, 0x6f, 0x19, 0xf8, 0xc4, 0x47, - 0x75, 0xf6, 0x77, 0xbe, 0xba, 0x78, 0xd8, 0xc0, 0xde, 0x6a, 0x11, 0x72, 0xf5, 0xc3, 0x96, 0xe5, - 0x7b, 0xc4, 0xb4, 0x08, 0x17, 0xbb, 0xaf, 0xa0, 0x3d, 0x25, 0x8e, 0x75, 0x85, 0x83, 0x21, 0xf7, - 0x46, 0x08, 0xca, 0x73, 0x33, 0x9c, 0x4b, 0x85, 0x4e, 0xe1, 0x40, 0xd0, 0xd8, 0x9a, 0xea, 0x96, - 0xa6, 0x75, 0x25, 0x15, 0x3b, 0x85, 0x83, 0x8a, 0xc6, 0xd6, 0xdd, 0x5f, 0x0b, 0xd0, 0x54, 0x17, - 0xe6, 0x25, 0x8e, 0x1d, 0x25, 0xa8, 0x2d, 0xcd, 0xb5, 0xeb, 0x9b, 0x36, 0xf3, 0x6d, 0x6a, 0xb1, - 0x88, 0x9e, 0x41, 0x99, 0xac, 0x97, 0x98, 0xb9, 0xb7, 0x9f, 0xdf, 0xed, 0xc5, 0x91, 0xf5, 0x98, - 0xbf, 0xbe, 0x5e, 0x62, 0x8d, 0x19, 0xa0, 0x07, 0x50, 0x37, 0xdd, 0xf3, 0xd5, 0xc2, 0x70, 0x6c, - 0xa9, 0xc4, 0xbe, 0x5f, 0x63, 0xb2, 0x6a, 0xa3, 0x1d, 0xa8, 0x7c, 0xe7, 0xd8, 0x64, 0x2e, 0x95, - 0x3b, 0x85, 0x83, 0x96, 0xc6, 0x05, 0xb4, 0x0b, 0xd5, 0x39, 0x76, 0x2e, 0xe7, 0x44, 0xaa, 0x30, - 0x75, 0x24, 0xa1, 0x0f, 0x01, 0x45, 0x07, 0xd1, 0x2f, 0x84, 0x86, 0xe5, 0xaf, 0x3c, 0x22, 0x55, - 0x99, 0x8d, 0xc8, 0x8f, 0x64, 0x1b, 0x7d, 0xaa, 0xef, 0xfe, 0x54, 0x80, 0xa6, 0xbc, 0xb2, 0x1d, - 0xff, 0xdd, 0xa9, 0xbc, 0xcc, 0xa5, 0xd2, 0x49, 0x53, 0xc9, 0xfa, 0x73, 0x21, 0x93, 0xd7, 0x3e, - 0x34, 0xec, 0x55, 0x60, 0x12, 0xc7, 0xf7, 0x8c, 0x45, 0xc8, 0x52, 0x2b, 0x6b, 0x10, 0xab, 0x86, - 0x61, 0xf7, 0x63, 0x10, 0x12, 0x1f, 0xb4, 0x0b, 0x68, 0x36, 0x7a, 0x33, 0x1a, 0xbf, 0x1d, 0x19, - 0xf2, 0x6c, 0xa0, 0x8e, 0x0d, 0xfd, 0x6c, 0xa2, 0x88, 0x5b, 0xa8, 0x06, 0x25, 0x59, 0xee, 0x8b, - 0x05, 0xb6, 0x18, 0x6a, 0x62, 0xb1, 0xfb, 0x4b, 0x11, 0x1a, 0x8a, 0xed, 0x90, 0x38, 0xee, 0x1d, - 0xa8, 0x58, 0xae, 0x6f, 0x5d, 0xb1, 0xa8, 0xcb, 0x1a, 0x17, 0xe8, 0xed, 0x11, 0xfc, 0x3d, 0x61, - 0x31, 0x0b, 0x1a, 0x5b, 0xa3, 0xfb, 0x50, 0x63, 0x35, 0x93, 0x00, 0x5d, 0xa5, 0xa2, 0x6a, 0xa3, - 0x3d, 0x80, 0xa8, 0x8e, 0xe8, 0x5e, 0x99, 0xed, 0x09, 0x91, 0x86, 0x5f, 0xc3, 0x65, 0x60, 0x7a, - 0x1c, 0xef, 0xa6, 0xc6, 0x05, 0xf4, 0x0a, 0x9a, 0xb1, 0x13, 0x43, 0xa7, 0xca, 0xd0, 0xb9, 0x97, - 0xa2, 0x13, 0x05, 0xc8, 0x20, 0x69, 0x2c, 0x52, 0x01, 0x0d, 0xa0, 0x49, 0x0b, 0x12, 0x7b, 0x84, - 0x7b, 0xd6, 0x98, 0xe7, 0x93, 0xd4, 0xb3, 0x3f, 0x37, 0xe3, 0xf4, 0x7a, 0x7d, 0x6e, 0xc9, 0x4f, - 0xb1, 0x52, 0x01, 0x7d, 0x06, 0xed, 0x95, 0x77, 0xb1, 0x0a, 0x5c, 0x6c, 0x1b, 0xae, 0xe3, 0x5d, - 0x85, 0x52, 0xbd, 0x53, 0x3a, 0x68, 0x3c, 0xdf, 0x4d, 0xcf, 0x99, 0x45, 0xfb, 0x27, 0x8e, 0x77, - 0xa5, 0xb5, 0x56, 0x19, 0x29, 0xec, 0xfe, 0x56, 0x80, 0xd6, 0x00, 0xbb, 0x98, 0xe0, 0xdb, 0x81, - 0xcc, 0x80, 0x56, 0xbc, 0x05, 0xb4, 0xd2, 0x8d, 0xa0, 0x95, 0x6f, 0x03, 0xad, 0xf2, 0xaf, 0x41, - 0xdb, 0x03, 0xb0, 0x59, 0xb8, 0xb6, 0x71, 0xbe, 0x66, 0x60, 0x0b, 0x9a, 0x10, 0x69, 0x0e, 0xd7, - 0xdd, 0x21, 0xec, 0x4e, 0xd7, 0x9e, 0xc5, 0x33, 0x7a, 0xed, 0x07, 0xc3, 0x77, 0xa4, 0x95, 0x8f, - 0xbe, 0xb8, 0x11, 0x7d, 0xf7, 0xf7, 0x22, 0xb4, 0x07, 0x4e, 0x68, 0xf9, 0x81, 0x1d, 0x9f, 0xd3, - 0x86, 0xa2, 0x63, 0x47, 0x1d, 0xa2, 0xe8, 0xd8, 0xac, 0xc2, 0xe2, 0x57, 0x21, 0x44, 0x35, 0xff, - 0x08, 0x04, 0xe2, 0x2c, 0x70, 0x48, 0xcc, 0xc5, 0x32, 0x86, 0x24, 0x51, 0xa0, 0x03, 0xd8, 0x4e, - 0x04, 0x5a, 0xc1, 0x38, 0xae, 0xb5, 0x4d, 0x35, 0x7d, 0x8b, 0xd1, 0x55, 0x33, 0x84, 0x04, 0x2d, - 0x16, 0xd1, 0x27, 0x50, 0x35, 0x57, 0x64, 0xee, 0x07, 0x0c, 0x82, 0xc6, 0xf3, 0xc7, 0x29, 0x74, - 0xf9, 0x78, 0x65, 0x66, 0xa5, 0x45, 0xd6, 0xe8, 0x73, 0x10, 0x02, 0x7c, 0x81, 0x03, 0xec, 0x59, - 0xbc, 0xe0, 0x1a, 0xd9, 0x82, 0xcb, 0xbb, 0x6a, 0xb1, 0xa1, 0x96, 0xfa, 0xa0, 0x01, 0x34, 0x4c, - 0x42, 0x4c, 0x6b, 0xbe, 0xc0, 0x1e, 0x89, 0x6b, 0xad, 0x7b, 0xe3, 0xd7, 0x13, 0x53, 0x2d, 0xeb, - 0xd6, 0xfd, 0xb3, 0x00, 0x3b, 0xd7, 0xc5, 0x79, 0x1d, 0xba, 0x9e, 0xb9, 0x48, 0xd0, 0xa5, 0x6b, - 0xf4, 0x14, 0x5a, 0xb6, 0x13, 0x5a, 0x81, 0xb3, 0x70, 0x3c, 0x93, 0xf8, 0x41, 0x84, 0x70, 0x5e, - 0x89, 0x1e, 0x42, 0xdd, 0x73, 0xac, 0x2b, 0xe6, 0xcd, 0xe1, 0x4d, 0x64, 0x7a, 0x3f, 0xe6, 0xb7, - 0x26, 0x31, 0x83, 0x59, 0xe0, 0x46, 0xc8, 0xa6, 0x0a, 0xd4, 0x03, 0xc4, 0x05, 0xd6, 0x27, 0x27, - 0x51, 0x33, 0xac, 0xb2, 0xfa, 0xbd, 0x66, 0x87, 0x7e, 0xc9, 0xf5, 0x2d, 0xd3, 0xa5, 0x87, 0xd5, - 0xf8, 0x97, 0x62, 0xb9, 0xeb, 0xc3, 0xfd, 0x1b, 0x40, 0xa5, 0x41, 0x24, 0x85, 0x16, 0x65, 0x9c, - 0x79, 0x37, 0x8f, 0x40, 0xb0, 0xe6, 0xa6, 0xe7, 0x61, 0x57, 0x4d, 0xea, 0x32, 0x51, 0xd0, 0xc2, - 0xb8, 0x5c, 0x39, 0xae, 0xad, 0x26, 0x5c, 0x11, 0x89, 0xdd, 0xbf, 0x0a, 0x20, 0xdd, 0x74, 0x07, - 0xff, 0x40, 0x37, 0x17, 0xc2, 0x66, 0xf1, 0x23, 0x11, 0x4a, 0xab, 0xc0, 0x8d, 0x3e, 0x40, 0x97, - 0x34, 0xd3, 0x0b, 0xc7, 0xc5, 0xa3, 0x0c, 0xa6, 0xb1, 0x4c, 0x6f, 0x85, 0xae, 0xa7, 0xce, 0x0f, - 0xf8, 0x70, 0x4d, 0x70, 0xc8, 0x70, 0x2d, 0x6b, 0x79, 0x25, 0xea, 0x40, 0xb6, 0x79, 0x45, 0xef, - 0x37, 0xd7, 0xcf, 0x32, 0xfc, 0x53, 0xcb, 0xf3, 0x4f, 0x16, 0xe7, 0xfa, 0x06, 0xce, 0x3f, 0x16, - 0xa1, 0x99, 0x6d, 0x73, 0x71, 0xf0, 0x85, 0x34, 0xf8, 0x1d, 0xa8, 0x10, 0x87, 0xb8, 0x71, 0x2d, - 0x71, 0x81, 0x06, 0x64, 0x63, 0x5a, 0x37, 0x4b, 0x4a, 0x47, 0x51, 0xb2, 0x59, 0x15, 0xfa, 0x00, - 0xee, 0x90, 0xf9, 0x6a, 0x71, 0xee, 0x99, 0x8e, 0x6b, 0xc4, 0xa1, 0xf1, 0x6e, 0x26, 0x26, 0x1b, - 0x93, 0x84, 0xee, 0xb7, 0x53, 0x63, 0x4e, 0xda, 0x9c, 0x9d, 0xdb, 0x89, 0xfa, 0x2d, 0x63, 0xef, - 0xff, 0x43, 0xea, 0x6c, 0x44, 0x3c, 0xce, 0x39, 0x3a, 0x3d, 0xe0, 0x98, 0x13, 0xfa, 0x8b, 0xa8, - 0xc3, 0x70, 0x7e, 0xd8, 0xbf, 0xbe, 0xaf, 0xf7, 0xe8, 0x4f, 0x4a, 0xbb, 0xdd, 0x7d, 0xa8, 0xc7, - 0x1a, 0x54, 0x87, 0xf2, 0x89, 0x3a, 0x7a, 0x23, 0x6e, 0x21, 0x01, 0x2a, 0xea, 0x50, 0x3e, 0x52, - 0xc4, 0x42, 0xf7, 0x0f, 0x01, 0x1a, 0x19, 0x82, 0xb9, 0xa1, 0x3f, 0xe6, 0x3a, 0x59, 0x91, 0xed, - 0x64, 0x3a, 0x59, 0xcc, 0xae, 0xa5, 0x0c, 0xbb, 0xee, 0x43, 0x23, 0xc0, 0xe1, 0xd2, 0xf7, 0x42, - 0x6c, 0x10, 0x3f, 0x2a, 0x13, 0x88, 0x55, 0xba, 0x4f, 0x07, 0x1d, 0xec, 0x85, 0x06, 0x7b, 0x98, - 0x51, 0x57, 0xc3, 0x5e, 0xc8, 0x6a, 0x28, 0x43, 0x32, 0xd5, 0x1c, 0xc9, 0x6c, 0xf2, 0x45, 0xed, - 0xbd, 0x49, 0xb6, 0xfe, 0x5e, 0x24, 0xfb, 0x12, 0x6a, 0x21, 0x1f, 0x15, 0x25, 0x81, 0x35, 0x4d, - 0x29, 0x3d, 0x20, 0x3f, 0x43, 0x1e, 0x6f, 0x69, 0xb1, 0x29, 0xea, 0x41, 0x85, 0xcd, 0x60, 0x12, - 0x30, 0x9f, 0xdd, 0x8d, 0xe1, 0x2f, 0xf5, 0xe0, 0x66, 0xd4, 0xde, 0xa4, 0x93, 0x90, 0xd4, 0xd8, - 0xb4, 0xcf, 0x4e, 0x58, 0xd4, 0x9e, 0x99, 0xa1, 0xc7, 0x20, 0x58, 0xfe, 0x62, 0xb1, 0xf2, 0x1c, - 0xb2, 0x96, 0x9a, 0xb4, 0x22, 0x8f, 0xb7, 0xb4, 0x54, 0x85, 0xfa, 0xb0, 0x6d, 0xf3, 0x56, 0x10, - 0xcf, 0xc7, 0x92, 0xb5, 0x19, 0x7d, 0xbe, 0x57, 0x1c, 0x6f, 0x69, 0x6d, 0x3b, 0xcf, 0x77, 0x09, - 0x81, 0xb7, 0xb2, 0x04, 0xfe, 0x04, 0x9a, 0xb6, 0x13, 0x2e, 0x5d, 0x73, 0xcd, 0x2f, 0xb2, 0x1d, - 0xbd, 0x1b, 0xae, 0x63, 0x97, 0xb9, 0x84, 0x4e, 0x34, 0x6f, 0x1b, 0x01, 0xfe, 0x66, 0x85, 0x43, - 0x62, 0x2c, 0x03, 0x7f, 0x69, 0x5e, 0x9a, 0x94, 0xbc, 0x43, 0x62, 0x12, 0x2c, 0x6d, 0xb3, 0x70, - 0x9e, 0x65, 0x6e, 0x83, 0x7b, 0x68, 0xdc, 0x61, 0x92, 0xd8, 0x4f, 0xa9, 0xb9, 0xb6, 0x67, 0xdd, - 0xb6, 0x7d, 0xcd, 0x28, 0x24, 0xfe, 0x97, 0x51, 0xe8, 0xe7, 0x12, 0x34, 0xfa, 0xb9, 0x4e, 0xb4, - 0x13, 0xcf, 0xa2, 0xfd, 0xf1, 0x48, 0x57, 0x46, 0x7a, 0x3c, 0x8d, 0xb6, 0x01, 0x74, 0xe5, 0x2b, - 0xdd, 0x98, 0x9c, 0xc8, 0xea, 0x48, 0x2c, 0xa0, 0x06, 0xd4, 0xa6, 0xba, 0xda, 0x7f, 0xa3, 0x68, - 0x62, 0x11, 0x01, 0x54, 0xa7, 0xba, 0xac, 0xcf, 0xa6, 0x62, 0x89, 0xbe, 0x37, 0x65, 0x38, 0xfe, - 0x42, 0x15, 0xcb, 0xe8, 0x3e, 0xdc, 0xd5, 0x35, 0x79, 0x34, 0x95, 0xfb, 0xba, 0x3a, 0xa6, 0x27, - 0x0e, 0x87, 0xf2, 0x68, 0x20, 0x56, 0xd0, 0x01, 0x3c, 0x9d, 0x9e, 0x4d, 0x75, 0x65, 0x68, 0x0c, - 0x95, 0xe9, 0x54, 0x3e, 0x52, 0x92, 0xaf, 0x4d, 0x34, 0xf5, 0x54, 0xd6, 0x15, 0xe3, 0x48, 0x1b, - 0xcf, 0x26, 0x62, 0x35, 0x7d, 0xbd, 0x35, 0xba, 0x64, 0xf3, 0xb1, 0x58, 0x47, 0x2d, 0x10, 0xe8, - 0x61, 0xb3, 0x91, 0xaa, 0x9f, 0x89, 0x02, 0x9d, 0xa0, 0x37, 0x8e, 0x3b, 0x92, 0x27, 0x22, 0xa0, - 0xbb, 0xb0, 0x4d, 0xcf, 0x95, 0xfb, 0xba, 0xa1, 0x29, 0x5f, 0xce, 0x94, 0xa9, 0x2e, 0x36, 0xa8, - 0x72, 0xa0, 0x4e, 0xfb, 0x63, 0x6d, 0x10, 0x5b, 0x8b, 0x4d, 0xf4, 0x00, 0xee, 0xa9, 0x03, 0x65, - 0xa4, 0xab, 0xfa, 0x99, 0x71, 0xaa, 0x68, 0xea, 0x6b, 0xb5, 0x2f, 0xd3, 0x98, 0xc5, 0x16, 0x7a, - 0x02, 0x7b, 0x1b, 0x87, 0x4f, 0xd4, 0xd1, 0x48, 0x49, 0xbd, 0xdb, 0xe8, 0x29, 0x74, 0x36, 0x4c, - 0x86, 0x33, 0x7d, 0x26, 0x9f, 0x18, 0xca, 0x29, 0xcd, 0x69, 0xaa, 0x8c, 0x74, 0x71, 0xfb, 0x9a, - 0xa4, 0x73, 0x56, 0x72, 0xbf, 0xaf, 0x4c, 0x74, 0x65, 0x20, 0x8a, 0xe8, 0x19, 0xfc, 0xef, 0x36, - 0x4b, 0x4d, 0x19, 0x8e, 0x4f, 0x95, 0x81, 0x78, 0xe7, 0x50, 0x48, 0x88, 0xe3, 0xb0, 0xf5, 0x75, - 0xa3, 0xf7, 0xd1, 0xa7, 0xf1, 0xa5, 0x9f, 0x57, 0xd9, 0xea, 0xc5, 0xdf, 0x01, 0x00, 0x00, 0xff, - 0xff, 0xb2, 0x8c, 0x90, 0x17, 0x2b, 0x0e, 0x00, 0x00, + // 1523 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x4f, 0x73, 0xe3, 0x4a, + 0x11, 0x8f, 0xff, 0x5b, 0x2d, 0xdb, 0xd1, 0xce, 0xe6, 0x65, 0xf5, 0xb6, 0x5e, 0x5e, 0xbc, 0x66, + 0xa9, 0x0d, 0x05, 0x65, 0xaa, 0xf6, 0x3d, 0xa8, 0x57, 0x45, 0x51, 0x94, 0x62, 0xeb, 0x25, 0x62, + 0xe3, 0x3f, 0x8c, 0xe5, 0x3c, 0xc2, 0x45, 0xa5, 0x48, 0x93, 0x58, 0x15, 0x59, 0x32, 0xd2, 0x18, + 0x30, 0x27, 0xbe, 0x11, 0x37, 0x4e, 0x1c, 0x39, 0x70, 0xe0, 0xca, 0x57, 0xe0, 0x13, 0xf0, 0x01, + 0xa8, 0x99, 0xd1, 0x5f, 0x93, 0x64, 0x61, 0x2f, 0xc9, 0x74, 0x4f, 0x77, 0xab, 0xe7, 0x37, 0x3d, + 0xfd, 0x6b, 0x03, 0x72, 0x56, 0x36, 0xb5, 0xd6, 0x24, 0x8e, 0xed, 0x7b, 0x32, 0xdc, 0x44, 0x21, + 0x0d, 0x51, 0x9b, 0xff, 0xbb, 0xdd, 0xde, 0xbd, 0x96, 0x49, 0xb0, 0x5d, 0xc7, 0x42, 0xfd, 0xba, + 0xeb, 0x84, 0x01, 0xb5, 0x1d, 0x9a, 0x88, 0x72, 0xbc, 0xb2, 0x23, 0x57, 0x08, 0x83, 0x6f, 0xa0, + 0xb7, 0xa0, 0x9e, 0xf3, 0x40, 0xa2, 0x89, 0x08, 0x85, 0x10, 0xd4, 0x57, 0x76, 0xbc, 0x52, 0x2b, + 0xfd, 0xca, 0x99, 0x84, 0xf9, 0x9a, 0xe9, 0x36, 0xb6, 0xf3, 0xa0, 0x56, 0xfb, 0x95, 0xb3, 0x06, + 0xe6, 0xeb, 0xc1, 0xdf, 0x2b, 0xd0, 0x31, 0xd6, 0xf6, 0x3d, 0x49, 0x1d, 0x55, 0x68, 0x6d, 0xec, + 0x9d, 0x1f, 0xda, 0x2e, 0xf7, 0xed, 0xe0, 0x54, 0x44, 0xef, 0xa0, 0x4e, 0x77, 0x1b, 0xc2, 0xdd, + 0x7b, 0xef, 0x5f, 0x0e, 0xd3, 0x34, 0x87, 0xdc, 0xdf, 0xdc, 0x6d, 0x08, 0xe6, 0x06, 0xe8, 0x73, + 0x68, 0xdb, 0xfe, 0xed, 0x76, 0x6d, 0x79, 0xae, 0x5a, 0xe3, 0xdf, 0x6f, 0x71, 0xd9, 0x70, 0xd1, + 0x11, 0x34, 0x7e, 0xef, 0xb9, 0x74, 0xa5, 0xd6, 0xfb, 0x95, 0xb3, 0x2e, 0x16, 0x02, 0x3a, 0x86, + 0xe6, 0x8a, 0x78, 0xf7, 0x2b, 0xaa, 0x36, 0xb8, 0x3a, 0x91, 0xd0, 0x8f, 0x00, 0x25, 0x81, 0xd8, + 0x17, 0x62, 0xcb, 0x09, 0xb7, 0x01, 0x55, 0x9b, 0xdc, 0x46, 0x11, 0x21, 0xf9, 0xc6, 0x88, 0xe9, + 0x07, 0x7f, 0xa9, 0x40, 0x47, 0xdb, 0xba, 0x5e, 0xf8, 0xf1, 0xa3, 0x7c, 0x5d, 0x3a, 0x4a, 0x3f, + 0x3f, 0x4a, 0xd1, 0x5f, 0x08, 0x85, 0x73, 0x9d, 0x82, 0xec, 0x6e, 0x23, 0x9b, 0x7a, 0x61, 0x60, + 0xad, 0x63, 0x7e, 0xb4, 0x3a, 0x86, 0x54, 0x35, 0x89, 0x07, 0x3f, 0x01, 0x29, 0xf3, 0x41, 0xc7, + 0x80, 0x96, 0xd3, 0x0f, 0xd3, 0xd9, 0x77, 0x53, 0x4b, 0x5b, 0x8e, 0x8d, 0x99, 0x65, 0xde, 0xcc, + 0x75, 0xe5, 0x00, 0xb5, 0xa0, 0xa6, 0x69, 0x23, 0xa5, 0xc2, 0x17, 0x13, 0xac, 0x54, 0x07, 0x7f, + 0xab, 0x82, 0xac, 0xbb, 0x1e, 0x4d, 0xf3, 0x3e, 0x82, 0x86, 0xe3, 0x87, 0xce, 0x03, 0xcf, 0xba, + 0x8e, 0x85, 0xc0, 0x6e, 0x8f, 0x92, 0x3f, 0x50, 0x9e, 0xb3, 0x84, 0xf9, 0x1a, 0xbd, 0x82, 0x16, + 0x2f, 0xa0, 0x0c, 0xe8, 0x26, 0x13, 0x0d, 0x17, 0x9d, 0x00, 0x24, 0x45, 0xc5, 0xf6, 0xea, 0x7c, + 0x4f, 0x4a, 0x34, 0xe2, 0x1a, 0xee, 0x23, 0x3b, 0x10, 0x78, 0x77, 0xb0, 0x10, 0xd0, 0x37, 0xd0, + 0x49, 0x9d, 0x38, 0x3a, 0x4d, 0x8e, 0xce, 0x67, 0x39, 0x3a, 0x49, 0x82, 0x1c, 0x12, 0x79, 0x9d, + 0x0b, 0x68, 0x0c, 0x1d, 0x56, 0x9d, 0x24, 0xa0, 0xc2, 0xb3, 0xc5, 0x3d, 0xdf, 0xe4, 0x9e, 0xa3, + 0x95, 0x9d, 0x1e, 0x6f, 0x38, 0x12, 0x96, 0x22, 0x8a, 0x93, 0x0b, 0xe8, 0xe7, 0xd0, 0xdb, 0x06, + 0x77, 0xdb, 0xc8, 0x27, 0xae, 0xe5, 0x7b, 0xc1, 0x43, 0xac, 0xb6, 0xfb, 0xb5, 0x33, 0xf9, 0xfd, + 0x71, 0x1e, 0x67, 0x99, 0xec, 0x5f, 0x79, 0xc1, 0x03, 0xee, 0x6e, 0x0b, 0x52, 0x3c, 0xf8, 0x47, + 0x05, 0xba, 0x63, 0xe2, 0x13, 0x4a, 0x9e, 0x07, 0xb2, 0x00, 0x5a, 0xf5, 0x19, 0xd0, 0x6a, 0x4f, + 0x82, 0x56, 0x7f, 0x0e, 0xb4, 0xc6, 0xff, 0x0c, 0xda, 0x09, 0x80, 0xcb, 0xd3, 0x75, 0xad, 0xdb, + 0x1d, 0x07, 0x5b, 0xc2, 0x52, 0xa2, 0x39, 0xdf, 0x0d, 0x26, 0x70, 0xbc, 0xd8, 0x05, 0x8e, 0x38, + 0xd1, 0xb7, 0x61, 0x34, 0xf9, 0xc8, 0xb1, 0xca, 0xd9, 0x57, 0xf7, 0xb2, 0x1f, 0xfc, 0xb3, 0x0a, + 0xbd, 0xb1, 0x17, 0x3b, 0x61, 0xe4, 0xa6, 0x71, 0x7a, 0x50, 0xf5, 0xdc, 0xa4, 0x43, 0x54, 0x3d, + 0x97, 0x57, 0x58, 0xfa, 0x2a, 0xa4, 0xa4, 0xe6, 0xbf, 0x00, 0x89, 0x7a, 0x6b, 0x12, 0x53, 0x7b, + 0xbd, 0x49, 0x21, 0xc9, 0x14, 0xe8, 0x0c, 0x0e, 0x33, 0x81, 0x55, 0x30, 0x49, 0x6b, 0x6d, 0x5f, + 0xcd, 0xde, 0x62, 0x72, 0xd5, 0x1c, 0x21, 0x09, 0xa7, 0x22, 0xfa, 0x29, 0x34, 0xed, 0x2d, 0x5d, + 0x85, 0x11, 0x87, 0x40, 0x7e, 0xff, 0x65, 0x0e, 0x5d, 0x39, 0x5f, 0x8d, 0x5b, 0xe1, 0xc4, 0x1a, + 0xfd, 0x02, 0xa4, 0x88, 0xdc, 0x91, 0x88, 0x04, 0x8e, 0x28, 0x38, 0xb9, 0x58, 0x70, 0x65, 0x57, + 0x9c, 0x1a, 0xe2, 0xdc, 0x07, 0x8d, 0x41, 0xb6, 0x29, 0xb5, 0x9d, 0xd5, 0x9a, 0x04, 0x34, 0xad, + 0xb5, 0xc1, 0x93, 0x5f, 0xcf, 0x4c, 0x71, 0xd1, 0x6d, 0xf0, 0xaf, 0x0a, 0x1c, 0x3d, 0x96, 0xe7, + 0x63, 0xe8, 0x06, 0xf6, 0x3a, 0x43, 0x97, 0xad, 0xd1, 0x5b, 0xe8, 0xba, 0x5e, 0xec, 0x44, 0xde, + 0xda, 0x0b, 0x6c, 0x1a, 0x46, 0x09, 0xc2, 0x65, 0x25, 0x7a, 0x0d, 0xed, 0xc0, 0x73, 0x1e, 0xb8, + 0xb7, 0x80, 0x37, 0x93, 0xd9, 0xfd, 0xd8, 0xbf, 0xb3, 0xa9, 0x1d, 0x2d, 0x23, 0x3f, 0x41, 0x36, + 0x57, 0xa0, 0x21, 0x20, 0x21, 0xf0, 0x3e, 0x39, 0x4f, 0x9a, 0x61, 0x93, 0xd7, 0xef, 0x23, 0x3b, + 0xec, 0x4b, 0x7e, 0xe8, 0xd8, 0x3e, 0x0b, 0xd6, 0x12, 0x5f, 0x4a, 0xe5, 0x41, 0x08, 0xaf, 0x9e, + 0x00, 0x95, 0x25, 0x91, 0x15, 0x5a, 0x72, 0xe2, 0xc2, 0xbb, 0xf9, 0x02, 0x24, 0x67, 0x65, 0x07, + 0x01, 0xf1, 0x8d, 0xac, 0x2e, 0x33, 0x05, 0x2b, 0x8c, 0xfb, 0xad, 0xe7, 0xbb, 0x46, 0xc6, 0x15, + 0x89, 0x38, 0xf8, 0x77, 0x05, 0xd4, 0xa7, 0xee, 0xe0, 0xbf, 0xd0, 0x2d, 0xa5, 0xb0, 0x5f, 0xfc, + 0x48, 0x81, 0xda, 0x36, 0xf2, 0x93, 0x0f, 0xb0, 0x25, 0x3b, 0xe9, 0x9d, 0xe7, 0x93, 0x69, 0x01, + 0xd3, 0x54, 0x66, 0xb7, 0xc2, 0xd6, 0x0b, 0xef, 0x8f, 0xe4, 0x7c, 0x47, 0x49, 0xcc, 0x71, 0xad, + 0xe3, 0xb2, 0x12, 0xf5, 0xa1, 0xd8, 0xbc, 0x92, 0xf7, 0x5b, 0xea, 0x67, 0x05, 0xfe, 0x69, 0x95, + 0xf9, 0xa7, 0x88, 0x73, 0x7b, 0x0f, 0xe7, 0x3f, 0x57, 0xa1, 0x53, 0x6c, 0x73, 0x69, 0xf2, 0x95, + 0x3c, 0xf9, 0x23, 0x68, 0x50, 0x8f, 0xfa, 0x69, 0x2d, 0x09, 0x81, 0x25, 0xe4, 0x12, 0x56, 0x37, + 0x1b, 0x46, 0x47, 0xc9, 0x61, 0x8b, 0x2a, 0xf4, 0x43, 0x78, 0x41, 0x57, 0xdb, 0xf5, 0x6d, 0x60, + 0x7b, 0xbe, 0x95, 0xa6, 0x26, 0xba, 0x99, 0x92, 0x6d, 0xcc, 0x33, 0xba, 0x3f, 0xcc, 0x8d, 0x05, + 0x69, 0x0b, 0x76, 0xee, 0x65, 0xea, 0xef, 0x38, 0x7b, 0xff, 0x00, 0x72, 0x67, 0x2b, 0xe1, 0x71, + 0xc1, 0xd1, 0x79, 0x80, 0x4b, 0x41, 0xe8, 0x5f, 0x25, 0x1d, 0x46, 0xf0, 0xc3, 0xe9, 0xe3, 0x7d, + 0x7d, 0xc8, 0xfe, 0xe4, 0xb4, 0x3b, 0x38, 0x85, 0x76, 0xaa, 0x41, 0x6d, 0xa8, 0x5f, 0x19, 0xd3, + 0x0f, 0xca, 0x01, 0x92, 0xa0, 0x61, 0x4c, 0xb4, 0x0b, 0x5d, 0xa9, 0x0c, 0xfe, 0x04, 0x20, 0x17, + 0x08, 0xe6, 0x89, 0xfe, 0x58, 0xea, 0x64, 0x55, 0xbe, 0x53, 0xe8, 0x64, 0x29, 0xbb, 0xd6, 0x0a, + 0xec, 0x7a, 0x0a, 0x72, 0x44, 0xe2, 0x4d, 0x18, 0xc4, 0xc4, 0xa2, 0x61, 0x52, 0x26, 0x90, 0xaa, + 0xcc, 0x90, 0x0d, 0x3a, 0x24, 0x88, 0x2d, 0xfe, 0x30, 0x93, 0xae, 0x46, 0x82, 0x98, 0xd7, 0x50, + 0x81, 0x64, 0x9a, 0x25, 0x92, 0xd9, 0xe7, 0x8b, 0xd6, 0x27, 0x93, 0x6c, 0xfb, 0x93, 0x48, 0xf6, + 0x6b, 0x68, 0xc5, 0x62, 0x54, 0x54, 0x25, 0xde, 0x34, 0xd5, 0x3c, 0x40, 0x79, 0x86, 0xbc, 0x3c, + 0xc0, 0xa9, 0x29, 0x1a, 0x42, 0x83, 0xcf, 0x60, 0x2a, 0x70, 0x9f, 0xe3, 0xbd, 0xe1, 0x2f, 0xf7, + 0x10, 0x66, 0xcc, 0xde, 0x66, 0x93, 0x90, 0x2a, 0xef, 0xdb, 0x17, 0x27, 0x2c, 0x66, 0xcf, 0xcd, + 0xd0, 0x97, 0x20, 0x39, 0xe1, 0x7a, 0xbd, 0x0d, 0x3c, 0xba, 0x53, 0x3b, 0xac, 0x22, 0x2f, 0x0f, + 0x70, 0xae, 0x42, 0x23, 0x38, 0x74, 0x45, 0x2b, 0x48, 0x87, 0x65, 0xd5, 0xd9, 0xcf, 0xbe, 0xdc, + 0x2b, 0x2e, 0x0f, 0x70, 0xcf, 0x2d, 0xf3, 0x5d, 0x46, 0xe0, 0xdd, 0x22, 0x81, 0xbf, 0x81, 0x8e, + 0xeb, 0xc5, 0x1b, 0xdf, 0xde, 0x89, 0x8b, 0xec, 0x25, 0xef, 0x46, 0xe8, 0xf8, 0x65, 0x6e, 0xa0, + 0x9f, 0x0c, 0xdf, 0x56, 0x44, 0x7e, 0xbb, 0x25, 0x31, 0xb5, 0x36, 0x51, 0xb8, 0xb1, 0xef, 0x6d, + 0x46, 0xde, 0x31, 0xb5, 0x29, 0x51, 0x0f, 0x79, 0x3a, 0xef, 0x0a, 0xb7, 0x21, 0x3c, 0xb0, 0x70, + 0x98, 0x67, 0xf6, 0x0b, 0x66, 0x8e, 0x4f, 0x9c, 0xe7, 0xb6, 0x1f, 0x19, 0x85, 0x94, 0xff, 0x63, + 0x14, 0x42, 0xdf, 0x87, 0x06, 0xff, 0x79, 0xa0, 0xbe, 0xe0, 0x59, 0x1d, 0x16, 0xae, 0x98, 0xa9, + 0xb1, 0xd8, 0x1d, 0xfc, 0xb5, 0x06, 0xf2, 0xa8, 0xd4, 0xb0, 0x8e, 0xd2, 0x91, 0x75, 0x34, 0x9b, + 0x9a, 0xfa, 0xd4, 0x4c, 0x87, 0xd6, 0x1e, 0x80, 0xa9, 0xff, 0xda, 0xb4, 0xe6, 0x57, 0x9a, 0x31, + 0x55, 0x2a, 0x48, 0x86, 0xd6, 0xc2, 0x34, 0x46, 0x1f, 0x74, 0xac, 0x54, 0x11, 0x40, 0x73, 0x61, + 0x6a, 0xe6, 0x72, 0xa1, 0xd4, 0xd8, 0xb3, 0xd4, 0x27, 0xb3, 0x5f, 0x1a, 0x4a, 0x1d, 0xbd, 0x82, + 0x97, 0x26, 0xd6, 0xa6, 0x0b, 0x6d, 0x64, 0x1a, 0x33, 0x16, 0x71, 0x32, 0xd1, 0xa6, 0x63, 0xa5, + 0x81, 0xce, 0xe0, 0xed, 0xe2, 0x66, 0x61, 0xea, 0x13, 0x6b, 0xa2, 0x2f, 0x16, 0xda, 0x85, 0x9e, + 0x7d, 0x6d, 0x8e, 0x8d, 0x6b, 0xcd, 0xd4, 0xad, 0x0b, 0x3c, 0x5b, 0xce, 0x95, 0x66, 0xfe, 0xc8, + 0x5b, 0x6c, 0xc9, 0xc7, 0x68, 0xa5, 0x8d, 0xba, 0x20, 0xb1, 0x60, 0xcb, 0xa9, 0x61, 0xde, 0x28, + 0x12, 0x1b, 0xb4, 0xf7, 0xc2, 0x5d, 0x68, 0x73, 0x05, 0xd0, 0x4b, 0x38, 0x64, 0x71, 0xb5, 0x91, + 0x69, 0x61, 0xfd, 0x57, 0x4b, 0x7d, 0x61, 0x2a, 0x32, 0x53, 0x8e, 0x8d, 0xc5, 0x68, 0x86, 0xc7, + 0xa9, 0xb5, 0xd2, 0x41, 0x9f, 0xc3, 0x67, 0xc6, 0x58, 0x9f, 0x9a, 0x86, 0x79, 0x63, 0x5d, 0xeb, + 0xd8, 0xf8, 0xd6, 0x18, 0x69, 0x2c, 0x67, 0xa5, 0x8b, 0xde, 0xc0, 0xc9, 0x5e, 0xf0, 0xb9, 0x31, + 0x9d, 0xea, 0xb9, 0x77, 0x0f, 0xbd, 0x85, 0xfe, 0x9e, 0xc9, 0x64, 0x69, 0x2e, 0xb5, 0x2b, 0x4b, + 0xbf, 0x66, 0x67, 0x5a, 0xe8, 0x53, 0x53, 0x39, 0x7c, 0xe4, 0xd0, 0x25, 0x2b, 0x6d, 0x34, 0xd2, + 0xe7, 0xa6, 0x3e, 0x56, 0x14, 0xf4, 0x0e, 0xbe, 0xf7, 0x9c, 0x25, 0xd6, 0x27, 0xb3, 0x6b, 0x7d, + 0xac, 0xbc, 0x38, 0x97, 0x32, 0x7e, 0x39, 0xef, 0xfe, 0x46, 0x1e, 0xfe, 0xf8, 0x67, 0xe9, 0x2d, + 0xdf, 0x36, 0xf9, 0xea, 0xab, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x18, 0x95, 0x9c, 0x97, 0x5f, + 0x0e, 0x00, 0x00, } diff --git a/protocol/protobuf/chat_message.proto b/protocol/protobuf/chat_message.proto index 609d1b23a..ff2c99752 100644 --- a/protocol/protobuf/chat_message.proto +++ b/protocol/protobuf/chat_message.proto @@ -5,6 +5,7 @@ package protobuf; import "enums.proto"; import "contact.proto"; +import "shard.proto"; message StickerMessage { string hash = 1; @@ -168,6 +169,8 @@ message ChatMessage { repeated UnfurledLink unfurled_links = 16; + Shard shard = 17; + enum ContentType { UNKNOWN_CONTENT_TYPE = 0; TEXT_PLAIN = 1; diff --git a/protocol/protobuf/communities.pb.go b/protocol/protobuf/communities.pb.go index 91cd70afe..758f641db 100644 --- a/protocol/protobuf/communities.pb.go +++ b/protocol/protobuf/communities.pb.go @@ -1144,15 +1144,17 @@ func (m *CommunityCancelRequestToJoin) GetDisplayName() string { } type CommunityRequestToJoinResponse struct { - Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"` - Community *CommunityDescription `protobuf:"bytes,2,opt,name=community,proto3" json:"community,omitempty"` - Accepted bool `protobuf:"varint,3,opt,name=accepted,proto3" json:"accepted,omitempty"` - Grant []byte `protobuf:"bytes,4,opt,name=grant,proto3" json:"grant,omitempty"` - CommunityId []byte `protobuf:"bytes,5,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"` - MagnetUri string `protobuf:"bytes,6,opt,name=magnet_uri,json=magnetUri,proto3" json:"magnet_uri,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"` + Community *CommunityDescription `protobuf:"bytes,2,opt,name=community,proto3" json:"community,omitempty"` + Accepted bool `protobuf:"varint,3,opt,name=accepted,proto3" json:"accepted,omitempty"` + Grant []byte `protobuf:"bytes,4,opt,name=grant,proto3" json:"grant,omitempty"` + CommunityId []byte `protobuf:"bytes,5,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"` + MagnetUri string `protobuf:"bytes,6,opt,name=magnet_uri,json=magnetUri,proto3" json:"magnet_uri,omitempty"` + ProtectedTopicPrivateKey []byte `protobuf:"bytes,7,opt,name=protected_topic_private_key,json=protectedTopicPrivateKey,proto3" json:"protected_topic_private_key,omitempty"` + Shard *Shard `protobuf:"bytes,8,opt,name=shard,proto3" json:"shard,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *CommunityRequestToJoinResponse) Reset() { *m = CommunityRequestToJoinResponse{} } @@ -1222,6 +1224,20 @@ func (m *CommunityRequestToJoinResponse) GetMagnetUri() string { return "" } +func (m *CommunityRequestToJoinResponse) GetProtectedTopicPrivateKey() []byte { + if m != nil { + return m.ProtectedTopicPrivateKey + } + return nil +} + +func (m *CommunityRequestToJoinResponse) GetShard() *Shard { + if m != nil { + return m.Shard + } + return nil +} + type CommunityRequestToLeave struct { Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"` CommunityId []byte `protobuf:"bytes,2,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"` @@ -1672,135 +1688,138 @@ func init() { } var fileDescriptor_f937943d74c1cd8b = []byte{ - // 2066 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x41, 0x73, 0x1b, 0x49, - 0xf5, 0xcf, 0x68, 0x64, 0x5b, 0x7a, 0xb2, 0x6c, 0xb9, 0x93, 0xd8, 0x13, 0x27, 0xd9, 0x28, 0xf3, - 0xff, 0x53, 0x78, 0x43, 0xa1, 0xec, 0x1a, 0x28, 0x52, 0xbb, 0xb0, 0xbb, 0x8a, 0x3c, 0x64, 0xb5, - 0x89, 0x46, 0xde, 0x96, 0xbc, 0x81, 0x2d, 0x60, 0xaa, 0x3d, 0xd3, 0xb6, 0xbb, 0x22, 0xcd, 0x88, - 0xe9, 0x96, 0x0b, 0x71, 0xe0, 0x00, 0x7c, 0x02, 0xf8, 0x00, 0x1c, 0xb8, 0xc3, 0x47, 0xe0, 0x40, - 0x15, 0x47, 0xee, 0xdc, 0x38, 0x72, 0xe4, 0xcc, 0x89, 0xea, 0xee, 0x99, 0xd1, 0x8c, 0x24, 0xc7, - 0x59, 0x16, 0xaa, 0x38, 0x69, 0xde, 0xeb, 0xd7, 0xaf, 0xdf, 0x7b, 0xfd, 0xeb, 0xd7, 0xbf, 0x16, - 0xec, 0xf8, 0xd1, 0x78, 0x3c, 0x0d, 0x99, 0x60, 0x94, 0xb7, 0x26, 0x71, 0x24, 0x22, 0x54, 0x51, - 0x3f, 0xa7, 0xd3, 0xb3, 0xfd, 0x9b, 0xfe, 0x05, 0x11, 0x1e, 0x0b, 0x68, 0x28, 0x98, 0x98, 0xe9, - 0xe1, 0xfd, 0x1a, 0x0d, 0xa7, 0xe3, 0xc4, 0xd6, 0xbe, 0x84, 0xb5, 0x67, 0x31, 0x09, 0x05, 0x7a, - 0x08, 0x9b, 0xa9, 0xa7, 0x99, 0xc7, 0x02, 0xcb, 0x68, 0x1a, 0x07, 0x9b, 0xb8, 0x96, 0xe9, 0xba, - 0x01, 0xba, 0x0b, 0xd5, 0x31, 0x1d, 0x9f, 0xd2, 0x58, 0x8e, 0x97, 0xd4, 0x78, 0x45, 0x2b, 0xba, - 0x01, 0xda, 0x83, 0x8d, 0x64, 0x31, 0xcb, 0x6c, 0x1a, 0x07, 0x55, 0xbc, 0x2e, 0xc5, 0x6e, 0x80, - 0x6e, 0xc1, 0x9a, 0x3f, 0x8a, 0xfc, 0x57, 0x56, 0xb9, 0x69, 0x1c, 0x94, 0xb1, 0x16, 0xec, 0x3f, - 0x97, 0x60, 0xbb, 0x93, 0xfa, 0xee, 0x29, 0x27, 0xe8, 0x5b, 0xb0, 0x16, 0x47, 0x23, 0xca, 0x2d, - 0xa3, 0x69, 0x1e, 0x6c, 0x1d, 0x3e, 0x68, 0xa5, 0x79, 0xb4, 0x16, 0x2c, 0x5b, 0x58, 0x9a, 0x61, - 0x6d, 0x8d, 0x3e, 0x81, 0x9d, 0x98, 0x5e, 0x52, 0x32, 0xa2, 0x81, 0x47, 0x7c, 0x3f, 0x9a, 0x86, - 0x82, 0x5b, 0xa5, 0xa6, 0x79, 0x50, 0x3b, 0xbc, 0x33, 0x77, 0x81, 0x13, 0x93, 0xb6, 0xb6, 0x78, - 0x5a, 0xb2, 0x0c, 0xdc, 0x88, 0x8b, 0x4a, 0x8e, 0x1e, 0xc1, 0xce, 0x88, 0x70, 0xe1, 0x4d, 0x27, - 0x01, 0x11, 0xd4, 0xd3, 0x81, 0x9b, 0x2a, 0xf0, 0x6d, 0x39, 0x70, 0xa2, 0xf4, 0x1d, 0x95, 0xc2, - 0x2f, 0x0d, 0x58, 0x53, 0x81, 0xa0, 0x3a, 0x54, 0x71, 0xff, 0x85, 0xe3, 0xb9, 0x7d, 0xd7, 0x69, - 0xdc, 0x40, 0x5b, 0x00, 0x4a, 0xec, 0xbf, 0x74, 0x1d, 0xdc, 0x30, 0x32, 0xb9, 0x7d, 0xd4, 0xeb, - 0xba, 0x8d, 0x32, 0xba, 0x0d, 0x3b, 0x4a, 0x1e, 0xf6, 0x9f, 0x3b, 0xae, 0xd7, 0x6b, 0x0f, 0x86, - 0x0e, 0x6e, 0xac, 0xd9, 0xe5, 0x4a, 0xa9, 0x51, 0xb2, 0xcb, 0x15, 0xb3, 0x61, 0x3e, 0xd2, 0x06, - 0xbd, 0xb6, 0xdb, 0x7e, 0xe6, 0x78, 0x27, 0x03, 0x07, 0x0f, 0x1e, 0xdd, 0xd6, 0xaa, 0xfe, 0x91, - 0x83, 0xdb, 0x43, 0xc7, 0xeb, 0xf4, 0xdd, 0xa1, 0xe3, 0x0e, 0xed, 0x5f, 0x98, 0xb0, 0x9b, 0x95, - 0x67, 0x18, 0xbd, 0xa2, 0x61, 0x8f, 0x0a, 0x12, 0x10, 0x41, 0xd0, 0x19, 0x20, 0x3f, 0x0a, 0x45, - 0x4c, 0x7c, 0xe1, 0x91, 0x20, 0x88, 0x29, 0xe7, 0x49, 0x71, 0x6b, 0x87, 0xdf, 0x5e, 0x51, 0xdc, - 0xc2, 0xec, 0x56, 0x27, 0x99, 0xda, 0x4e, 0x67, 0x3a, 0xa1, 0x88, 0x67, 0x78, 0xc7, 0x5f, 0xd4, - 0xa3, 0x26, 0xd4, 0x02, 0xca, 0xfd, 0x98, 0x4d, 0x04, 0x8b, 0x42, 0x85, 0x8c, 0x2a, 0xce, 0xab, - 0x24, 0x06, 0xd8, 0x98, 0x9c, 0xd3, 0x04, 0x1a, 0x5a, 0x40, 0xef, 0x41, 0x55, 0xc8, 0x25, 0x87, - 0xb3, 0x09, 0x55, 0xe8, 0xd8, 0x3a, 0xbc, 0x77, 0x55, 0x58, 0xd2, 0x06, 0xcf, 0xcd, 0xd1, 0x2e, - 0xac, 0xf3, 0xd9, 0xf8, 0x34, 0x1a, 0x59, 0x6b, 0x1a, 0x6d, 0x5a, 0x42, 0x08, 0xca, 0x21, 0x19, - 0x53, 0x6b, 0x5d, 0x69, 0xd5, 0x37, 0xda, 0x87, 0x4a, 0x40, 0x7d, 0x36, 0x26, 0x23, 0x6e, 0x6d, - 0x34, 0x8d, 0x83, 0x3a, 0xce, 0xe4, 0xfd, 0x23, 0x59, 0xbd, 0x55, 0x89, 0xa2, 0x06, 0x98, 0xaf, - 0xe8, 0x4c, 0x9d, 0x83, 0x32, 0x96, 0x9f, 0x32, 0x8b, 0x4b, 0x32, 0x9a, 0xd2, 0x24, 0x43, 0x2d, - 0xbc, 0x57, 0x7a, 0x62, 0xd8, 0x7f, 0x33, 0xe0, 0x56, 0x16, 0xef, 0x31, 0x8d, 0xc7, 0x8c, 0x73, - 0x16, 0x85, 0x1c, 0xdd, 0x81, 0x0a, 0x0d, 0xb9, 0x17, 0x85, 0x23, 0xed, 0xa9, 0x82, 0x37, 0x68, - 0xc8, 0xfb, 0xe1, 0x68, 0x86, 0x2c, 0xd8, 0x98, 0xc4, 0xec, 0x92, 0x08, 0xed, 0xaf, 0x82, 0x53, - 0x11, 0x7d, 0x17, 0xd6, 0x89, 0xef, 0x53, 0xce, 0x55, 0xb9, 0xb6, 0x0e, 0xbf, 0xb2, 0xa2, 0x28, - 0xb9, 0x45, 0x5a, 0x6d, 0x65, 0x8c, 0x93, 0x49, 0xf6, 0x10, 0xd6, 0xb5, 0x06, 0x21, 0xd8, 0x3a, - 0x71, 0x9f, 0xbb, 0xfd, 0x97, 0xae, 0xd7, 0xee, 0x74, 0x9c, 0xc1, 0xa0, 0x71, 0x03, 0xed, 0x40, - 0xdd, 0xed, 0x7b, 0x3d, 0xa7, 0xf7, 0xd4, 0xc1, 0x83, 0x8f, 0xbb, 0xc7, 0x0d, 0x03, 0xdd, 0x84, - 0xed, 0xae, 0xfb, 0x59, 0x77, 0xd8, 0x1e, 0x76, 0xfb, 0xae, 0xd7, 0x77, 0x5f, 0xfc, 0xa0, 0x51, - 0x92, 0xa0, 0xed, 0xbb, 0x1e, 0x76, 0x3e, 0x3d, 0x71, 0x06, 0xc3, 0x86, 0x69, 0xff, 0xca, 0x84, - 0xba, 0xda, 0x89, 0x4e, 0xcc, 0x04, 0x8d, 0x19, 0x41, 0x3f, 0x7a, 0x0d, 0xbc, 0x5a, 0xf3, 0x90, - 0x0b, 0x93, 0xbe, 0x00, 0xaa, 0xde, 0x81, 0xb2, 0x90, 0xc0, 0x28, 0xbd, 0x01, 0x30, 0x94, 0x65, - 0x0e, 0x13, 0xe6, 0x4a, 0x4c, 0x94, 0x73, 0x98, 0xd8, 0x85, 0x75, 0x32, 0x96, 0x67, 0x3e, 0xc5, - 0x8f, 0x96, 0x64, 0x8f, 0x53, 0x20, 0xf3, 0x58, 0xc0, 0xad, 0xf5, 0xa6, 0x79, 0x50, 0xc6, 0x15, - 0xa5, 0xe8, 0x06, 0x1c, 0x3d, 0x80, 0x9a, 0xdc, 0xcd, 0x09, 0x11, 0x82, 0xc6, 0xa1, 0xc2, 0x52, - 0x15, 0x03, 0x0d, 0xf9, 0xb1, 0xd6, 0x14, 0x90, 0x56, 0x51, 0xc0, 0xf9, 0x4f, 0x23, 0xed, 0x37, - 0x26, 0x58, 0xc5, 0x02, 0xcc, 0x91, 0x80, 0xb6, 0xa0, 0x94, 0x74, 0xee, 0x2a, 0x2e, 0xb1, 0x00, - 0xbd, 0x5f, 0x28, 0xe1, 0x57, 0xaf, 0x2a, 0xe1, 0xdc, 0x43, 0x2b, 0x57, 0xcd, 0x0f, 0x60, 0x4b, - 0x57, 0xc2, 0x4f, 0xf6, 0xce, 0x32, 0xd5, 0xd6, 0xee, 0x5d, 0xb1, 0xb5, 0xb8, 0x2e, 0x0a, 0xf0, - 0xb8, 0x03, 0x95, 0xe4, 0x42, 0xe0, 0x56, 0xb9, 0x69, 0x1e, 0x54, 0xf1, 0x86, 0xbe, 0x11, 0x38, - 0xba, 0x0f, 0xc0, 0xb8, 0x97, 0xa2, 0x7f, 0x4d, 0xa1, 0xbf, 0xca, 0xf8, 0xb1, 0x56, 0xd8, 0x7f, - 0x30, 0xa0, 0xac, 0x0e, 0xf9, 0x3d, 0xb0, 0x52, 0xfc, 0xea, 0x5e, 0x79, 0xec, 0xe0, 0x5e, 0x77, - 0x30, 0xe8, 0xf6, 0xdd, 0xc6, 0x0d, 0xd4, 0x80, 0xcd, 0xa7, 0x4e, 0xa7, 0xdf, 0x4b, 0x1b, 0xab, - 0x21, 0xb1, 0x9d, 0x68, 0x34, 0xbe, 0x1b, 0x25, 0x74, 0x0b, 0x1a, 0x9d, 0xb6, 0xeb, 0x7d, 0xd6, - 0x75, 0x5e, 0x7a, 0x9d, 0x8f, 0xdb, 0xae, 0xeb, 0xbc, 0x68, 0x98, 0xe8, 0x3e, 0xdc, 0xc9, 0xb4, - 0x6d, 0xf7, 0xc8, 0x3b, 0xee, 0x0f, 0x86, 0xd9, 0x70, 0x19, 0xed, 0xc1, 0xcd, 0xc4, 0x4f, 0xb1, - 0x45, 0xa3, 0x5d, 0x40, 0x85, 0x01, 0xdd, 0xe1, 0xd7, 0xed, 0x7f, 0x56, 0x73, 0xe7, 0xff, 0xa8, - 0xd8, 0xf8, 0xf4, 0x1d, 0x62, 0xe4, 0x2e, 0x3f, 0xe4, 0xc0, 0x86, 0xbe, 0x37, 0xd3, 0x7b, 0xea, - 0x6b, 0x2b, 0xb6, 0x26, 0xe7, 0xa6, 0xa5, 0xaf, 0xbd, 0xe4, 0xac, 0xa4, 0x73, 0xd1, 0x47, 0x50, - 0x9b, 0xcc, 0xdb, 0x80, 0x02, 0x7d, 0xed, 0xf0, 0xad, 0xd7, 0x37, 0x0b, 0x9c, 0x9f, 0x82, 0x0e, - 0xa1, 0x92, 0x92, 0x03, 0xb5, 0x0d, 0xb5, 0xc3, 0xdd, 0xdc, 0x74, 0xb5, 0x5b, 0x7a, 0x14, 0x67, - 0x76, 0xe8, 0x43, 0x58, 0x93, 0xfb, 0xa8, 0x4f, 0x47, 0xed, 0xf0, 0xed, 0x6b, 0x42, 0x97, 0x5e, - 0x92, 0xc0, 0xf5, 0x3c, 0x09, 0x8c, 0x53, 0x12, 0x7a, 0x23, 0xc6, 0x85, 0xb5, 0xa1, 0x81, 0x71, - 0x4a, 0xc2, 0x17, 0x8c, 0x0b, 0xe4, 0x02, 0xf8, 0x44, 0xd0, 0xf3, 0x28, 0x66, 0x54, 0x9e, 0xa0, - 0x85, 0x56, 0xb2, 0x7a, 0x81, 0x6c, 0x82, 0x5e, 0x25, 0xe7, 0x01, 0x3d, 0x01, 0x8b, 0xc4, 0xfe, - 0x05, 0xbb, 0xa4, 0xde, 0x98, 0x9c, 0x87, 0x54, 0x8c, 0x58, 0xf8, 0x2a, 0xb9, 0xd5, 0xab, 0x6a, - 0x47, 0x76, 0x93, 0xf1, 0x5e, 0x36, 0xac, 0x2e, 0x77, 0xf4, 0x0c, 0xb6, 0x48, 0x30, 0x66, 0xa1, - 0xc7, 0xa9, 0x10, 0x2c, 0x3c, 0xe7, 0x16, 0xa8, 0xfa, 0x34, 0x57, 0x44, 0xd3, 0x96, 0x86, 0x83, - 0xc4, 0x0e, 0xd7, 0x49, 0x5e, 0x44, 0xff, 0x07, 0x75, 0x16, 0x8a, 0x38, 0xf2, 0xc6, 0x94, 0x73, - 0x79, 0x05, 0xd6, 0xd4, 0xf1, 0xdc, 0x54, 0xca, 0x9e, 0xd6, 0x49, 0xa3, 0x68, 0x9a, 0x37, 0xda, - 0xd4, 0x46, 0x4a, 0x99, 0x1a, 0x35, 0xa1, 0x4a, 0x43, 0x3f, 0x9e, 0x4d, 0x04, 0x0d, 0xac, 0xba, - 0x3c, 0x34, 0x8a, 0xc4, 0xcc, 0x95, 0xb2, 0xd1, 0x09, 0x72, 0xce, 0xad, 0x2d, 0x55, 0x55, 0xf5, - 0x8d, 0x08, 0xec, 0xe8, 0x63, 0x9c, 0x87, 0xca, 0xb6, 0xaa, 0xec, 0x37, 0xaf, 0xa9, 0xec, 0x42, - 0x73, 0x48, 0xea, 0xdb, 0x10, 0x0b, 0x6a, 0xf4, 0x43, 0xb8, 0x33, 0xa7, 0x8e, 0x6a, 0x94, 0x7b, - 0xe3, 0x84, 0x46, 0x58, 0x0d, 0xb5, 0x54, 0xf3, 0x3a, 0xba, 0x81, 0xf7, 0xfc, 0x82, 0x9e, 0x67, - 0x2c, 0xe6, 0x1d, 0xb8, 0x45, 0x7c, 0xa1, 0xb6, 0x50, 0xe3, 0xde, 0x53, 0x5c, 0xcd, 0xda, 0x51, - 0xfb, 0x87, 0xf4, 0x58, 0x72, 0x40, 0x3a, 0x72, 0x64, 0xff, 0x04, 0x36, 0xf3, 0x07, 0x26, 0xdf, - 0x5f, 0xab, 0xba, 0xbf, 0x3e, 0xce, 0xf7, 0xd7, 0x02, 0x4d, 0x5c, 0x60, 0x9a, 0xb9, 0xd6, 0xbb, - 0xff, 0x29, 0xc0, 0x1c, 0xcc, 0x2b, 0x9c, 0x7e, 0xbd, 0xe8, 0x74, 0x6f, 0x85, 0x53, 0x39, 0x3f, - 0xef, 0xf2, 0x73, 0xd8, 0x5e, 0x80, 0xef, 0x0a, 0xbf, 0xef, 0x16, 0xfd, 0xde, 0x5d, 0xe5, 0x57, - 0x3b, 0x99, 0xe5, 0x7d, 0x9f, 0xc3, 0xed, 0x95, 0x1b, 0xb8, 0x62, 0x85, 0x27, 0xc5, 0x15, 0xec, - 0xeb, 0x2f, 0x8a, 0xfc, 0x95, 0xf4, 0xe3, 0x1c, 0x01, 0x2d, 0x1c, 0x05, 0x74, 0x04, 0x0f, 0x26, - 0x2c, 0x4c, 0x41, 0xed, 0x91, 0xd1, 0x28, 0xdb, 0x43, 0x1a, 0x92, 0xd3, 0x11, 0x0d, 0x12, 0x52, - 0x74, 0x77, 0xc2, 0xc2, 0x04, 0xe6, 0xed, 0xd1, 0x28, 0xdb, 0x3c, 0x65, 0x62, 0xff, 0xb5, 0x04, - 0xf5, 0x42, 0x05, 0xd1, 0x07, 0xf3, 0xfe, 0xa9, 0xe9, 0xc6, 0xff, 0x5f, 0x51, 0xeb, 0x37, 0x6b, - 0x9c, 0xa5, 0x2f, 0xd7, 0x38, 0xcd, 0x37, 0x6c, 0x9c, 0x0f, 0xa0, 0x96, 0xb4, 0x26, 0xf5, 0xc0, - 0xd2, 0x6c, 0x24, 0xed, 0x56, 0xf2, 0x7d, 0xb5, 0x0f, 0x95, 0x49, 0xc4, 0x99, 0x22, 0xd1, 0xb2, - 0x1b, 0xaf, 0xe1, 0x4c, 0xfe, 0x2f, 0x61, 0xda, 0x0e, 0x60, 0x67, 0x09, 0x44, 0x8b, 0x81, 0x1a, - 0x4b, 0x81, 0xa6, 0x84, 0xaa, 0x54, 0x24, 0xd9, 0x59, 0xf0, 0x66, 0x31, 0x78, 0xfb, 0xd7, 0x06, - 0x6c, 0x2f, 0xbc, 0xbf, 0x24, 0xfd, 0x4d, 0x48, 0x63, 0xb2, 0x40, 0x2a, 0xa2, 0x7b, 0x50, 0xe5, - 0xec, 0x3c, 0x24, 0x62, 0x1a, 0xd3, 0xe4, 0x99, 0x39, 0x57, 0x48, 0x82, 0xe6, 0x5f, 0x10, 0xa6, - 0x09, 0x9a, 0xa9, 0x09, 0x9a, 0x52, 0x48, 0x62, 0xf1, 0x08, 0x1a, 0x8c, 0xb7, 0x59, 0x1c, 0xc4, - 0xd1, 0x24, 0x21, 0x59, 0xaa, 0xce, 0x15, 0xbc, 0xa4, 0xb7, 0xff, 0x61, 0xe4, 0x70, 0x8b, 0xe9, - 0x4f, 0xa6, 0x94, 0x8b, 0x61, 0xf4, 0x49, 0xc4, 0xae, 0xba, 0xb5, 0x13, 0x2e, 0x9f, 0xcb, 0x5c, - 0x72, 0x79, 0x57, 0x26, 0x7f, 0xe5, 0xe3, 0x77, 0xf1, 0x55, 0x5d, 0x5e, 0x7e, 0x55, 0x3f, 0x84, - 0xcd, 0x80, 0xf1, 0xc9, 0x88, 0xcc, 0xb4, 0xeb, 0xb5, 0xe4, 0xf9, 0xa4, 0x75, 0xca, 0xfd, 0xf7, - 0x56, 0xbd, 0x70, 0xd7, 0xaf, 0x79, 0xe1, 0x2e, 0xbf, 0x6e, 0xed, 0xdf, 0x1a, 0x70, 0x2f, 0x4b, - 0xd9, 0x09, 0x98, 0x18, 0x5c, 0x90, 0x98, 0x06, 0x73, 0xce, 0xbd, 0x3a, 0xf1, 0xc5, 0x24, 0x4a, - 0xcb, 0x49, 0xac, 0x8c, 0xd0, 0xfc, 0xe2, 0x11, 0xfe, 0x3e, 0x1f, 0x61, 0x87, 0x84, 0x3e, 0x1d, - 0xfd, 0x4f, 0x6f, 0x8d, 0xfd, 0x77, 0x03, 0xde, 0x5a, 0x8d, 0x22, 0x4c, 0xf9, 0x24, 0x0a, 0x39, - 0xbd, 0x22, 0xe4, 0xef, 0x40, 0x35, 0x5b, 0xea, 0x35, 0x1d, 0x28, 0x77, 0x1f, 0xe3, 0xf9, 0x04, - 0x79, 0xda, 0xe4, 0x6b, 0x4f, 0x51, 0x01, 0x53, 0x01, 0x3c, 0x93, 0xe5, 0x7a, 0xe7, 0x31, 0x09, - 0x45, 0x92, 0x91, 0x16, 0x96, 0xd2, 0x5d, 0x5b, 0x4e, 0xf7, 0x3e, 0x80, 0x66, 0x49, 0xde, 0x34, - 0x66, 0xc9, 0x0b, 0xba, 0xaa, 0x35, 0x27, 0x31, 0xb3, 0x31, 0xec, 0x2d, 0x67, 0xfa, 0x82, 0x92, - 0x4b, 0xfa, 0x6f, 0xe3, 0xc6, 0xfe, 0x3e, 0x3c, 0xcc, 0x75, 0x27, 0x7d, 0x01, 0x2c, 0x12, 0xb2, - 0x2b, 0xbc, 0x17, 0xa3, 0x2d, 0x2d, 0x46, 0xfb, 0x47, 0x03, 0x6a, 0x2f, 0xc9, 0xab, 0x69, 0xca, - 0x9e, 0x1a, 0x60, 0x72, 0x76, 0x9e, 0xfc, 0xad, 0x25, 0x3f, 0x65, 0x9f, 0x11, 0x6c, 0x4c, 0xb9, - 0x20, 0xe3, 0x89, 0x9a, 0x5f, 0xc6, 0x73, 0x85, 0x5c, 0x54, 0x44, 0x13, 0xe6, 0xab, 0xf2, 0x6e, - 0x62, 0x2d, 0xa8, 0x47, 0x3b, 0x99, 0x8d, 0x22, 0x92, 0xe2, 0x25, 0x15, 0xf5, 0x48, 0x10, 0xb0, - 0xf0, 0x3c, 0x29, 0x6d, 0x2a, 0xca, 0x6e, 0x79, 0x41, 0xf8, 0x85, 0x2a, 0xe8, 0x26, 0x56, 0xdf, - 0xc8, 0x86, 0x4d, 0x71, 0xc1, 0xe2, 0xe0, 0x98, 0xc4, 0xb2, 0x0e, 0xc9, 0x53, 0xb2, 0xa0, 0xb3, - 0x7f, 0x0e, 0xfb, 0xb9, 0x04, 0xd2, 0xb2, 0xa4, 0xb4, 0xc8, 0x82, 0x8d, 0x4b, 0x1a, 0xcb, 0xdb, - 0x48, 0xe5, 0x54, 0xc7, 0xa9, 0x28, 0xd7, 0x3b, 0x8b, 0xa3, 0x71, 0x92, 0x92, 0xfa, 0x96, 0x2f, - 0x43, 0x11, 0x25, 0x7f, 0x64, 0x95, 0x44, 0x24, 0xd7, 0x97, 0x2f, 0x6e, 0x1a, 0x8a, 0xa1, 0x4a, - 0x52, 0x3e, 0xd0, 0x36, 0x71, 0x41, 0x67, 0xff, 0xce, 0x00, 0xb4, 0x1c, 0xc0, 0x6b, 0x16, 0xfe, - 0x08, 0x2a, 0x19, 0xed, 0xd3, 0x88, 0xce, 0xdd, 0xcb, 0x57, 0xa7, 0x82, 0xb3, 0x59, 0xe8, 0x5d, - 0xe9, 0x41, 0xd9, 0xa4, 0xdd, 0xe3, 0xf6, 0x4a, 0x0f, 0x38, 0x33, 0xb3, 0xff, 0x64, 0xc0, 0x83, - 0x65, 0xdf, 0xdd, 0x30, 0xa0, 0x3f, 0x7d, 0x83, 0x5a, 0x7d, 0xf9, 0x90, 0x77, 0x61, 0x3d, 0x3a, - 0x3b, 0xe3, 0x54, 0x24, 0xd5, 0x4d, 0x24, 0xb9, 0x0b, 0x9c, 0xfd, 0x8c, 0x26, 0xff, 0x7a, 0xaa, - 0xef, 0x45, 0x8c, 0x94, 0x33, 0x8c, 0xd8, 0x7f, 0x31, 0x60, 0xef, 0x8a, 0x2c, 0xd0, 0x73, 0xa8, - 0x24, 0x8f, 0x94, 0x94, 0xee, 0x3c, 0x7e, 0x5d, 0x8c, 0x6a, 0x52, 0x2b, 0x11, 0x12, 0xe6, 0x93, - 0x39, 0xd8, 0x3f, 0x83, 0x7a, 0x61, 0x68, 0x05, 0x91, 0xf8, 0xb0, 0x48, 0x24, 0xde, 0xbe, 0x76, - 0xb1, 0xac, 0x2a, 0x73, 0x62, 0xf1, 0xb4, 0xfe, 0x79, 0xad, 0xf5, 0xf8, 0xfd, 0x74, 0xe6, 0xe9, - 0xba, 0xfa, 0xfa, 0xc6, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xba, 0xde, 0x8a, 0xe5, 0xae, 0x16, - 0x00, 0x00, + // 2122 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcf, 0x73, 0x1b, 0x49, + 0xf5, 0xdf, 0xd1, 0x48, 0xb6, 0xf4, 0x64, 0xd9, 0x72, 0x27, 0xb1, 0x27, 0x4e, 0xb2, 0x51, 0xe6, + 0xfb, 0xdd, 0xc2, 0x1b, 0x0a, 0x67, 0xd7, 0x40, 0x91, 0xda, 0x65, 0x7f, 0x28, 0xf2, 0x90, 0xd5, + 0x26, 0x1a, 0x79, 0x5b, 0xf2, 0x06, 0xb6, 0x80, 0xa9, 0xf6, 0x4c, 0xdb, 0xee, 0x8a, 0x34, 0x23, + 0xa6, 0x5b, 0x2e, 0xc4, 0x81, 0x03, 0xf0, 0x17, 0xc0, 0x1f, 0xc0, 0x81, 0x3b, 0xfc, 0x09, 0x1c, + 0xa8, 0xe2, 0xb8, 0x77, 0x6e, 0xfc, 0x09, 0x9c, 0x39, 0x51, 0xdd, 0x3d, 0x33, 0x9a, 0x91, 0xe4, + 0x38, 0xcb, 0x42, 0x15, 0x27, 0xcd, 0x7b, 0xfd, 0xfa, 0xf5, 0xeb, 0xf7, 0x3e, 0xfd, 0xfa, 0xd3, + 0x82, 0x6d, 0x3f, 0x1a, 0x8f, 0xa7, 0x21, 0x13, 0x8c, 0xf2, 0x83, 0x49, 0x1c, 0x89, 0x08, 0x55, + 0xd5, 0xcf, 0xe9, 0xf4, 0x6c, 0xef, 0x86, 0x7f, 0x41, 0x84, 0xc7, 0x02, 0x1a, 0x0a, 0x26, 0x66, + 0x7a, 0x78, 0xaf, 0x4e, 0xc3, 0xe9, 0x98, 0xa7, 0x02, 0xbf, 0x20, 0x71, 0xa0, 0x05, 0xfb, 0x12, + 0x2a, 0x4f, 0x63, 0x12, 0x0a, 0xf4, 0x00, 0x36, 0x52, 0xb7, 0x33, 0x8f, 0x05, 0x96, 0xd1, 0x32, + 0xf6, 0x37, 0x70, 0x3d, 0xd3, 0x75, 0x03, 0x74, 0x07, 0x6a, 0x63, 0x3a, 0x3e, 0xa5, 0xb1, 0x1c, + 0x2f, 0xa9, 0xf1, 0xaa, 0x56, 0x74, 0x03, 0xb4, 0x0b, 0xeb, 0xc9, 0xca, 0x96, 0xd9, 0x32, 0xf6, + 0x6b, 0x78, 0x4d, 0x8a, 0xdd, 0x00, 0xdd, 0x84, 0x8a, 0x3f, 0x8a, 0xfc, 0x97, 0x56, 0xb9, 0x65, + 0xec, 0x97, 0xb1, 0x16, 0xec, 0xbf, 0x96, 0x60, 0xab, 0x93, 0xfa, 0xee, 0x29, 0x27, 0xe8, 0xbb, + 0x50, 0x89, 0xa3, 0x11, 0xe5, 0x96, 0xd1, 0x32, 0xf7, 0x37, 0x0f, 0xef, 0x1f, 0xa4, 0x9b, 0x3a, + 0x58, 0xb0, 0x3c, 0xc0, 0xd2, 0x0c, 0x6b, 0x6b, 0xf4, 0x29, 0x6c, 0xc7, 0xf4, 0x92, 0x92, 0x11, + 0x0d, 0x3c, 0xe2, 0xfb, 0xd1, 0x34, 0x14, 0xdc, 0x2a, 0xb5, 0xcc, 0xfd, 0xfa, 0xe1, 0xed, 0xb9, + 0x0b, 0x9c, 0x98, 0xb4, 0xb5, 0xc5, 0x93, 0x92, 0x65, 0xe0, 0x66, 0x5c, 0x54, 0x72, 0xf4, 0x10, + 0xb6, 0x47, 0x84, 0x0b, 0x6f, 0x3a, 0x09, 0x88, 0xa0, 0x9e, 0x0e, 0xdc, 0x54, 0x81, 0x6f, 0xc9, + 0x81, 0x13, 0xa5, 0xef, 0xa8, 0x2d, 0xfc, 0xda, 0x80, 0x8a, 0x0a, 0x04, 0x35, 0xa0, 0x86, 0xfb, + 0xcf, 0x1d, 0xcf, 0xed, 0xbb, 0x4e, 0xf3, 0x0d, 0xb4, 0x09, 0xa0, 0xc4, 0xfe, 0x0b, 0xd7, 0xc1, + 0x4d, 0x23, 0x93, 0xdb, 0x47, 0xbd, 0xae, 0xdb, 0x2c, 0xa3, 0x5b, 0xb0, 0xad, 0xe4, 0x61, 0xff, + 0x99, 0xe3, 0x7a, 0xbd, 0xf6, 0x60, 0xe8, 0xe0, 0x66, 0xc5, 0x2e, 0x57, 0x4b, 0xcd, 0x92, 0x5d, + 0xae, 0x9a, 0x4d, 0xf3, 0xa1, 0x36, 0xe8, 0xb5, 0xdd, 0xf6, 0x53, 0xc7, 0x3b, 0x19, 0x38, 0x78, + 0xf0, 0xf0, 0x96, 0x56, 0xf5, 0x8f, 0x1c, 0xdc, 0x1e, 0x3a, 0x5e, 0xa7, 0xef, 0x0e, 0x1d, 0x77, + 0x68, 0xff, 0xca, 0x84, 0x9d, 0x2c, 0x3d, 0xc3, 0xe8, 0x25, 0x0d, 0x7b, 0x54, 0x90, 0x80, 0x08, + 0x82, 0xce, 0x00, 0xf9, 0x51, 0x28, 0x62, 0xe2, 0x0b, 0x8f, 0x04, 0x41, 0x4c, 0x39, 0x4f, 0x92, + 0x5b, 0x3f, 0xfc, 0xde, 0x8a, 0xe4, 0x16, 0x66, 0x1f, 0x74, 0x92, 0xa9, 0xed, 0x74, 0xa6, 0x13, + 0x8a, 0x78, 0x86, 0xb7, 0xfd, 0x45, 0x3d, 0x6a, 0x41, 0x3d, 0xa0, 0xdc, 0x8f, 0xd9, 0x44, 0xb0, + 0x28, 0x54, 0xc8, 0xa8, 0xe1, 0xbc, 0x4a, 0x62, 0x80, 0x8d, 0xc9, 0x39, 0x4d, 0xa0, 0xa1, 0x05, + 0xf4, 0x1e, 0xd4, 0x84, 0x5c, 0x72, 0x38, 0x9b, 0x50, 0x85, 0x8e, 0xcd, 0xc3, 0xbb, 0x57, 0x85, + 0x25, 0x6d, 0xf0, 0xdc, 0x1c, 0xed, 0xc0, 0x1a, 0x9f, 0x8d, 0x4f, 0xa3, 0x91, 0x55, 0xd1, 0x68, + 0xd3, 0x12, 0x42, 0x50, 0x0e, 0xc9, 0x98, 0x5a, 0x6b, 0x4a, 0xab, 0xbe, 0xd1, 0x1e, 0x54, 0x03, + 0xea, 0xb3, 0x31, 0x19, 0x71, 0x6b, 0xbd, 0x65, 0xec, 0x37, 0x70, 0x26, 0xef, 0x1d, 0xc9, 0xec, + 0xad, 0xda, 0x28, 0x6a, 0x82, 0xf9, 0x92, 0xce, 0xd4, 0x39, 0x28, 0x63, 0xf9, 0x29, 0x77, 0x71, + 0x49, 0x46, 0x53, 0x9a, 0xec, 0x50, 0x0b, 0xef, 0x95, 0x1e, 0x1b, 0xf6, 0xdf, 0x0d, 0xb8, 0x99, + 0xc5, 0x7b, 0x4c, 0xe3, 0x31, 0xe3, 0x9c, 0x45, 0x21, 0x47, 0xb7, 0xa1, 0x4a, 0x43, 0xee, 0x45, + 0xe1, 0x48, 0x7b, 0xaa, 0xe2, 0x75, 0x1a, 0xf2, 0x7e, 0x38, 0x9a, 0x21, 0x0b, 0xd6, 0x27, 0x31, + 0xbb, 0x24, 0x42, 0xfb, 0xab, 0xe2, 0x54, 0x44, 0x1f, 0xc0, 0x1a, 0xf1, 0x7d, 0xca, 0xb9, 0x4a, + 0xd7, 0xe6, 0xe1, 0x5b, 0x2b, 0x92, 0x92, 0x5b, 0xe4, 0xa0, 0xad, 0x8c, 0x71, 0x32, 0xc9, 0x1e, + 0xc2, 0x9a, 0xd6, 0x20, 0x04, 0x9b, 0x27, 0xee, 0x33, 0xb7, 0xff, 0xc2, 0xf5, 0xda, 0x9d, 0x8e, + 0x33, 0x18, 0x34, 0xdf, 0x40, 0xdb, 0xd0, 0x70, 0xfb, 0x5e, 0xcf, 0xe9, 0x3d, 0x71, 0xf0, 0xe0, + 0x93, 0xee, 0x71, 0xd3, 0x40, 0x37, 0x60, 0xab, 0xeb, 0x7e, 0xde, 0x1d, 0xb6, 0x87, 0xdd, 0xbe, + 0xeb, 0xf5, 0xdd, 0xe7, 0x3f, 0x6a, 0x96, 0x24, 0x68, 0xfb, 0xae, 0x87, 0x9d, 0xcf, 0x4e, 0x9c, + 0xc1, 0xb0, 0x69, 0xda, 0xbf, 0x31, 0xa1, 0xa1, 0x2a, 0xd1, 0x89, 0x99, 0xa0, 0x31, 0x23, 0xe8, + 0x27, 0xaf, 0x80, 0xd7, 0xc1, 0x3c, 0xe4, 0xc2, 0xa4, 0xaf, 0x80, 0xaa, 0x77, 0xa0, 0x2c, 0x24, + 0x30, 0x4a, 0xaf, 0x01, 0x0c, 0x65, 0x99, 0xc3, 0x84, 0xb9, 0x12, 0x13, 0xe5, 0x1c, 0x26, 0x76, + 0x60, 0x8d, 0x8c, 0xe5, 0x99, 0x4f, 0xf1, 0xa3, 0x25, 0xd9, 0xe3, 0x14, 0xc8, 0x3c, 0x16, 0x70, + 0x6b, 0xad, 0x65, 0xee, 0x97, 0x71, 0x55, 0x29, 0xba, 0x01, 0x47, 0xf7, 0xa1, 0x2e, 0xab, 0x39, + 0x21, 0x42, 0xd0, 0x38, 0x54, 0x58, 0xaa, 0x61, 0xa0, 0x21, 0x3f, 0xd6, 0x9a, 0x02, 0xd2, 0xaa, + 0x0a, 0x38, 0xff, 0x69, 0xa4, 0xfd, 0xce, 0x04, 0xab, 0x98, 0x80, 0x39, 0x12, 0xd0, 0x26, 0x94, + 0x92, 0xce, 0x5d, 0xc3, 0x25, 0x16, 0xa0, 0xf7, 0x0b, 0x29, 0xfc, 0xc6, 0x55, 0x29, 0x9c, 0x7b, + 0x38, 0xc8, 0x65, 0xf3, 0x43, 0xd8, 0xd4, 0x99, 0xf0, 0x93, 0xda, 0x59, 0xa6, 0x2a, 0xed, 0xee, + 0x15, 0xa5, 0xc5, 0x0d, 0x51, 0x80, 0xc7, 0x6d, 0xa8, 0x26, 0x17, 0x02, 0xb7, 0xca, 0x2d, 0x73, + 0xbf, 0x86, 0xd7, 0xf5, 0x8d, 0xc0, 0xd1, 0x3d, 0x00, 0xc6, 0xbd, 0x14, 0xfd, 0x15, 0x85, 0xfe, + 0x1a, 0xe3, 0xc7, 0x5a, 0x61, 0xff, 0xc9, 0x80, 0xb2, 0x3a, 0xe4, 0x77, 0xc1, 0x4a, 0xf1, 0xab, + 0x7b, 0xe5, 0xb1, 0x83, 0x7b, 0xdd, 0xc1, 0xa0, 0xdb, 0x77, 0x9b, 0x6f, 0xa0, 0x26, 0x6c, 0x3c, + 0x71, 0x3a, 0xfd, 0x5e, 0xda, 0x58, 0x0d, 0x89, 0xed, 0x44, 0xa3, 0xf1, 0xdd, 0x2c, 0xa1, 0x9b, + 0xd0, 0xec, 0xb4, 0x5d, 0xef, 0xf3, 0xae, 0xf3, 0xc2, 0xeb, 0x7c, 0xd2, 0x76, 0x5d, 0xe7, 0x79, + 0xd3, 0x44, 0xf7, 0xe0, 0x76, 0xa6, 0x6d, 0xbb, 0x47, 0xde, 0x71, 0x7f, 0x30, 0xcc, 0x86, 0xcb, + 0x68, 0x17, 0x6e, 0x24, 0x7e, 0x8a, 0x2d, 0x1a, 0xed, 0x00, 0x2a, 0x0c, 0xe8, 0x0e, 0xbf, 0x66, + 0xff, 0xb3, 0x96, 0x3b, 0xff, 0x47, 0xc5, 0xc6, 0xa7, 0xef, 0x10, 0x23, 0x77, 0xf9, 0x21, 0x07, + 0xd6, 0xf5, 0xbd, 0x99, 0xde, 0x53, 0xdf, 0x5c, 0x51, 0x9a, 0x9c, 0x9b, 0x03, 0x7d, 0xed, 0x25, + 0x67, 0x25, 0x9d, 0x8b, 0x3e, 0x86, 0xfa, 0x64, 0xde, 0x06, 0x14, 0xe8, 0xeb, 0x87, 0x6f, 0xbe, + 0xba, 0x59, 0xe0, 0xfc, 0x14, 0x74, 0x08, 0xd5, 0x94, 0x29, 0xa8, 0x32, 0xd4, 0x0f, 0x77, 0x72, + 0xd3, 0x55, 0xb5, 0xf4, 0x28, 0xce, 0xec, 0xd0, 0x47, 0x50, 0x91, 0x75, 0xd4, 0xa7, 0xa3, 0x7e, + 0xf8, 0xf6, 0x35, 0xa1, 0x4b, 0x2f, 0x49, 0xe0, 0x7a, 0x9e, 0x04, 0xc6, 0x29, 0x09, 0xbd, 0x11, + 0xe3, 0xc2, 0x5a, 0xd7, 0xc0, 0x38, 0x25, 0xe1, 0x73, 0xc6, 0x05, 0x72, 0x01, 0x7c, 0x22, 0xe8, + 0x79, 0x14, 0x33, 0x2a, 0x4f, 0xd0, 0x42, 0x2b, 0x59, 0xbd, 0x40, 0x36, 0x41, 0xaf, 0x92, 0xf3, + 0x80, 0x1e, 0x83, 0x45, 0x62, 0xff, 0x82, 0x5d, 0x52, 0x6f, 0x4c, 0xce, 0x43, 0x2a, 0x46, 0x2c, + 0x7c, 0x99, 0xdc, 0xea, 0x35, 0x55, 0x91, 0x9d, 0x64, 0xbc, 0x97, 0x0d, 0xab, 0xcb, 0x1d, 0x3d, + 0x85, 0x4d, 0x12, 0x8c, 0x59, 0xe8, 0x71, 0x2a, 0x04, 0x0b, 0xcf, 0xb9, 0x05, 0x2a, 0x3f, 0xad, + 0x15, 0xd1, 0xb4, 0xa5, 0xe1, 0x20, 0xb1, 0xc3, 0x0d, 0x92, 0x17, 0xd1, 0xff, 0x41, 0x83, 0x85, + 0x22, 0x8e, 0xbc, 0x31, 0xe5, 0x5c, 0x5e, 0x81, 0x75, 0x75, 0x3c, 0x37, 0x94, 0xb2, 0xa7, 0x75, + 0xd2, 0x28, 0x9a, 0xe6, 0x8d, 0x36, 0xb4, 0x91, 0x52, 0xa6, 0x46, 0x2d, 0xa8, 0xd1, 0xd0, 0x8f, + 0x67, 0x13, 0x41, 0x03, 0xab, 0x21, 0x0f, 0x8d, 0x22, 0x31, 0x73, 0xa5, 0x6c, 0x74, 0x82, 0x9c, + 0x73, 0x6b, 0x53, 0x65, 0x55, 0x7d, 0x23, 0x02, 0xdb, 0xfa, 0x18, 0xe7, 0xa1, 0xb2, 0xa5, 0x32, + 0xfb, 0x9d, 0x6b, 0x32, 0xbb, 0xd0, 0x1c, 0x92, 0xfc, 0x36, 0xc5, 0x82, 0x1a, 0xfd, 0x18, 0x6e, + 0xcf, 0xa9, 0xa3, 0x1a, 0xe5, 0xde, 0x38, 0xa1, 0x11, 0x56, 0x53, 0x2d, 0xd5, 0xba, 0x8e, 0x6e, + 0xe0, 0x5d, 0xbf, 0xa0, 0xe7, 0x19, 0x8b, 0x79, 0x07, 0x6e, 0x12, 0x5f, 0xa8, 0x12, 0x6a, 0xdc, + 0x7b, 0x8a, 0xab, 0x59, 0xdb, 0xaa, 0x7e, 0x48, 0x8f, 0x25, 0x07, 0xa4, 0x23, 0x47, 0xf6, 0x4e, + 0x60, 0x23, 0x7f, 0x60, 0xf2, 0xfd, 0xb5, 0xa6, 0xfb, 0xeb, 0xa3, 0x7c, 0x7f, 0x2d, 0xd0, 0xc4, + 0x05, 0xa6, 0x99, 0x6b, 0xbd, 0x7b, 0x9f, 0x01, 0xcc, 0xc1, 0xbc, 0xc2, 0xe9, 0xb7, 0x8a, 0x4e, + 0x77, 0x57, 0x38, 0x95, 0xf3, 0xf3, 0x2e, 0xbf, 0x80, 0xad, 0x05, 0xf8, 0xae, 0xf0, 0xfb, 0x6e, + 0xd1, 0xef, 0x9d, 0x55, 0x7e, 0xb5, 0x93, 0x59, 0xde, 0xf7, 0x39, 0xdc, 0x5a, 0x59, 0xc0, 0x15, + 0x2b, 0x3c, 0x2e, 0xae, 0x60, 0x5f, 0x7f, 0x51, 0xe4, 0xaf, 0xa4, 0x9f, 0xe6, 0x08, 0x68, 0xe1, + 0x28, 0xa0, 0x23, 0xb8, 0x3f, 0x61, 0x61, 0x0a, 0x6a, 0x8f, 0x8c, 0x46, 0x59, 0x0d, 0x69, 0x48, + 0x4e, 0x47, 0x34, 0x48, 0x48, 0xd1, 0x9d, 0x09, 0x0b, 0x13, 0x98, 0xb7, 0x47, 0xa3, 0xac, 0x78, + 0xca, 0xc4, 0xfe, 0x5b, 0x09, 0x1a, 0x85, 0x0c, 0xa2, 0x0f, 0xe7, 0xfd, 0x53, 0xd3, 0x8d, 0xff, + 0xbf, 0x22, 0xd7, 0xaf, 0xd7, 0x38, 0x4b, 0x5f, 0xaf, 0x71, 0x9a, 0xaf, 0xd9, 0x38, 0xef, 0x43, + 0x3d, 0x69, 0x4d, 0xea, 0x81, 0xa5, 0xd9, 0x48, 0xda, 0xad, 0xe4, 0xfb, 0x6a, 0x0f, 0xaa, 0x93, + 0x88, 0x33, 0x45, 0xa2, 0x65, 0x37, 0xae, 0xe0, 0x4c, 0xfe, 0x2f, 0x61, 0xda, 0x0e, 0x60, 0x7b, + 0x09, 0x44, 0x8b, 0x81, 0x1a, 0x4b, 0x81, 0xa6, 0x84, 0xaa, 0x54, 0x24, 0xd9, 0x59, 0xf0, 0x66, + 0x31, 0x78, 0xfb, 0xb7, 0x06, 0x6c, 0x2d, 0xbc, 0xbf, 0x24, 0xfd, 0x4d, 0x48, 0x63, 0xb2, 0x40, + 0x2a, 0xa2, 0xbb, 0x50, 0xe3, 0xec, 0x3c, 0x24, 0x62, 0x1a, 0xd3, 0xe4, 0x99, 0x39, 0x57, 0x48, + 0x82, 0xe6, 0x5f, 0x10, 0xa6, 0x09, 0x9a, 0xa9, 0x09, 0x9a, 0x52, 0x48, 0x62, 0xf1, 0x10, 0x9a, + 0x8c, 0xb7, 0x59, 0x1c, 0xc4, 0xd1, 0x24, 0x21, 0x59, 0x2a, 0xcf, 0x55, 0xbc, 0xa4, 0xb7, 0xff, + 0x61, 0xe4, 0x70, 0x8b, 0xe9, 0xcf, 0xa6, 0x94, 0x8b, 0x61, 0xf4, 0x69, 0xc4, 0xae, 0xba, 0xb5, + 0x13, 0x2e, 0x9f, 0xdb, 0xb9, 0xe4, 0xf2, 0xae, 0xdc, 0xfc, 0x95, 0x8f, 0xdf, 0xc5, 0x57, 0x75, + 0x79, 0xf9, 0x55, 0xfd, 0x00, 0x36, 0x02, 0xc6, 0x27, 0x23, 0x32, 0xd3, 0xae, 0x2b, 0xc9, 0xf3, + 0x49, 0xeb, 0x94, 0xfb, 0x1f, 0xac, 0x7a, 0xe1, 0xae, 0x5d, 0xf3, 0xc2, 0x5d, 0x7e, 0xdd, 0xda, + 0xbf, 0x37, 0xe0, 0x6e, 0xb6, 0x65, 0x27, 0x60, 0x62, 0x70, 0x41, 0x62, 0x1a, 0xcc, 0x39, 0xf7, + 0xea, 0x8d, 0x2f, 0x6e, 0xa2, 0xb4, 0xbc, 0x89, 0x95, 0x11, 0x9a, 0x5f, 0x3d, 0xc2, 0x3f, 0xe6, + 0x23, 0xec, 0x90, 0xd0, 0xa7, 0xa3, 0xff, 0xe9, 0xd2, 0xd8, 0x5f, 0x96, 0xe0, 0xcd, 0xd5, 0x28, + 0xc2, 0x94, 0x4f, 0xa2, 0x90, 0xd3, 0x2b, 0x42, 0xfe, 0x3e, 0xd4, 0xb2, 0xa5, 0x5e, 0xd1, 0x81, + 0x72, 0xf7, 0x31, 0x9e, 0x4f, 0x90, 0xa7, 0x4d, 0xbe, 0xf6, 0x14, 0x15, 0x30, 0x15, 0xc0, 0x33, + 0x59, 0xae, 0x77, 0x1e, 0x93, 0x50, 0x24, 0x3b, 0xd2, 0xc2, 0xd2, 0x76, 0x2b, 0xcb, 0xdb, 0xbd, + 0x07, 0xa0, 0x59, 0x92, 0x37, 0x8d, 0x59, 0xf2, 0x82, 0xae, 0x69, 0xcd, 0x49, 0xcc, 0xd0, 0x07, + 0x70, 0x47, 0xc6, 0x47, 0x7d, 0x41, 0x03, 0x4f, 0x44, 0x13, 0xe6, 0xa7, 0x14, 0xde, 0x93, 0xad, + 0x68, 0x5d, 0x39, 0xb4, 0x32, 0x93, 0xa1, 0xb4, 0x48, 0x28, 0xfd, 0x33, 0x3a, 0x43, 0x6f, 0x41, + 0x45, 0xfd, 0xf1, 0xa4, 0x1e, 0x46, 0xf5, 0xc3, 0xad, 0xf9, 0x66, 0x25, 0x0a, 0x03, 0xac, 0x47, + 0x6d, 0x0c, 0xbb, 0xcb, 0xf9, 0x7c, 0x4e, 0xc9, 0x25, 0xfd, 0xb7, 0xd1, 0x69, 0xff, 0x10, 0x1e, + 0xe4, 0x7a, 0xa0, 0xbe, 0x66, 0x16, 0x69, 0xdf, 0x15, 0xde, 0x8b, 0x39, 0x29, 0x2d, 0xe4, 0xc4, + 0xfe, 0xb3, 0x01, 0xf5, 0x17, 0xe4, 0xe5, 0x34, 0xe5, 0x68, 0x4d, 0x30, 0x39, 0x3b, 0x4f, 0xfe, + 0x3c, 0x93, 0x9f, 0xb2, 0x9b, 0x09, 0x36, 0xa6, 0x5c, 0x90, 0xf1, 0x44, 0xcd, 0x2f, 0xe3, 0xb9, + 0x42, 0x2e, 0xaa, 0x32, 0xa9, 0x8a, 0xb8, 0x81, 0xb5, 0xa0, 0xfe, 0x1a, 0x20, 0xb3, 0x51, 0x44, + 0x52, 0x54, 0xa6, 0xa2, 0x1e, 0x09, 0x02, 0x16, 0x9e, 0x27, 0x05, 0x4c, 0x45, 0xd9, 0x93, 0x2f, + 0x08, 0xbf, 0x50, 0x65, 0xdb, 0xc0, 0xea, 0x1b, 0xd9, 0xb0, 0x21, 0x2e, 0x58, 0x1c, 0x1c, 0x93, + 0x58, 0xe6, 0x21, 0x79, 0xb0, 0x16, 0x74, 0xf6, 0x2f, 0x61, 0x2f, 0xb7, 0x81, 0x34, 0x2d, 0x29, + 0xf9, 0xb2, 0x60, 0xfd, 0x92, 0xc6, 0xf2, 0xce, 0x53, 0x7b, 0x6a, 0xe0, 0x54, 0x94, 0xeb, 0x9d, + 0xc5, 0xd1, 0x38, 0xd9, 0x92, 0xfa, 0x96, 0xef, 0x4f, 0x11, 0x25, 0x7f, 0x97, 0x95, 0x44, 0x24, + 0xd7, 0x97, 0xef, 0x7a, 0x1a, 0x0a, 0x05, 0x06, 0xf5, 0x0c, 0xdc, 0xc0, 0x05, 0x9d, 0xfd, 0x07, + 0x03, 0xd0, 0x72, 0x00, 0xaf, 0x58, 0xf8, 0x63, 0xa8, 0x66, 0xe4, 0x52, 0x9f, 0x9b, 0xdc, 0xed, + 0x7f, 0xf5, 0x56, 0x70, 0x36, 0x0b, 0xbd, 0x2b, 0x3d, 0x28, 0x9b, 0xb4, 0x47, 0xdd, 0x5a, 0xe9, + 0x01, 0x67, 0x66, 0xf6, 0x5f, 0x0c, 0xb8, 0xbf, 0xec, 0xbb, 0x1b, 0x06, 0xf4, 0xe7, 0xaf, 0x91, + 0xab, 0xaf, 0x1f, 0xf2, 0x0e, 0xac, 0x45, 0x67, 0x67, 0x9c, 0x8a, 0x24, 0xbb, 0x89, 0x24, 0xab, + 0xc0, 0xd9, 0x2f, 0x68, 0xf2, 0xdf, 0xaa, 0xfa, 0x5e, 0xc4, 0x48, 0x39, 0xc3, 0x88, 0xfd, 0xa5, + 0x01, 0xbb, 0x57, 0xec, 0x02, 0x3d, 0x83, 0x6a, 0xf2, 0x14, 0x4a, 0x49, 0xd5, 0xa3, 0x57, 0xc5, + 0xa8, 0x26, 0x1d, 0x24, 0x42, 0xc2, 0xaf, 0x32, 0x07, 0x7b, 0x67, 0xd0, 0x28, 0x0c, 0xad, 0xa0, + 0x2b, 0x1f, 0x15, 0xe9, 0xca, 0xdb, 0xd7, 0x2e, 0x96, 0x65, 0x65, 0x4e, 0x5f, 0x9e, 0x34, 0xbe, + 0xa8, 0x1f, 0x3c, 0x7a, 0x3f, 0x9d, 0x79, 0xba, 0xa6, 0xbe, 0xbe, 0xfd, 0xaf, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xa6, 0x25, 0xae, 0xc0, 0x21, 0x17, 0x00, 0x00, } diff --git a/protocol/protobuf/communities.proto b/protocol/protobuf/communities.proto index 96f20f651..37ec60797 100644 --- a/protocol/protobuf/communities.proto +++ b/protocol/protobuf/communities.proto @@ -3,6 +3,7 @@ syntax = "proto3"; option go_package = "./;protobuf"; import "chat_identity.proto"; import "enums.proto"; +import "shard.proto"; package protobuf; @@ -155,6 +156,8 @@ message CommunityRequestToJoinResponse { bytes grant = 4; bytes community_id = 5; string magnet_uri = 6; + bytes protected_topic_private_key = 7; + Shard shard = 8; } message CommunityRequestToLeave { diff --git a/protocol/protobuf/community_shard_key.pb.go b/protocol/protobuf/community_shard_key.pb.go new file mode 100644 index 000000000..60c1c3500 --- /dev/null +++ b/protocol/protobuf/community_shard_key.pb.go @@ -0,0 +1,107 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: community_shard_key.proto + +package protobuf + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type CommunityShardKey struct { + CommunityId []byte `protobuf:"bytes,1,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"` + PrivateKey []byte `protobuf:"bytes,2,opt,name=private_key,json=privateKey,proto3" json:"private_key,omitempty"` + Clock uint64 `protobuf:"varint,3,opt,name=clock,proto3" json:"clock,omitempty"` + Shard *Shard `protobuf:"bytes,4,opt,name=shard,proto3" json:"shard,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CommunityShardKey) Reset() { *m = CommunityShardKey{} } +func (m *CommunityShardKey) String() string { return proto.CompactTextString(m) } +func (*CommunityShardKey) ProtoMessage() {} +func (*CommunityShardKey) Descriptor() ([]byte, []int) { + return fileDescriptor_03da8310cde9b7b2, []int{0} +} + +func (m *CommunityShardKey) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CommunityShardKey.Unmarshal(m, b) +} +func (m *CommunityShardKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CommunityShardKey.Marshal(b, m, deterministic) +} +func (m *CommunityShardKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_CommunityShardKey.Merge(m, src) +} +func (m *CommunityShardKey) XXX_Size() int { + return xxx_messageInfo_CommunityShardKey.Size(m) +} +func (m *CommunityShardKey) XXX_DiscardUnknown() { + xxx_messageInfo_CommunityShardKey.DiscardUnknown(m) +} + +var xxx_messageInfo_CommunityShardKey proto.InternalMessageInfo + +func (m *CommunityShardKey) GetCommunityId() []byte { + if m != nil { + return m.CommunityId + } + return nil +} + +func (m *CommunityShardKey) GetPrivateKey() []byte { + if m != nil { + return m.PrivateKey + } + return nil +} + +func (m *CommunityShardKey) GetClock() uint64 { + if m != nil { + return m.Clock + } + return 0 +} + +func (m *CommunityShardKey) GetShard() *Shard { + if m != nil { + return m.Shard + } + return nil +} + +func init() { + proto.RegisterType((*CommunityShardKey)(nil), "protobuf.CommunityShardKey") +} + +func init() { + proto.RegisterFile("community_shard_key.proto", fileDescriptor_03da8310cde9b7b2) +} + +var fileDescriptor_03da8310cde9b7b2 = []byte{ + // 173 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xce, 0xcf, 0xcd, + 0x2d, 0xcd, 0xcb, 0x2c, 0xa9, 0x8c, 0x2f, 0xce, 0x48, 0x2c, 0x4a, 0x89, 0xcf, 0x4e, 0xad, 0xd4, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53, 0x49, 0xa5, 0x69, 0x52, 0xdc, 0x60, 0x29, + 0x88, 0xb0, 0xd2, 0x14, 0x46, 0x2e, 0x41, 0x67, 0x98, 0xa6, 0x60, 0x90, 0x84, 0x77, 0x6a, 0xa5, + 0x90, 0x22, 0x17, 0x0f, 0xc2, 0xa4, 0xcc, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x9e, 0x20, 0x6e, + 0xb8, 0x98, 0x67, 0x8a, 0x90, 0x3c, 0x17, 0x77, 0x41, 0x51, 0x66, 0x59, 0x62, 0x49, 0x2a, 0xc8, + 0x12, 0x09, 0x26, 0xb0, 0x0a, 0x2e, 0xa8, 0x10, 0xc8, 0x0c, 0x11, 0x2e, 0xd6, 0xe4, 0x9c, 0xfc, + 0xe4, 0x6c, 0x09, 0x66, 0x05, 0x46, 0x0d, 0x96, 0x20, 0x08, 0x47, 0x48, 0x95, 0x8b, 0x15, 0x6c, + 0xbd, 0x04, 0x8b, 0x02, 0xa3, 0x06, 0xb7, 0x11, 0xbf, 0x1e, 0xcc, 0x59, 0x7a, 0x60, 0xcb, 0x83, + 0x20, 0xb2, 0x4e, 0xbc, 0x51, 0xdc, 0x7a, 0xfa, 0xd6, 0x30, 0xb9, 0x24, 0x36, 0x30, 0xcb, 0x18, + 0x10, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xda, 0x17, 0x6d, 0xe0, 0x00, 0x00, 0x00, +} diff --git a/protocol/protobuf/community_shard_key.proto b/protocol/protobuf/community_shard_key.proto new file mode 100644 index 000000000..032cf64d4 --- /dev/null +++ b/protocol/protobuf/community_shard_key.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +option go_package = "./;protobuf"; + +package protobuf; + +import "shard.proto"; + +message CommunityShardKey { + bytes community_id = 1; + bytes private_key = 2; + uint64 clock = 3; + Shard shard = 4; +} diff --git a/protocol/protobuf/service.go b/protocol/protobuf/service.go index 986927b39..897de5b72 100644 --- a/protocol/protobuf/service.go +++ b/protocol/protobuf/service.go @@ -4,7 +4,7 @@ import ( "github.com/golang/protobuf/proto" ) -//go:generate protoc --go_out=. ./chat_message.proto ./application_metadata_message.proto ./membership_update_message.proto ./command.proto ./contact.proto ./pairing.proto ./push_notifications.proto ./emoji_reaction.proto ./enums.proto ./group_chat_invitation.proto ./chat_identity.proto ./communities.proto ./pin_message.proto ./anon_metrics.proto ./status_update.proto ./sync_settings.proto ./contact_verification.proto ./community_update.proto ./url_data.proto ./community_privileged_user_sync_message.proto +//go:generate protoc --go_out=. ./chat_message.proto ./application_metadata_message.proto ./membership_update_message.proto ./command.proto ./contact.proto ./pairing.proto ./push_notifications.proto ./emoji_reaction.proto ./enums.proto ./shard.proto ./group_chat_invitation.proto ./chat_identity.proto ./communities.proto ./pin_message.proto ./anon_metrics.proto ./status_update.proto ./sync_settings.proto ./contact_verification.proto ./community_update.proto ./community_shard_key.proto ./url_data.proto ./community_privileged_user_sync_message.proto func Unmarshal(payload []byte) (*ApplicationMetadataMessage, error) { var message ApplicationMetadataMessage diff --git a/protocol/protobuf/shard.pb.go b/protocol/protobuf/shard.pb.go new file mode 100644 index 000000000..50c2c3d98 --- /dev/null +++ b/protocol/protobuf/shard.pb.go @@ -0,0 +1,87 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: shard.proto + +package protobuf + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type Shard struct { + Cluster int32 `protobuf:"varint,1,opt,name=cluster,proto3" json:"cluster,omitempty"` + Index int32 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Shard) Reset() { *m = Shard{} } +func (m *Shard) String() string { return proto.CompactTextString(m) } +func (*Shard) ProtoMessage() {} +func (*Shard) Descriptor() ([]byte, []int) { + return fileDescriptor_319ea41e44cdc364, []int{0} +} + +func (m *Shard) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Shard.Unmarshal(m, b) +} +func (m *Shard) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Shard.Marshal(b, m, deterministic) +} +func (m *Shard) XXX_Merge(src proto.Message) { + xxx_messageInfo_Shard.Merge(m, src) +} +func (m *Shard) XXX_Size() int { + return xxx_messageInfo_Shard.Size(m) +} +func (m *Shard) XXX_DiscardUnknown() { + xxx_messageInfo_Shard.DiscardUnknown(m) +} + +var xxx_messageInfo_Shard proto.InternalMessageInfo + +func (m *Shard) GetCluster() int32 { + if m != nil { + return m.Cluster + } + return 0 +} + +func (m *Shard) GetIndex() int32 { + if m != nil { + return m.Index + } + return 0 +} + +func init() { + proto.RegisterType((*Shard)(nil), "protobuf.Shard") +} + +func init() { + proto.RegisterFile("shard.proto", fileDescriptor_319ea41e44cdc364) +} + +var fileDescriptor_319ea41e44cdc364 = []byte{ + // 99 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2e, 0xce, 0x48, 0x2c, + 0x4a, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53, 0x49, 0xa5, 0x69, 0x4a, 0xe6, + 0x5c, 0xac, 0xc1, 0x20, 0x09, 0x21, 0x09, 0x2e, 0xf6, 0xe4, 0x9c, 0xd2, 0xe2, 0x92, 0xd4, 0x22, + 0x09, 0x46, 0x05, 0x46, 0x0d, 0xd6, 0x20, 0x18, 0x57, 0x48, 0x84, 0x8b, 0x35, 0x33, 0x2f, 0x25, + 0xb5, 0x42, 0x82, 0x09, 0x2c, 0x0e, 0xe1, 0x38, 0xf1, 0x46, 0x71, 0xeb, 0xe9, 0x5b, 0xc3, 0xcc, + 0x49, 0x62, 0x03, 0xb3, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xef, 0xcf, 0x9d, 0x21, 0x67, + 0x00, 0x00, 0x00, +} diff --git a/protocol/protobuf/shard.proto b/protocol/protobuf/shard.proto new file mode 100644 index 000000000..dac590ff5 --- /dev/null +++ b/protocol/protobuf/shard.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option go_package = "./;protobuf"; +package protobuf; + +message Shard { + int32 cluster = 1; + int32 index = 2; +} + \ No newline at end of file diff --git a/protocol/protobuf/url_data.pb.go b/protocol/protobuf/url_data.pb.go index c8f1cdc6e..5ce9fc21f 100644 --- a/protocol/protobuf/url_data.pb.go +++ b/protocol/protobuf/url_data.pb.go @@ -228,6 +228,7 @@ func (m *User) GetColor() string { type URLData struct { // Community, Channel, or User Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` + Shard *Shard `protobuf:"bytes,2,opt,name=shard,proto3" json:"shard,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -265,6 +266,13 @@ func (m *URLData) GetContent() []byte { return nil } +func (m *URLData) GetShard() *Shard { + if m != nil { + return m.Shard + } + return nil +} + func init() { proto.RegisterType((*Community)(nil), "protobuf.Community") proto.RegisterType((*Channel)(nil), "protobuf.Channel") @@ -277,24 +285,26 @@ func init() { } var fileDescriptor_5f1e15b5f0115710 = []byte{ - // 295 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x90, 0xb1, 0x4e, 0xeb, 0x30, - 0x14, 0x86, 0xe5, 0xdb, 0xa6, 0xbd, 0x39, 0x69, 0x18, 0x4c, 0x07, 0x6f, 0x84, 0x74, 0xc9, 0x14, - 0x04, 0x8c, 0x6c, 0x94, 0x05, 0x09, 0x31, 0x58, 0xea, 0xc2, 0x12, 0x39, 0x8e, 0x29, 0x46, 0xb1, - 0x1d, 0x39, 0xf6, 0xd0, 0x77, 0xe2, 0x25, 0x78, 0x33, 0x84, 0x93, 0x50, 0x16, 0xb6, 0x4e, 0x3e, - 0xff, 0xa7, 0xa3, 0xe3, 0x4f, 0x3f, 0x9c, 0x79, 0xdb, 0x56, 0x0d, 0x73, 0xac, 0xec, 0xac, 0x71, - 0x06, 0xff, 0x0f, 0x4f, 0xed, 0x5f, 0xf3, 0x0f, 0x04, 0xf1, 0xd6, 0x28, 0xe5, 0xb5, 0x74, 0x07, - 0x7c, 0x09, 0xab, 0x46, 0xf6, 0x5d, 0xcb, 0x0e, 0x95, 0x66, 0x4a, 0x10, 0x94, 0xa1, 0x22, 0xa6, - 0xc9, 0xc8, 0x9e, 0x99, 0x12, 0x38, 0x83, 0xa4, 0x11, 0x3d, 0xb7, 0xb2, 0x73, 0xd2, 0x68, 0xf2, - 0x6f, 0xdc, 0x38, 0x22, 0xbc, 0x81, 0x54, 0x09, 0x55, 0x0b, 0xdb, 0x57, 0xdc, 0x78, 0xed, 0xc8, - 0x2c, 0x43, 0x45, 0x4a, 0x57, 0x23, 0xdc, 0x7e, 0x33, 0xbc, 0x86, 0x88, 0x9b, 0xd6, 0x58, 0x32, - 0x0f, 0x07, 0x86, 0x80, 0x2f, 0x20, 0x71, 0x6c, 0x5f, 0x49, 0xdd, 0x48, 0x2e, 0x7a, 0x12, 0x65, - 0xb3, 0x22, 0xa5, 0xe0, 0xd8, 0xfe, 0x71, 0x20, 0xf9, 0x27, 0x82, 0xe5, 0xf6, 0x8d, 0x69, 0x2d, - 0xda, 0xd3, 0xc8, 0xae, 0x21, 0x12, 0xca, 0xbc, 0xcb, 0x20, 0x19, 0xd3, 0x21, 0xfc, 0x61, 0x77, - 0x0d, 0x31, 0x9f, 0xaa, 0x22, 0x51, 0x86, 0x8a, 0xe4, 0xe6, 0xbc, 0x9c, 0x9a, 0x2c, 0x7f, 0x5a, - 0xa4, 0xc7, 0x2d, 0x8c, 0x61, 0xee, 0xbd, 0x6c, 0xc8, 0x22, 0xdc, 0x09, 0x73, 0xce, 0x60, 0xbe, - 0xeb, 0x85, 0x3d, 0x99, 0xff, 0x60, 0x3a, 0xfb, 0x65, 0x9a, 0x6f, 0x60, 0xb9, 0xa3, 0x4f, 0x0f, - 0xcc, 0x31, 0x4c, 0x60, 0xc9, 0x8d, 0x76, 0x42, 0xbb, 0xf0, 0xc1, 0x8a, 0x4e, 0xf1, 0x3e, 0x7d, - 0x49, 0xca, 0xab, 0xbb, 0xc9, 0xbf, 0x5e, 0x84, 0xe9, 0xf6, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xd1, - 0x08, 0xbf, 0x32, 0x2c, 0x02, 0x00, 0x00, + // 321 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x92, 0xb1, 0x4e, 0xc3, 0x30, + 0x10, 0x40, 0x15, 0xda, 0xb4, 0xe4, 0xdc, 0x80, 0x64, 0x3a, 0x58, 0x2c, 0x84, 0x20, 0xa4, 0x4c, + 0x41, 0x94, 0x91, 0x8d, 0xb2, 0x80, 0x10, 0x83, 0x51, 0x17, 0x96, 0xc8, 0x4d, 0x4c, 0x6b, 0x14, + 0xdb, 0x95, 0xe3, 0x0c, 0xfd, 0x27, 0x7e, 0x82, 0x3f, 0x43, 0xb5, 0x1b, 0xc2, 0xc2, 0xd6, 0xc9, + 0x77, 0xef, 0x4e, 0xe7, 0xe7, 0x93, 0xe1, 0xa4, 0x35, 0x75, 0x51, 0x31, 0xcb, 0xf2, 0x8d, 0xd1, + 0x56, 0xe3, 0x63, 0x77, 0x2c, 0xdb, 0x8f, 0x73, 0xd4, 0xac, 0x99, 0xa9, 0x3c, 0x4e, 0xbf, 0x02, + 0x88, 0xe6, 0x5a, 0xca, 0x56, 0x09, 0xbb, 0xc5, 0x97, 0x30, 0xa9, 0x44, 0xb3, 0xa9, 0xd9, 0xb6, + 0x50, 0x4c, 0x72, 0x12, 0x24, 0x41, 0x16, 0x51, 0xb4, 0x67, 0xaf, 0x4c, 0x72, 0x9c, 0x00, 0xaa, + 0x78, 0x53, 0x1a, 0xb1, 0xb1, 0x42, 0x2b, 0x72, 0xb4, 0xef, 0xe8, 0x11, 0xbe, 0x82, 0x58, 0x72, + 0xb9, 0xe4, 0xa6, 0x29, 0x4a, 0xdd, 0x2a, 0x4b, 0x06, 0x49, 0x90, 0xc5, 0x74, 0xb2, 0x87, 0xf3, + 0x1d, 0xc3, 0x53, 0x08, 0x4b, 0x5d, 0x6b, 0x43, 0x86, 0x6e, 0x80, 0x4f, 0xf0, 0x05, 0x20, 0xcb, + 0x56, 0x85, 0x50, 0x95, 0x28, 0x79, 0x43, 0xc2, 0x64, 0x90, 0xc5, 0x14, 0x2c, 0x5b, 0x3d, 0x79, + 0x92, 0x7e, 0x07, 0x30, 0x9e, 0xaf, 0x99, 0x52, 0xbc, 0x3e, 0x8c, 0xec, 0x14, 0x42, 0x2e, 0xf5, + 0xa7, 0x70, 0x92, 0x11, 0xf5, 0xc9, 0x3f, 0x76, 0xb7, 0x10, 0x95, 0xdd, 0xaa, 0x48, 0x98, 0x04, + 0x19, 0x9a, 0x9d, 0xe5, 0xdd, 0x5a, 0xf3, 0xdf, 0x2d, 0xd2, 0xbe, 0x0b, 0x63, 0x18, 0xb6, 0xad, + 0xa8, 0xc8, 0xc8, 0xcd, 0x71, 0x71, 0xca, 0x60, 0xb8, 0x68, 0xb8, 0x39, 0x98, 0xbf, 0x37, 0x1d, + 0xfc, 0x31, 0x4d, 0x9f, 0x61, 0xbc, 0xa0, 0x2f, 0x8f, 0xcc, 0x32, 0x4c, 0x60, 0x5c, 0x6a, 0x65, + 0xb9, 0xb2, 0xee, 0x82, 0x09, 0xed, 0x52, 0x7c, 0x0d, 0xa1, 0xfb, 0x09, 0x6e, 0x2c, 0x9a, 0x9d, + 0xf6, 0x4f, 0x79, 0xdb, 0x61, 0xea, 0xab, 0x0f, 0xf1, 0x3b, 0xca, 0x6f, 0xee, 0xbb, 0xda, 0x72, + 0xe4, 0xa2, 0xbb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x71, 0x2e, 0xf3, 0xde, 0x60, 0x02, 0x00, + 0x00, } diff --git a/protocol/protobuf/url_data.proto b/protocol/protobuf/url_data.proto index 91c6f00b1..bc3a501ae 100644 --- a/protocol/protobuf/url_data.proto +++ b/protocol/protobuf/url_data.proto @@ -3,6 +3,8 @@ syntax = "proto3"; option go_package = "./;protobuf"; package protobuf; +import "shard.proto"; + message Community { string display_name = 1; string description = 2; @@ -29,4 +31,5 @@ message User { message URLData { // Community, Channel, or User bytes content = 1; + Shard shard = 2; } diff --git a/protocol/requests/set_community_shard.go b/protocol/requests/set_community_shard.go new file mode 100644 index 000000000..ea2f35d33 --- /dev/null +++ b/protocol/requests/set_community_shard.go @@ -0,0 +1,30 @@ +package requests + +import ( + "errors" + + "github.com/status-im/status-go/eth-node/types" + "github.com/status-im/status-go/protocol/common" +) + +type SetCommunityShard struct { + CommunityID types.HexBytes `json:"communityId"` + Shard *common.Shard `json:"shard,omitempty"` + PrivateKey *types.HexBytes `json:"privateKey,omitempty"` +} + +func (s *SetCommunityShard) Validate() error { + if s == nil { + return errors.New("invalid request") + } + if s.Shard != nil { + // TODO: for now only MainStatusShard(16) is accepted + if s.Shard.Cluster != common.MainStatusShard { + return errors.New("invalid shard cluster") + } + if s.Shard.Index > 1023 { + return errors.New("invalid shard index. Only 0-1023 is allowed") + } + } + return nil +} diff --git a/protocol/transport/filters_manager.go b/protocol/transport/filters_manager.go index 50f0cb601..4aad63f9b 100644 --- a/protocol/transport/filters_manager.go +++ b/protocol/transport/filters_manager.go @@ -8,9 +8,10 @@ import ( "sync" "github.com/pkg/errors" - "github.com/waku-org/go-waku/waku/v2/protocol/relay" "go.uber.org/zap" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + "github.com/status-im/status-go/eth-node/types" ) @@ -18,6 +19,11 @@ const ( minPow = 0.0 ) +type Shard struct { + Cluster uint16 + Index uint16 +} + type RawFilter struct { FilterID string Topic types.TopicType @@ -131,7 +137,7 @@ func (f *FiltersManager) InitPublicFilters(publicFiltersToInit []FiltersToInitia var filters []*Filter // Add public, one-to-one and negotiated filters. for _, pf := range publicFiltersToInit { - f, err := f.LoadPublic(pf.ChatID, pf.PubsubTopic) // TODO: pubsubtopic + f, err := f.LoadPublic(pf.ChatID, pf.PubsubTopic) if err != nil { return nil, err } @@ -141,8 +147,8 @@ func (f *FiltersManager) InitPublicFilters(publicFiltersToInit []FiltersToInitia } type CommunityFilterToInitialize struct { - CommunityID []byte - PrivKey *ecdsa.PrivateKey + Shard *Shard + PrivKey *ecdsa.PrivateKey } func (f *FiltersManager) InitCommunityFilters(communityFiltersToInitialize []CommunityFilterToInitialize) ([]*Filter, error) { @@ -151,30 +157,43 @@ func (f *FiltersManager) InitCommunityFilters(communityFiltersToInitialize []Com defer f.mutex.Unlock() for _, cf := range communityFiltersToInitialize { - pubsubTopic := GetPubsubTopic(cf.CommunityID) - identityStr := PublicKeyToStr(&cf.PrivKey.PublicKey) - rawFilter, err := f.addAsymmetric(identityStr, pubsubTopic, cf.PrivKey, true) - if err != nil { - f.logger.Debug("could not register community filter", zap.Error(err)) - return nil, err - - } - filterID := identityStr + "-admin" - filter := &Filter{ - ChatID: filterID, - FilterID: rawFilter.FilterID, - PubsubTopic: pubsubTopic, - ContentTopic: rawFilter.Topic, - Identity: identityStr, - Listen: true, - OneToOne: true, + if cf.PrivKey == nil { + continue } - f.filters[filterID] = filter + communityPubsubTopic := GetPubsubTopic(cf.Shard) + topics := []string{communityPubsubTopic} + if communityPubsubTopic != relay.DefaultWakuTopic { + topics = append(topics, relay.DefaultWakuTopic) + } - f.logger.Debug("registering filter for", zap.String("chatID", filterID), zap.String("type", "community"), zap.String("topic", rawFilter.Topic.String())) + // TODO: requests to join / cancels are currently being sent into the default waku topic. + // They must be sent into an specific non protected shard + for _, pubsubTopic := range topics { + identityStr := PublicKeyToStr(&cf.PrivKey.PublicKey) + rawFilter, err := f.addAsymmetric(identityStr, pubsubTopic, cf.PrivKey, true) + if err != nil { + f.logger.Debug("could not register community filter", zap.Error(err)) + return nil, err - filters = append(filters, filter) + } + filterID := identityStr + "-admin" + filter := &Filter{ + ChatID: filterID, + FilterID: rawFilter.FilterID, + PubsubTopic: pubsubTopic, + ContentTopic: rawFilter.Topic, + Identity: identityStr, + Listen: true, + OneToOne: true, + } + + f.filters[filterID] = filter + + f.logger.Debug("registering filter for", zap.String("chatID", filterID), zap.String("type", "community"), zap.String("topic", rawFilter.Topic.String())) + + filters = append(filters, filter) + } } return filters, nil } diff --git a/protocol/transport/transport.go b/protocol/transport/transport.go index ecf14a44f..dd08ae294 100644 --- a/protocol/transport/transport.go +++ b/protocol/transport/transport.go @@ -13,9 +13,11 @@ import ( "github.com/google/uuid" "github.com/libp2p/go-libp2p/core/peer" "github.com/pkg/errors" - "github.com/waku-org/go-waku/waku/v2/protocol/relay" "go.uber.org/zap" + "github.com/waku-org/go-waku/waku/v2/protocol" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + "github.com/ethereum/go-ethereum/common" "github.com/status-im/status-go/connection" "github.com/status-im/status-go/eth-node/crypto" @@ -672,6 +674,14 @@ func (t *Transport) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) return t.waku.StorePubsubTopicKey(topic, privKey) } -func GetPubsubTopic(communityID []byte) string { +func (t *Transport) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) { + return t.waku.RetrievePubsubTopicKey(topic) +} + +func GetPubsubTopic(shard *Shard) string { + if shard != nil { + return protocol.NewStaticShardingPubsubTopic(shard.Cluster, shard.Index).String() + } + return relay.DefaultWakuTopic } diff --git a/services/ext/api.go b/services/ext/api.go index bf40d9376..8eb6a9f53 100644 --- a/services/ext/api.go +++ b/services/ext/api.go @@ -436,6 +436,11 @@ func (api *PublicAPI) RemovePrivateKey(id types.HexBytes) (*protocol.MessengerRe return api.service.messenger.RemovePrivateKey(id) } +// Sets the community shard for a community and updates all active filters for the community +func (api *PublicAPI) SetCommunityShard(request *requests.SetCommunityShard) (*protocol.MessengerResponse, error) { + return api.service.messenger.SetCommunityShard(request) +} + // ExportCommunity exports the private key of the community with given ID func (api *PublicAPI) ExportCommunity(id types.HexBytes) (types.HexBytes, error) { key, err := api.service.messenger.ExportCommunity(id) @@ -1169,12 +1174,22 @@ func (api *PublicAPI) EnsVerified(pk, ensName string) error { return api.service.messenger.ENSVerified(pk, ensName) } +// DEPRECATED func (api *PublicAPI) RequestCommunityInfoFromMailserver(communityID string) (*communities.Community, error) { - return api.service.messenger.RequestCommunityInfoFromMailserver(communityID, true) + return api.service.messenger.RequestCommunityInfoFromMailserver(communityID, nil, true) } +func (api *PublicAPI) RequestCommunityInfoFromMailserverWithShard(communityID string, shard *common.Shard) (*communities.Community, error) { + return api.service.messenger.RequestCommunityInfoFromMailserver(communityID, shard, true) +} + +// DEPRECATED func (api *PublicAPI) RequestCommunityInfoFromMailserverAsync(communityID string) error { - return api.service.messenger.RequestCommunityInfoFromMailserverAsync(communityID) + return api.service.messenger.RequestCommunityInfoFromMailserverAsync(communityID, nil) +} + +func (api *PublicAPI) RequestCommunityInfoFromMailserverAsyncWithShard(communityID string, shard *common.Shard) error { + return api.service.messenger.RequestCommunityInfoFromMailserverAsync(communityID, shard) } func (api *PublicAPI) ActivityCenterNotifications(request protocol.ActivityCenterNotificationsRequest) (*protocol.ActivityCenterPaginationResponse, error) { diff --git a/services/ext/service.go b/services/ext/service.go index c99823b43..c91f29b2f 100644 --- a/services/ext/service.go +++ b/services/ext/service.go @@ -561,6 +561,10 @@ func (s *Service) CanProvideCollectibleMetadata(id thirdparty.CollectibleUniqueI } func (s *Service) FetchCollectibleMetadata(id thirdparty.CollectibleUniqueID, tokenURI string) (*thirdparty.FullCollectibleData, error) { + if s.messenger == nil { + return nil, fmt.Errorf("messenger not ready") + } + communityID := tokenURIToCommunityID(tokenURI) if communityID == "" { @@ -670,7 +674,12 @@ func (s *Service) fetchCommunity(communityID string) (*communities.Community, er } // Try to fetch metadata from Messenger communities - community, err := s.messenger.RequestCommunityInfoFromMailserver(communityID, true) + + // TODO: we need the shard information in the collectible to be able to retrieve info for + // communities that have specific shards + + var shard *common.Shard = nil // TODO: build this with info from token + community, err := s.messenger.RequestCommunityInfoFromMailserver(communityID, shard, true) if err != nil { return nil, err diff --git a/services/mailservers/api_test.go b/services/mailservers/api_test.go index 375b3cfe9..205503912 100644 --- a/services/mailservers/api_test.go +++ b/services/mailservers/api_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/require" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" "github.com/status-im/status-go/appdatabase" diff --git a/services/status/service.go b/services/status/service.go index 3a2bf4433..b0a11640c 100644 --- a/services/status/service.go +++ b/services/status/service.go @@ -10,6 +10,7 @@ import ( "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/protocol" + "github.com/status-im/status-go/protocol/common" ) // Make sure that Service implements node.Lifecycle interface. @@ -69,12 +70,12 @@ type PublicAPI struct { service *Service } -func (p *PublicAPI) CommunityInfo(communityID types.HexBytes) (json.RawMessage, error) { +func (p *PublicAPI) CommunityInfo(communityID types.HexBytes, shard *common.Shard) (json.RawMessage, error) { if p.service.messenger == nil { return nil, ErrNotInitialized } - community, err := p.service.messenger.RequestCommunityInfoFromMailserver(communityID.String(), true) + community, err := p.service.messenger.RequestCommunityInfoFromMailserver(communityID.String(), shard, true) if err != nil { return nil, err } diff --git a/wakuv2/api_test.go b/wakuv2/api_test.go index 8695fbd14..63e0b9c09 100644 --- a/wakuv2/api_test.go +++ b/wakuv2/api_test.go @@ -22,9 +22,10 @@ import ( "testing" "time" - "github.com/waku-org/go-waku/waku/v2/protocol/relay" "golang.org/x/exp/maps" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + "github.com/status-im/status-go/wakuv2/common" ) diff --git a/wakuv2/common/filter.go b/wakuv2/common/filter.go index ad0b9d4cf..21598290a 100644 --- a/wakuv2/common/filter.go +++ b/wakuv2/common/filter.go @@ -23,10 +23,11 @@ import ( "fmt" "sync" - "github.com/waku-org/go-waku/waku/v2/protocol/relay" "go.uber.org/zap" "golang.org/x/exp/maps" + "github.com/waku-org/go-waku/waku/v2/protocol/relay" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" diff --git a/wakuv2/filter_manager.go b/wakuv2/filter_manager.go index 5509f84ea..378040fb4 100644 --- a/wakuv2/filter_manager.go +++ b/wakuv2/filter_manager.go @@ -13,13 +13,14 @@ import ( "github.com/status-im/status-go/wakuv2/common" + "go.uber.org/zap" + "golang.org/x/exp/maps" + node "github.com/waku-org/go-waku/waku/v2/node" "github.com/waku-org/go-waku/waku/v2/protocol" "github.com/waku-org/go-waku/waku/v2/protocol/filter" "github.com/waku-org/go-waku/waku/v2/protocol/relay" "github.com/waku-org/go-waku/waku/v2/protocol/subscription" - "go.uber.org/zap" - "golang.org/x/exp/maps" ) const ( diff --git a/wakuv2/waku.go b/wakuv2/waku.go index b1a9caadd..3cde5e285 100644 --- a/wakuv2/waku.go +++ b/wakuv2/waku.go @@ -990,16 +990,17 @@ func (w *Waku) broadcast() { select { case envelope := <-w.sendQueue: var err error + logger := w.logger.With(zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()), zap.String("contentTopic", envelope.Message().ContentTopic), zap.Int64("timestamp", envelope.Message().Timestamp)) if w.settings.LightClient { - w.logger.Info("publishing message via lightpush", zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic())) + w.logger.Info("publishing message via lightpush") _, err = w.node.Lightpush().PublishToTopic(context.Background(), envelope.Message(), lightpush.WithPubSubTopic(envelope.PubsubTopic())) } else { - w.logger.Info("publishing message via relay", zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic())) + logger.Info("publishing message via relay") _, err = w.node.Relay().PublishToTopic(context.Background(), envelope.Message(), envelope.PubsubTopic()) } if err != nil { - w.logger.Error("could not send message", zap.String("envelopeHash", hexutil.Encode(envelope.Hash())), zap.String("pubsubTopic", envelope.PubsubTopic()), zap.Error(err)) + logger.Error("could not send message", zap.Error(err)) w.envelopeFeed.Send(common.EnvelopeEvent{ Hash: gethcommon.BytesToHash(envelope.Hash()), Event: common.EventEnvelopeExpired, @@ -1437,7 +1438,19 @@ func (w *Waku) SubscribeToPubsubTopic(topic string, pubkey *ecdsa.PublicKey) err return nil } +func (w *Waku) RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error) { + if w.protectedTopicStore == nil { + return nil, nil + } + + return w.protectedTopicStore.FetchPrivateKey(topic) +} + func (w *Waku) StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error { + if w.protectedTopicStore == nil { + return nil + } + return w.protectedTopicStore.Insert(topic, privKey, &privKey.PublicKey) } diff --git a/wakuv2/waku_test.go b/wakuv2/waku_test.go index 469290566..205224d47 100644 --- a/wakuv2/waku_test.go +++ b/wakuv2/waku_test.go @@ -11,12 +11,14 @@ import ( "github.com/cenkalti/backoff/v3" "github.com/stretchr/testify/require" + + "golang.org/x/exp/maps" + "github.com/waku-org/go-waku/waku/v2/dnsdisc" "github.com/waku-org/go-waku/waku/v2/protocol/pb" "github.com/waku-org/go-waku/waku/v2/protocol/relay" "github.com/waku-org/go-waku/waku/v2/protocol/store" "github.com/waku-org/go-waku/waku/v2/protocol/subscription" - "golang.org/x/exp/maps" "github.com/status-im/status-go/protocol/tt" "github.com/status-im/status-go/wakuv2/common"