github.com/status-im/status-go@v1.1.0/protocol/communities_messenger_shared_member_address_test.go (about)

     1  package protocol
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/suite"
     8  	"go.uber.org/zap"
     9  
    10  	gethcommon "github.com/ethereum/go-ethereum/common"
    11  	hexutil "github.com/ethereum/go-ethereum/common/hexutil"
    12  
    13  	gethbridge "github.com/status-im/status-go/eth-node/bridge/geth"
    14  	"github.com/status-im/status-go/eth-node/crypto"
    15  	"github.com/status-im/status-go/eth-node/types"
    16  	"github.com/status-im/status-go/protocol/common"
    17  	"github.com/status-im/status-go/protocol/communities"
    18  	"github.com/status-im/status-go/protocol/protobuf"
    19  	"github.com/status-im/status-go/protocol/requests"
    20  	"github.com/status-im/status-go/protocol/tt"
    21  )
    22  
    23  func TestMessengerCommunitiesSharedMemberAddressSuite(t *testing.T) {
    24  	suite.Run(t, new(MessengerCommunitiesSharedMemberAddressSuite))
    25  }
    26  
    27  type MessengerCommunitiesSharedMemberAddressSuite struct {
    28  	suite.Suite
    29  	owner *Messenger
    30  	bob   *Messenger
    31  	alice *Messenger
    32  
    33  	ownerWaku types.Waku
    34  	bobWaku   types.Waku
    35  	aliceWaku types.Waku
    36  
    37  	logger *zap.Logger
    38  
    39  	mockedBalances          map[uint64]map[gethcommon.Address]map[gethcommon.Address]*hexutil.Big // chainID, account, token, balance
    40  	collectiblesServiceMock *CollectiblesServiceMock
    41  	mockedCollectibles      communities.CollectiblesByChain
    42  	collectiblesManagerMock CollectiblesManagerMock
    43  }
    44  
    45  func (s *MessengerCommunitiesSharedMemberAddressSuite) SetupTest() {
    46  	// Initialize with nil to avoid panics in TearDownTest
    47  	s.owner = nil
    48  	s.bob = nil
    49  	s.alice = nil
    50  	s.ownerWaku = nil
    51  	s.bobWaku = nil
    52  	s.aliceWaku = nil
    53  
    54  	communities.SetValidateInterval(300 * time.Millisecond)
    55  	s.collectiblesServiceMock = &CollectiblesServiceMock{}
    56  	s.mockedCollectibles = communities.CollectiblesByChain{}
    57  	s.collectiblesManagerMock = CollectiblesManagerMock{
    58  		Collectibles: &s.mockedCollectibles,
    59  	}
    60  
    61  	s.resetMockedBalances()
    62  
    63  	s.logger = tt.MustCreateTestLogger()
    64  
    65  	wakuNodes := CreateWakuV2Network(&s.Suite, s.logger, []string{"owner", "bob", "alice"})
    66  
    67  	s.ownerWaku = wakuNodes[0]
    68  	s.owner = s.newMessenger(ownerPassword, []string{ownerAddress}, s.ownerWaku, "owner", []Option{})
    69  
    70  	s.bobWaku = wakuNodes[1]
    71  	s.bob = s.newMessenger(bobPassword, []string{bobAddress}, s.bobWaku, "bob", []Option{})
    72  	s.bob.EnableBackedupMessagesProcessing()
    73  
    74  	s.aliceWaku = wakuNodes[2]
    75  	s.alice = s.newMessenger(alicePassword, []string{aliceAddress1, aliceAddress2}, s.aliceWaku, "alice", []Option{})
    76  
    77  	_, err := s.owner.Start()
    78  	s.Require().NoError(err)
    79  	_, err = s.bob.Start()
    80  	s.Require().NoError(err)
    81  	_, err = s.alice.Start()
    82  	s.Require().NoError(err)
    83  }
    84  
    85  func (s *MessengerCommunitiesSharedMemberAddressSuite) TearDownTest() {
    86  	TearDownMessenger(&s.Suite, s.owner)
    87  	TearDownMessenger(&s.Suite, s.bob)
    88  	TearDownMessenger(&s.Suite, s.alice)
    89  	if s.ownerWaku != nil {
    90  		s.Require().NoError(gethbridge.GetGethWakuV2From(s.ownerWaku).Stop())
    91  	}
    92  	if s.bobWaku != nil {
    93  		s.Require().NoError(gethbridge.GetGethWakuV2From(s.bobWaku).Stop())
    94  	}
    95  	if s.aliceWaku != nil {
    96  		s.Require().NoError(gethbridge.GetGethWakuV2From(s.aliceWaku).Stop())
    97  	}
    98  	_ = s.logger.Sync()
    99  }
   100  
   101  func (s *MessengerCommunitiesSharedMemberAddressSuite) newMessenger(password string, walletAddresses []string, waku types.Waku, name string, extraOptions []Option) *Messenger {
   102  	communityManagerOptions := []communities.ManagerOption{
   103  		communities.WithAllowForcingCommunityMembersReevaluation(true),
   104  	}
   105  	extraOptions = append(extraOptions, WithCommunityManagerOptions(communityManagerOptions))
   106  
   107  	return newTestCommunitiesMessenger(&s.Suite, waku, testCommunitiesMessengerConfig{
   108  		testMessengerConfig: testMessengerConfig{
   109  			logger:       s.logger.Named(name),
   110  			extraOptions: extraOptions,
   111  		},
   112  		password:            password,
   113  		walletAddresses:     walletAddresses,
   114  		mockedBalances:      &s.mockedBalances,
   115  		collectiblesService: s.collectiblesServiceMock,
   116  		collectiblesManager: &s.collectiblesManagerMock,
   117  	})
   118  }
   119  
   120  func (s *MessengerCommunitiesSharedMemberAddressSuite) joinCommunity(community *communities.Community, user *Messenger, password string, addresses []string) {
   121  	joinCommunity(&s.Suite, community.ID(), s.owner, user, password, addresses)
   122  }
   123  
   124  func (s *MessengerCommunitiesSharedMemberAddressSuite) checkRevealedAccounts(communityID types.HexBytes, user *Messenger, expectedAccounts []*protobuf.RevealedAccount) {
   125  	revealedAccounts, err := user.communitiesManager.GetRevealedAddresses(communityID, s.alice.IdentityPublicKeyString())
   126  	s.Require().NoError(err)
   127  	s.Require().Equal(revealedAccounts, expectedAccounts)
   128  }
   129  
   130  func (s *MessengerCommunitiesSharedMemberAddressSuite) makeAddressSatisfyTheCriteria(chainID uint64, address string, criteria *protobuf.TokenCriteria) {
   131  	makeAddressSatisfyTheCriteria(&s.Suite, s.mockedBalances, s.mockedCollectibles, chainID, address, criteria)
   132  }
   133  
   134  func (s *MessengerCommunitiesSharedMemberAddressSuite) resetMockedBalances() {
   135  	s.mockedBalances = make(map[uint64]map[gethcommon.Address]map[gethcommon.Address]*hexutil.Big)
   136  	s.mockedBalances[testChainID1] = make(map[gethcommon.Address]map[gethcommon.Address]*hexutil.Big)
   137  	s.mockedBalances[testChainID1][gethcommon.HexToAddress(aliceAddress1)] = make(map[gethcommon.Address]*hexutil.Big)
   138  	s.mockedBalances[testChainID1][gethcommon.HexToAddress(aliceAddress2)] = make(map[gethcommon.Address]*hexutil.Big)
   139  	s.mockedBalances[testChainID1][gethcommon.HexToAddress(bobAddress)] = make(map[gethcommon.Address]*hexutil.Big)
   140  }
   141  
   142  func createTokenMasterTokenCriteria() *protobuf.TokenCriteria {
   143  	return &protobuf.TokenCriteria{
   144  		ContractAddresses: map[uint64]string{testChainID1: "0x123"},
   145  		Type:              protobuf.CommunityTokenType_ERC20,
   146  		Symbol:            "STT",
   147  		Name:              "Status Test Token",
   148  		AmountInWei:       "10000000000000000000",
   149  		Decimals:          18,
   150  	}
   151  }
   152  
   153  func (s *MessengerCommunitiesSharedMemberAddressSuite) createEditSharedAddressesRequest(communityID types.HexBytes) *requests.EditSharedAddresses {
   154  	request := &requests.EditSharedAddresses{CommunityID: communityID, AddressesToReveal: []string{aliceAddress2}, AirdropAddress: aliceAddress2}
   155  
   156  	signingParams, err := s.alice.GenerateJoiningCommunityRequestsForSigning(common.PubkeyToHex(&s.alice.identity.PublicKey), communityID, request.AddressesToReveal)
   157  	s.Require().NoError(err)
   158  
   159  	passwdHash := types.EncodeHex(crypto.Keccak256([]byte(alicePassword)))
   160  	for i := range signingParams {
   161  		signingParams[i].Password = passwdHash
   162  	}
   163  	signatures, err := s.alice.SignData(signingParams)
   164  	s.Require().NoError(err)
   165  
   166  	updateAddresses := len(request.AddressesToReveal) == 0
   167  	if updateAddresses {
   168  		request.AddressesToReveal = make([]string, len(signingParams))
   169  	}
   170  	for i := range signingParams {
   171  		request.AddressesToReveal[i] = signingParams[i].Address
   172  		request.Signatures = append(request.Signatures, types.FromHex(signatures[i]))
   173  	}
   174  	if updateAddresses {
   175  		request.AirdropAddress = request.AddressesToReveal[0]
   176  	}
   177  
   178  	return request
   179  }
   180  
   181  func (s *MessengerCommunitiesSharedMemberAddressSuite) joinOnRequestCommunityAsTokenMaster(community *communities.Community) {
   182  	bobRequest := createRequestToJoinCommunity(&s.Suite, community.ID(), s.bob, bobPassword, []string{bobAddress})
   183  	requestToJoinID := requestToJoinCommunity(&s.Suite, s.owner, s.bob, bobRequest)
   184  	// accept join request
   185  	acceptRequestToJoin := &requests.AcceptRequestToJoinCommunity{ID: requestToJoinID}
   186  	response, err := s.owner.AcceptRequestToJoinCommunity(acceptRequestToJoin)
   187  	s.Require().NoError(err)
   188  	s.Require().NotNil(response)
   189  
   190  	updatedCommunity := response.Communities()[0]
   191  	s.Require().NotNil(updatedCommunity)
   192  	s.Require().True(updatedCommunity.HasMember(&s.bob.identity.PublicKey))
   193  	s.Require().True(updatedCommunity.IsMemberTokenMaster(&s.bob.identity.PublicKey))
   194  
   195  	// receive request to join response
   196  	_, err = WaitOnMessengerResponse(
   197  		s.bob,
   198  		func(r *MessengerResponse) bool {
   199  			return len(r.Communities()) > 0 &&
   200  				r.Communities()[0].HasMember(&s.bob.identity.PublicKey) &&
   201  				r.Communities()[0].IsMemberTokenMaster(&s.bob.identity.PublicKey)
   202  		},
   203  		"user did not receive request to join response",
   204  	)
   205  	s.Require().NoError(err)
   206  
   207  	userCommunity, err := s.bob.GetCommunityByID(community.ID())
   208  	s.Require().NoError(err)
   209  	s.Require().True(userCommunity.HasMember(&s.bob.identity.PublicKey))
   210  	s.Require().True(userCommunity.IsTokenMaster())
   211  }
   212  
   213  func (s *MessengerCommunitiesSharedMemberAddressSuite) waitForRevealedAddresses(receiver *Messenger, communityID types.HexBytes, expectedAccounts []*protobuf.RevealedAccount) {
   214  	_, err := WaitOnMessengerResponse(receiver, func(r *MessengerResponse) bool {
   215  		revealedAccounts, err := receiver.communitiesManager.GetRevealedAddresses(communityID, s.alice.IdentityPublicKeyString())
   216  		if err != nil {
   217  			return false
   218  		}
   219  		if len(expectedAccounts) != len(revealedAccounts) {
   220  			return false
   221  		}
   222  
   223  		for index := range revealedAccounts {
   224  			if revealedAccounts[index].Address != expectedAccounts[index].Address {
   225  				return false
   226  			}
   227  		}
   228  
   229  		return true
   230  	}, "client did not receive alice shared address")
   231  	s.Require().NoError(err)
   232  }
   233  
   234  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestJoinedCommunityMembersSharedAddress() {
   235  	community, _ := createCommunity(&s.Suite, s.owner)
   236  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   237  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   238  
   239  	s.joinCommunity(community, s.alice, alicePassword, []string{})
   240  	s.joinCommunity(community, s.bob, bobPassword, []string{})
   241  
   242  	community, err := s.owner.GetCommunityByID(community.ID())
   243  	s.Require().NoError(err)
   244  
   245  	s.Require().Equal(3, community.MembersCount())
   246  
   247  	// Check owner's DB for revealed accounts
   248  	for pubKey := range community.Members() {
   249  		if pubKey != common.PubkeyToHex(&s.owner.identity.PublicKey) {
   250  			revealedAccounts, err := s.owner.communitiesManager.GetRevealedAddresses(community.ID(), pubKey)
   251  			s.Require().NoError(err)
   252  			switch pubKey {
   253  			case common.PubkeyToHex(&s.alice.identity.PublicKey):
   254  				s.Require().Len(revealedAccounts, 2)
   255  				s.Require().Equal(revealedAccounts[0].Address, aliceAddress1)
   256  				s.Require().Equal(revealedAccounts[1].Address, aliceAddress2)
   257  				s.Require().Equal(true, revealedAccounts[0].IsAirdropAddress)
   258  			case common.PubkeyToHex(&s.bob.identity.PublicKey):
   259  				s.Require().Len(revealedAccounts, 1)
   260  				s.Require().Equal(revealedAccounts[0].Address, bobAddress)
   261  				s.Require().Equal(true, revealedAccounts[0].IsAirdropAddress)
   262  			default:
   263  				s.Require().Fail("pubKey does not match expected keys")
   264  			}
   265  		}
   266  	}
   267  
   268  	// Check Bob's DB for revealed accounts
   269  	revealedAccountsInBobsDB, err := s.bob.communitiesManager.GetRevealedAddresses(community.ID(), common.PubkeyToHex(&s.bob.identity.PublicKey))
   270  	s.Require().NoError(err)
   271  	s.Require().Len(revealedAccountsInBobsDB, 1)
   272  	s.Require().Equal(revealedAccountsInBobsDB[0].Address, bobAddress)
   273  	s.Require().Equal(true, revealedAccountsInBobsDB[0].IsAirdropAddress)
   274  
   275  	// Check Alices's DB for revealed accounts
   276  	revealedAccountsInAlicesDB, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), common.PubkeyToHex(&s.alice.identity.PublicKey))
   277  	s.Require().NoError(err)
   278  	s.Require().Len(revealedAccountsInAlicesDB, 2)
   279  	s.Require().Equal(revealedAccountsInAlicesDB[0].Address, aliceAddress1)
   280  	s.Require().Equal(revealedAccountsInAlicesDB[1].Address, aliceAddress2)
   281  	s.Require().Equal(true, revealedAccountsInAlicesDB[0].IsAirdropAddress)
   282  }
   283  
   284  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestJoinedCommunityMembersSelectedSharedAddress() {
   285  	community, _ := createCommunity(&s.Suite, s.owner)
   286  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   287  
   288  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress2})
   289  
   290  	community, err := s.owner.GetCommunityByID(community.ID())
   291  	s.Require().NoError(err)
   292  
   293  	s.Require().Equal(2, community.MembersCount())
   294  
   295  	alicePubkey := common.PubkeyToHex(&s.alice.identity.PublicKey)
   296  
   297  	// Check Alice's DB for revealed accounts
   298  	revealedAccountsInAlicesDB, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
   299  	s.Require().NoError(err)
   300  	s.Require().Len(revealedAccountsInAlicesDB, 1)
   301  	s.Require().Equal(revealedAccountsInAlicesDB[0].Address, aliceAddress2)
   302  	s.Require().Equal(true, revealedAccountsInAlicesDB[0].IsAirdropAddress)
   303  
   304  	// Check owner's DB for revealed accounts
   305  	s.checkRevealedAccounts(community.ID(), s.owner, revealedAccountsInAlicesDB)
   306  }
   307  
   308  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestJoinedCommunityMembersMultipleSelectedSharedAddresses() {
   309  	community, _ := createCommunity(&s.Suite, s.owner)
   310  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   311  
   312  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1, aliceAddress2})
   313  
   314  	community, err := s.owner.GetCommunityByID(community.ID())
   315  	s.Require().NoError(err)
   316  
   317  	s.Require().Equal(2, community.MembersCount())
   318  
   319  	alicePubkey := common.PubkeyToHex(&s.alice.identity.PublicKey)
   320  
   321  	// Check Alice's DB for revealed accounts
   322  	revealedAccountsInAlicesDB, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
   323  	s.Require().NoError(err)
   324  	s.Require().Len(revealedAccountsInAlicesDB, 2)
   325  	s.Require().Equal(revealedAccountsInAlicesDB[0].Address, aliceAddress1)
   326  	s.Require().Equal(revealedAccountsInAlicesDB[1].Address, aliceAddress2)
   327  	s.Require().Equal(true, revealedAccountsInAlicesDB[0].IsAirdropAddress)
   328  
   329  	// Check owner's DB for revealed accounts
   330  	s.checkRevealedAccounts(community.ID(), s.owner, revealedAccountsInAlicesDB)
   331  }
   332  
   333  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestEditSharedAddresses() {
   334  	community, _ := createCommunity(&s.Suite, s.owner)
   335  	alicePubkey := common.PubkeyToHex(&s.alice.identity.PublicKey)
   336  
   337  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   338  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1})
   339  
   340  	community, err := s.owner.GetCommunityByID(community.ID())
   341  	s.Require().NoError(err)
   342  	s.Require().Equal(2, community.MembersCount())
   343  
   344  	aliceExpectedRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
   345  	s.Require().NoError(err)
   346  	s.Require().Len(aliceExpectedRevealedAccounts, 1)
   347  	s.Require().Equal(aliceExpectedRevealedAccounts[0].Address, aliceAddress1)
   348  	s.Require().Equal(true, aliceExpectedRevealedAccounts[0].IsAirdropAddress)
   349  
   350  	s.checkRevealedAccounts(community.ID(), s.owner, aliceExpectedRevealedAccounts)
   351  
   352  	request := s.createEditSharedAddressesRequest(community.ID())
   353  
   354  	response, err := s.alice.EditSharedAddressesForCommunity(request)
   355  	s.Require().NoError(err)
   356  	s.Require().NotNil(response)
   357  
   358  	aliceExpectedRevealedAccounts, err = s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
   359  	s.Require().NoError(err)
   360  	s.Require().Len(aliceExpectedRevealedAccounts, 1)
   361  	s.Require().Equal(aliceExpectedRevealedAccounts[0].Address, aliceAddress2)
   362  	s.Require().Equal(true, aliceExpectedRevealedAccounts[0].IsAirdropAddress)
   363  
   364  	// check that owner received revealed address
   365  	s.waitForRevealedAddresses(s.owner, community.ID(), aliceExpectedRevealedAccounts)
   366  
   367  	// check that we filter out outdated edit shared addresses events
   368  	community, err = s.owner.GetCommunityByID(community.ID())
   369  	s.Require().NoError(err)
   370  
   371  	aliceClock := community.Description().Members[s.alice.IdentityPublicKeyString()].LastUpdateClock
   372  	s.Require().Greater(aliceClock, uint64(1))
   373  
   374  	editMsg := &protobuf.CommunityEditSharedAddresses{
   375  		Clock:            aliceClock - 1,
   376  		CommunityId:      community.ID(),
   377  		RevealedAccounts: aliceExpectedRevealedAccounts,
   378  	}
   379  
   380  	state := &ReceivedMessageState{
   381  		CurrentMessageState: &CurrentMessageState{
   382  			PublicKey: s.alice.IdentityPublicKey(),
   383  		},
   384  	}
   385  
   386  	err = s.owner.HandleCommunityEditSharedAddresses(state, editMsg, nil)
   387  	s.Require().Error(err, communities.ErrEditSharedAddressesRequestOutdated)
   388  }
   389  
   390  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestTokenMasterReceivesEditedSharedAddresses() {
   391  	community, _ := createCommunity(&s.Suite, s.owner)
   392  
   393  	alicePubkey := s.alice.IdentityPublicKeyString()
   394  
   395  	tokenCriteria := createTokenMasterTokenCriteria()
   396  
   397  	_, err := s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
   398  		CommunityID:   community.ID(),
   399  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
   400  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
   401  	})
   402  	s.Require().NoError(err)
   403  
   404  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   405  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1})
   406  
   407  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   408  	s.Require().NoError(err)
   409  
   410  	// make bob satisfy the Token Master criteria
   411  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
   412  
   413  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   414  	s.joinCommunity(community, s.bob, bobPassword, []string{bobAddress})
   415  
   416  	// check bob has TM role
   417  	community, err = s.bob.communitiesManager.GetByID(community.ID())
   418  	s.Require().NoError(err)
   419  	checkRoleBasedOnThePermissionType(protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER, &s.bob.identity.PublicKey, community)
   420  
   421  	s.Require().NoError(err)
   422  
   423  	expectedAliceRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
   424  	s.Require().NoError(err)
   425  	s.Require().Len(expectedAliceRevealedAccounts, 1)
   426  
   427  	s.waitForRevealedAddresses(s.bob, community.ID(), expectedAliceRevealedAccounts)
   428  
   429  	request := s.createEditSharedAddressesRequest(community.ID())
   430  
   431  	response, err := s.alice.EditSharedAddressesForCommunity(request)
   432  	s.Require().NoError(err)
   433  	s.Require().NotNil(response)
   434  	expectedAliceRevealedAccounts, err = s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
   435  	s.Require().NoError(err)
   436  	s.Require().Len(expectedAliceRevealedAccounts, 1)
   437  	s.Require().Equal(expectedAliceRevealedAccounts[0].Address, aliceAddress2)
   438  	s.Require().Equal(true, expectedAliceRevealedAccounts[0].IsAirdropAddress)
   439  
   440  	s.waitForRevealedAddresses(s.owner, community.ID(), expectedAliceRevealedAccounts)
   441  
   442  	s.Require().NoError(err)
   443  
   444  	s.waitForRevealedAddresses(s.bob, community.ID(), expectedAliceRevealedAccounts)
   445  }
   446  
   447  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestSharedAddressesReturnsRevealedAccount() {
   448  	community, _ := createCommunity(&s.Suite, s.owner)
   449  
   450  	permissionRequest := requests.CreateCommunityTokenPermission{
   451  		CommunityID: community.ID(),
   452  		Type:        protobuf.CommunityTokenPermission_CAN_VIEW_AND_POST_CHANNEL,
   453  		TokenCriteria: []*protobuf.TokenCriteria{
   454  			&protobuf.TokenCriteria{
   455  				Type:              protobuf.CommunityTokenType_ERC20,
   456  				ContractAddresses: map[uint64]string{testChainID1: "0x123"},
   457  				Symbol:            "TEST",
   458  				AmountInWei:       "100000000000000000000",
   459  				Decimals:          uint64(18),
   460  			},
   461  		},
   462  	}
   463  
   464  	response, err := s.owner.CreateCommunityTokenPermission(&permissionRequest)
   465  	s.Require().NoError(err)
   466  	s.Require().Len(response.Communities(), 1)
   467  
   468  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   469  
   470  	s.joinCommunity(community, s.alice, alicePassword, []string{})
   471  
   472  	revealedAccounts, err := s.alice.GetRevealedAccounts(community.ID(), common.PubkeyToHex(&s.alice.identity.PublicKey))
   473  	s.Require().NoError(err)
   474  
   475  	revealedAddressesMap := make(map[string]struct{}, len(revealedAccounts))
   476  	for _, acc := range revealedAccounts {
   477  		revealedAddressesMap[acc.Address] = struct{}{}
   478  	}
   479  
   480  	s.Require().Len(revealedAddressesMap, 2)
   481  	s.Require().Contains(revealedAddressesMap, aliceAddress1)
   482  	s.Require().Contains(revealedAddressesMap, aliceAddress2)
   483  
   484  	sharedAddresses, err := s.alice.getSharedAddresses(community.ID(), []string{})
   485  	s.Require().NoError(err)
   486  	s.Require().Len(sharedAddresses, 2)
   487  
   488  	sharedAddressesMap := make(map[string]struct{}, len(sharedAddresses))
   489  	for _, acc := range sharedAddresses {
   490  		sharedAddressesMap[acc.String()] = struct{}{}
   491  	}
   492  
   493  	s.Require().Len(sharedAddressesMap, 2)
   494  	s.Require().Contains(sharedAddressesMap, aliceAddress1)
   495  	s.Require().Contains(sharedAddressesMap, aliceAddress2)
   496  }
   497  
   498  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestResendSharedAddressesOnBackupRestore() {
   499  	community, _ := createCommunity(&s.Suite, s.owner)
   500  
   501  	// bob joins the community
   502  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   503  	s.joinCommunity(community, s.bob, bobPassword, []string{bobAddress})
   504  
   505  	currentBobSharedAddresses, err := s.bob.GetRevealedAccounts(community.ID(), s.bob.IdentityPublicKeyString())
   506  	s.Require().NoError(err)
   507  	s.Require().Len(currentBobSharedAddresses, 1)
   508  
   509  	requestID := communities.CalculateRequestID(s.bob.IdentityPublicKeyString(), community.ID())
   510  	err = s.bob.communitiesManager.RemoveRequestToJoinRevealedAddresses(requestID)
   511  	s.Require().NoError(err)
   512  
   513  	emptySharedAddresses, err := s.bob.GetRevealedAccounts(community.ID(), s.bob.IdentityPublicKeyString())
   514  	s.Require().NoError(err)
   515  	s.Require().Len(emptySharedAddresses, 0)
   516  
   517  	// Simulate backup creation and handling backup message
   518  	// As a result, bob sends request to resend encryption keys to the owner
   519  	clock, _ := s.bob.getLastClockWithRelatedChat()
   520  
   521  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   522  	s.Require().NoError(err)
   523  
   524  	backupMessage, err := s.bob.backupCommunity(community, clock)
   525  	s.Require().NoError(err)
   526  
   527  	err = s.bob.HandleBackup(s.bob.buildMessageState(), backupMessage, nil)
   528  	s.Require().NoError(err)
   529  
   530  	// Owner will receive the request for addresses and send them back to Bob
   531  	response, err := WaitOnMessengerResponse(
   532  		s.bob,
   533  		func(r *MessengerResponse) bool {
   534  			_, _ = s.owner.RetrieveAll()
   535  			return len(r.requestsToJoinCommunity) > 0
   536  		},
   537  		"request to join not received",
   538  	)
   539  	s.Require().NoError(err)
   540  
   541  	requestToJoin, ok := response.requestsToJoinCommunity[requestID.String()]
   542  	s.Require().Equal(true, ok)
   543  	s.Require().Equal(currentBobSharedAddresses, requestToJoin.RevealedAccounts)
   544  
   545  	currentBobSharedAddresses, err = s.bob.GetRevealedAccounts(community.ID(), s.bob.IdentityPublicKeyString())
   546  	s.Require().NoError(err)
   547  	s.Require().Len(currentBobSharedAddresses, 1)
   548  }
   549  
   550  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestTokenMasterReceivesMembersSharedAddressesOnBackupRestore() {
   551  	community, _ := createCommunity(&s.Suite, s.owner)
   552  
   553  	tokenCriteria := createTokenMasterTokenCriteria()
   554  
   555  	_, err := s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
   556  		CommunityID:   community.ID(),
   557  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
   558  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
   559  	})
   560  	s.Require().NoError(err)
   561  
   562  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   563  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1})
   564  
   565  	expectedAliceRevealedAccounts, err := s.alice.GetRevealedAccounts(community.ID(), s.alice.IdentityPublicKeyString())
   566  	s.Require().NoError(err)
   567  	s.Require().Len(expectedAliceRevealedAccounts, 1)
   568  	s.Require().Equal(expectedAliceRevealedAccounts[0].Address, aliceAddress1)
   569  
   570  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   571  	s.Require().NoError(err)
   572  
   573  	// make bob satisfy the Token Master criteria
   574  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
   575  
   576  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   577  	s.joinCommunity(community, s.bob, bobPassword, []string{bobAddress})
   578  	s.Require().NoError(err)
   579  
   580  	// check bob has TM role
   581  	community, err = s.bob.communitiesManager.GetByID(community.ID())
   582  	s.Require().NoError(err)
   583  	checkRoleBasedOnThePermissionType(protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER, &s.bob.identity.PublicKey, community)
   584  
   585  	s.waitForRevealedAddresses(s.bob, community.ID(), expectedAliceRevealedAccounts)
   586  
   587  	// remove alice revealed addresses
   588  	requestToDelete, err := s.bob.communitiesManager.GetRequestToJoinByPkAndCommunityID(s.alice.IdentityPublicKey(), community.ID())
   589  	s.Require().NoError(err)
   590  	err = s.bob.communitiesManager.RemoveRequestToJoinRevealedAddresses(requestToDelete.ID)
   591  	s.Require().NoError(err)
   592  	err = s.bob.communitiesManager.DeletePendingRequestToJoin(requestToDelete)
   593  	s.Require().NoError(err)
   594  
   595  	emptySharedAddresses, err := s.bob.GetRevealedAccounts(community.ID(), s.alice.IdentityPublicKeyString())
   596  	s.Require().NoError(err)
   597  	s.Require().Len(emptySharedAddresses, 0)
   598  	s.Require().NotEqual(emptySharedAddresses, expectedAliceRevealedAccounts)
   599  
   600  	// Simulate backup creation and handling backup message
   601  	// As a result, bob sends request to resend encryption keys to the owner
   602  	clock, _ := s.bob.getLastClockWithRelatedChat()
   603  
   604  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   605  	s.Require().NoError(err)
   606  
   607  	backupMessage, err := s.bob.backupCommunity(community, clock)
   608  	s.Require().NoError(err)
   609  
   610  	err = s.bob.HandleBackup(s.bob.buildMessageState(), backupMessage, nil)
   611  	s.Require().NoError(err)
   612  
   613  	// Owner will receive the request for addresses and send requests to join with revealed
   614  	// addresses to token master
   615  	_, err = WaitOnMessengerResponse(
   616  		s.bob,
   617  		func(r *MessengerResponse) bool {
   618  			_, _ = s.owner.RetrieveAll()
   619  			aliceAccounts, err := s.bob.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
   620  			s.Require().NoError(err)
   621  			return len(aliceAccounts) > 0 && aliceAccounts[0].Address == aliceAddress1
   622  		},
   623  		"alice request to join with revealed addresses not received",
   624  	)
   625  	s.Require().NoError(err)
   626  }
   627  
   628  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestTokenMasterReceivedRevealedAddressesFromJoinedMember() {
   629  	community, _ := createCommunity(&s.Suite, s.owner)
   630  
   631  	tokenCriteria := createTokenMasterTokenCriteria()
   632  
   633  	_, err := s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
   634  		CommunityID:   community.ID(),
   635  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
   636  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
   637  	})
   638  	s.Require().NoError(err)
   639  
   640  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   641  	s.Require().NoError(err)
   642  	s.Require().Len(community.TokenPermissions(), 1)
   643  
   644  	// make bob satisfy the Token Master criteria
   645  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
   646  
   647  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   648  	s.joinCommunity(community, s.bob, bobPassword, []string{bobAddress})
   649  
   650  	// check bob has TM role
   651  	community, err = s.bob.communitiesManager.GetByID(community.ID())
   652  	s.Require().NoError(err)
   653  	checkRoleBasedOnThePermissionType(protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER, &s.bob.identity.PublicKey, community)
   654  
   655  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   656  	s.Require().NoError(err)
   657  
   658  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   659  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1})
   660  
   661  	expectedAliceRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
   662  	s.Require().NoError(err)
   663  	s.Require().Len(expectedAliceRevealedAccounts, 1)
   664  	s.Require().Equal(expectedAliceRevealedAccounts[0].Address, aliceAddress1)
   665  	s.Require().Equal(true, expectedAliceRevealedAccounts[0].IsAirdropAddress)
   666  
   667  	// check that bob received revealed address
   668  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
   669  		return checkRequestToJoinInResponse(r, s.alice, communities.RequestToJoinStateAccepted, len(expectedAliceRevealedAccounts))
   670  	}, "user not accepted")
   671  	s.Require().NoError(err)
   672  
   673  	s.checkRevealedAccounts(community.ID(), s.bob, expectedAliceRevealedAccounts)
   674  }
   675  
   676  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestTokenMasterJoinedToCommunityAndReceivedRevealedAddresses() {
   677  	community, _ := createCommunity(&s.Suite, s.owner)
   678  
   679  	tokenCriteria := createTokenMasterTokenCriteria()
   680  
   681  	_, err := s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
   682  		CommunityID:   community.ID(),
   683  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
   684  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
   685  	})
   686  	s.Require().NoError(err)
   687  
   688  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   689  	s.Require().NoError(err)
   690  	s.Require().Len(community.TokenPermissions(), 1)
   691  
   692  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   693  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1})
   694  
   695  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   696  	s.Require().NoError(err)
   697  
   698  	// make bob satisfy the Token Master criteria
   699  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
   700  
   701  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   702  
   703  	s.joinCommunity(community, s.bob, bobPassword, []string{bobAddress})
   704  
   705  	community, err = s.bob.communitiesManager.GetByID(community.ID())
   706  	s.Require().NoError(err)
   707  	checkRoleBasedOnThePermissionType(protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER, &s.bob.identity.PublicKey, community)
   708  
   709  	expectedAliceRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
   710  	s.Require().NoError(err)
   711  	s.Require().Len(expectedAliceRevealedAccounts, 1)
   712  	s.Require().Equal(expectedAliceRevealedAccounts[0].Address, aliceAddress1)
   713  	s.Require().Equal(true, expectedAliceRevealedAccounts[0].IsAirdropAddress)
   714  
   715  	s.waitForRevealedAddresses(s.bob, community.ID(), expectedAliceRevealedAccounts)
   716  }
   717  
   718  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestMemberReceivedSharedAddressOnGettingTokenMasterRole() {
   719  	community, _ := createCommunity(&s.Suite, s.owner)
   720  
   721  	community, err := s.owner.communitiesManager.GetByID(community.ID())
   722  	s.Require().NoError(err)
   723  	s.Require().Len(community.TokenPermissions(), 0)
   724  
   725  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   726  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1})
   727  
   728  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   729  	s.joinCommunity(community, s.bob, bobPassword, []string{bobAddress})
   730  
   731  	tokenCriteria := createTokenMasterTokenCriteria()
   732  
   733  	// make bob satisfy the Token Master criteria
   734  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
   735  
   736  	// wait for owner to send sync message for bob, who got a TM role
   737  	waitOnOwnerSendSyncMessage := waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
   738  		return sub.CommunityPrivilegedMemberSyncMessage != nil &&
   739  			sub.CommunityPrivilegedMemberSyncMessage.CommunityPrivilegedUserSyncMessage.Type == protobuf.CommunityPrivilegedUserSyncMessage_CONTROL_NODE_ALL_SYNC_REQUESTS_TO_JOIN &&
   740  			len(sub.CommunityPrivilegedMemberSyncMessage.Receivers) == 1 &&
   741  			sub.CommunityPrivilegedMemberSyncMessage.Receivers[0].Equal(&s.bob.identity.PublicKey)
   742  	})
   743  
   744  	_, err = s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
   745  		CommunityID:   community.ID(),
   746  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
   747  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
   748  	})
   749  	s.Require().NoError(err)
   750  
   751  	err = <-waitOnOwnerSendSyncMessage
   752  	s.Require().NoError(err)
   753  
   754  	expectedAliceRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
   755  	s.Require().NoError(err)
   756  	s.Require().Len(expectedAliceRevealedAccounts, 1)
   757  	s.Require().Equal(expectedAliceRevealedAccounts[0].Address, aliceAddress1)
   758  	s.Require().Equal(true, expectedAliceRevealedAccounts[0].IsAirdropAddress)
   759  
   760  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
   761  		return len(r.Communities()) == 1 && r.Communities()[0].IsTokenMaster()
   762  	}, "bob didn't receive token master role")
   763  	s.Require().NoError(err)
   764  
   765  	s.waitForRevealedAddresses(s.bob, community.ID(), expectedAliceRevealedAccounts)
   766  }
   767  
   768  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestTokenMasterReceivesAccountsAfterPendingRequestToJoinApproval() {
   769  	community, _ := createOnRequestCommunity(&s.Suite, s.owner)
   770  
   771  	tokenCriteria := createTokenMasterTokenCriteria()
   772  
   773  	// make bob satisfy the Token Master criteria
   774  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
   775  
   776  	_, err := s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
   777  		CommunityID:   community.ID(),
   778  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
   779  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
   780  	})
   781  	s.Require().NoError(err)
   782  
   783  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   784  	s.Require().NoError(err)
   785  	s.Require().Len(community.TokenPermissions(), 1)
   786  
   787  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   788  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   789  
   790  	aliceRequest := createRequestToJoinCommunity(&s.Suite, community.ID(), s.alice, alicePassword, []string{aliceAddress1})
   791  	aliceRequestToJoinID := requestToJoinCommunity(&s.Suite, s.owner, s.alice, aliceRequest)
   792  
   793  	s.joinOnRequestCommunityAsTokenMaster(community)
   794  
   795  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   796  	s.Require().NoError(err)
   797  	s.Require().True(community.IsMemberTokenMaster(&s.bob.identity.PublicKey))
   798  
   799  	_, err = s.owner.AcceptRequestToJoinCommunity(&requests.AcceptRequestToJoinCommunity{ID: aliceRequestToJoinID})
   800  	s.Require().NoError(err)
   801  
   802  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
   803  		return checkRequestToJoinInResponse(r, s.alice, communities.RequestToJoinStateAccepted, 1)
   804  	}, "bob didn't receive accepted Alice request to join")
   805  	s.Require().NoError(err)
   806  
   807  	expectedAliceRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
   808  	s.Require().NoError(err)
   809  	s.Require().Len(expectedAliceRevealedAccounts, 1)
   810  	s.Require().Equal(expectedAliceRevealedAccounts[0].Address, aliceAddress1)
   811  	s.Require().Equal(true, expectedAliceRevealedAccounts[0].IsAirdropAddress)
   812  
   813  	s.checkRevealedAccounts(community.ID(), s.bob, expectedAliceRevealedAccounts)
   814  }
   815  
   816  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestMemberReceivesPendingRequestToJoinAfterAfterGettingTokenMasterRole() {
   817  	community, _ := createOnRequestCommunity(&s.Suite, s.owner)
   818  
   819  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   820  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   821  
   822  	aliceRequest := createRequestToJoinCommunity(&s.Suite, community.ID(), s.alice, alicePassword, []string{aliceAddress1})
   823  	aliceRequestToJoinID := requestToJoinCommunity(&s.Suite, s.owner, s.alice, aliceRequest)
   824  
   825  	joinOnRequestCommunity(&s.Suite, community.ID(), s.owner, s.bob, bobPassword, []string{bobAddress})
   826  
   827  	tokenCriteria := createTokenMasterTokenCriteria()
   828  
   829  	// make bob satisfy the Token Master criteria
   830  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
   831  
   832  	_, err := s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
   833  		CommunityID:   community.ID(),
   834  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
   835  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
   836  	})
   837  	s.Require().NoError(err)
   838  
   839  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
   840  		return len(r.Communities()) == 1 && r.Communities()[0].IsTokenMaster()
   841  	}, "bob didn't receive token master role")
   842  	s.Require().NoError(err)
   843  
   844  	_, err = s.owner.AcceptRequestToJoinCommunity(&requests.AcceptRequestToJoinCommunity{ID: aliceRequestToJoinID})
   845  	s.Require().NoError(err)
   846  
   847  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
   848  		return checkRequestToJoinInResponse(r, s.alice, communities.RequestToJoinStateAccepted, 1)
   849  	}, "bob didn't receive accepted Alice request to join")
   850  	s.Require().NoError(err)
   851  
   852  	expectedAliceRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
   853  	s.Require().NoError(err)
   854  	s.Require().Len(expectedAliceRevealedAccounts, 1)
   855  	s.Require().Equal(expectedAliceRevealedAccounts[0].Address, aliceAddress1)
   856  	s.Require().Equal(true, expectedAliceRevealedAccounts[0].IsAirdropAddress)
   857  
   858  	s.checkRevealedAccounts(community.ID(), s.bob, expectedAliceRevealedAccounts)
   859  }
   860  
   861  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestHandlingOutdatedPrivilegedUserSyncMessages() {
   862  	community, _ := createCommunity(&s.Suite, s.owner)
   863  
   864  	tokenCriteria := createTokenMasterTokenCriteria()
   865  
   866  	_, err := s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
   867  		CommunityID:   community.ID(),
   868  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
   869  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
   870  	})
   871  	s.Require().NoError(err)
   872  
   873  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   874  	s.Require().NoError(err)
   875  	s.Require().Len(community.TokenPermissions(), 1)
   876  
   877  	// make bob satisfy the Token Master criteria
   878  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
   879  
   880  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   881  	s.joinCommunity(community, s.bob, bobPassword, []string{bobAddress})
   882  
   883  	// check bob has TM role
   884  	community, err = s.bob.communitiesManager.GetByID(community.ID())
   885  	s.Require().NoError(err)
   886  	checkRoleBasedOnThePermissionType(protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER, &s.bob.identity.PublicKey, community)
   887  
   888  	community, err = s.owner.communitiesManager.GetByID(community.ID())
   889  	s.Require().NoError(err)
   890  
   891  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   892  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1})
   893  
   894  	// check that bob received revealed address
   895  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
   896  		return checkRequestToJoinInResponse(r, s.alice, communities.RequestToJoinStateAccepted, 1)
   897  	}, "bob did not receive alice revealed addresses")
   898  	s.Require().NoError(err)
   899  
   900  	// handle outdated CommunityPrivilegedUserSyncMessage_CONTROL_NODE_ALL_SYNC_REQUESTS_TO_JOIN msg
   901  	expectedAliceRequestToJoin, err := s.bob.communitiesManager.GetRequestToJoinByPkAndCommunityID(s.alice.IdentityPublicKey(), community.ID())
   902  	s.Require().NoError(err)
   903  	s.Require().NotNil(expectedAliceRequestToJoin)
   904  
   905  	bobRequestToJoin, err := s.bob.communitiesManager.GetRequestToJoinByPkAndCommunityID(s.bob.IdentityPublicKey(), community.ID())
   906  	s.Require().NoError(err)
   907  	s.Require().NotNil(bobRequestToJoin)
   908  
   909  	invalidAliceSyncRtj := expectedAliceRequestToJoin.ToSyncProtobuf()
   910  	invalidAliceSyncRtj.RevealedAccounts = bobRequestToJoin.RevealedAccounts
   911  	invalidAliceSyncRtj.EnsName = "corrupted"
   912  	invalidAliceSyncRtj.State = uint64(communities.RequestToJoinStatePending)
   913  
   914  	syncMsg := &protobuf.CommunityPrivilegedUserSyncMessage{
   915  		Type:               protobuf.CommunityPrivilegedUserSyncMessage_CONTROL_NODE_ALL_SYNC_REQUESTS_TO_JOIN,
   916  		CommunityId:        community.ID(),
   917  		SyncRequestsToJoin: []*protobuf.SyncCommunityRequestsToJoin{invalidAliceSyncRtj},
   918  	}
   919  
   920  	state := &ReceivedMessageState{
   921  		CurrentMessageState: &CurrentMessageState{
   922  			PublicKey: community.PublicKey(),
   923  		},
   924  	}
   925  
   926  	err = s.bob.HandleCommunityPrivilegedUserSyncMessage(state, syncMsg, nil)
   927  	s.Require().NoError(err)
   928  
   929  	aliceRtj, err := s.bob.communitiesManager.GetRequestToJoinByPkAndCommunityID(s.alice.IdentityPublicKey(), community.ID())
   930  	s.Require().NoError(err)
   931  	s.Require().Equal(aliceRtj, expectedAliceRequestToJoin)
   932  
   933  	// handle outdated CommunityPrivilegedUserSyncMessage_CONTROL_NODE_ACCEPT_REQUEST_TO_JOIN msg
   934  
   935  	invalidAliceCommunityRtj := aliceRtj.ToCommunityRequestToJoinProtobuf()
   936  	invalidAliceCommunityRtj.RevealedAccounts = bobRequestToJoin.RevealedAccounts
   937  	invalidAliceCommunityRtj.EnsName = "corrupted"
   938  
   939  	syncMsg.Type = protobuf.CommunityPrivilegedUserSyncMessage_CONTROL_NODE_ACCEPT_REQUEST_TO_JOIN
   940  	syncMsg.RequestToJoin = map[string]*protobuf.CommunityRequestToJoin{
   941  		s.alice.IdentityPublicKeyString(): invalidAliceCommunityRtj,
   942  	}
   943  
   944  	err = s.bob.HandleCommunityPrivilegedUserSyncMessage(state, syncMsg, nil)
   945  	s.Require().NoError(err)
   946  
   947  	aliceRtj, err = s.bob.communitiesManager.GetRequestToJoinByPkAndCommunityID(s.alice.IdentityPublicKey(), community.ID())
   948  	s.Require().NoError(err)
   949  	s.Require().Equal(aliceRtj, expectedAliceRequestToJoin)
   950  }
   951  
   952  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestMemberReceivedEditedSharedAddressOnGettingTokenMasterRole() {
   953  	community, _ := createCommunity(&s.Suite, s.owner)
   954  
   955  	alicePubkey := s.alice.IdentityPublicKeyString()
   956  
   957  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
   958  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1})
   959  
   960  	request := s.createEditSharedAddressesRequest(community.ID())
   961  
   962  	response, err := s.alice.EditSharedAddressesForCommunity(request)
   963  	s.Require().NoError(err)
   964  	s.Require().NotNil(response)
   965  
   966  	expectedAliceRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePubkey)
   967  	s.Require().NoError(err)
   968  	s.Require().Len(expectedAliceRevealedAccounts, 1)
   969  	s.Require().Equal(expectedAliceRevealedAccounts[0].Address, aliceAddress2)
   970  	s.Require().Equal(true, expectedAliceRevealedAccounts[0].IsAirdropAddress)
   971  
   972  	// check that owner received edited shared adresses
   973  	s.waitForRevealedAddresses(s.owner, community.ID(), expectedAliceRevealedAccounts)
   974  
   975  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   976  	s.joinCommunity(community, s.bob, bobPassword, []string{bobAddress})
   977  
   978  	tokenCriteria := createTokenMasterTokenCriteria()
   979  
   980  	// make bob satisfy the Token Master criteria
   981  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
   982  
   983  	_, err = s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
   984  		CommunityID:   community.ID(),
   985  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
   986  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
   987  	})
   988  	s.Require().NoError(err)
   989  
   990  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
   991  		return len(r.Communities()) == 1 && r.Communities()[0].IsTokenMaster()
   992  	}, "bob didn't receive token master role")
   993  	s.Require().NoError(err)
   994  
   995  	s.waitForRevealedAddresses(s.bob, community.ID(), expectedAliceRevealedAccounts)
   996  }
   997  
   998  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestMemberReceivesAccountsOnRoleChangeFromAdminToTokenMaster() {
   999  	community, _ := createCommunity(&s.Suite, s.owner)
  1000  
  1001  	alicePublicKey := s.alice.IdentityPublicKeyString()
  1002  
  1003  	adminTokenCriteria := &protobuf.TokenCriteria{
  1004  		ContractAddresses: map[uint64]string{testChainID1: "0x125"},
  1005  		Type:              protobuf.CommunityTokenType_ERC20,
  1006  		Symbol:            "STT",
  1007  		Name:              "Status Test Token",
  1008  		AmountInWei:       "10000000000000000000",
  1009  		Decimals:          18,
  1010  	}
  1011  	tokenMasterTokenCriteria := createTokenMasterTokenCriteria()
  1012  
  1013  	_, err := s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
  1014  		CommunityID:   community.ID(),
  1015  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
  1016  		TokenCriteria: []*protobuf.TokenCriteria{tokenMasterTokenCriteria},
  1017  	})
  1018  	s.Require().NoError(err)
  1019  
  1020  	_, err = s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
  1021  		CommunityID:   community.ID(),
  1022  		Type:          protobuf.CommunityTokenPermission_BECOME_ADMIN,
  1023  		TokenCriteria: []*protobuf.TokenCriteria{adminTokenCriteria},
  1024  	})
  1025  	s.Require().NoError(err)
  1026  
  1027  	community, err = s.owner.communitiesManager.GetByID(community.ID())
  1028  	s.Require().NoError(err)
  1029  	s.Require().Len(community.TokenPermissions(), 2)
  1030  
  1031  	// make bob satisfy the admin criteria
  1032  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, adminTokenCriteria)
  1033  
  1034  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
  1035  	s.joinCommunity(community, s.bob, bobPassword, []string{bobAddress})
  1036  
  1037  	// check bob has admin role
  1038  	community, err = s.bob.communitiesManager.GetByID(community.ID())
  1039  	s.Require().NoError(err)
  1040  	checkRoleBasedOnThePermissionType(protobuf.CommunityTokenPermission_BECOME_ADMIN, &s.bob.identity.PublicKey, community)
  1041  
  1042  	community, err = s.owner.communitiesManager.GetByID(community.ID())
  1043  	s.Require().NoError(err)
  1044  
  1045  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
  1046  	s.joinCommunity(community, s.alice, alicePassword, []string{aliceAddress1})
  1047  
  1048  	expectedAliceRevealedAccounts, err := s.alice.communitiesManager.GetRevealedAddresses(community.ID(), alicePublicKey)
  1049  	s.Require().NoError(err)
  1050  	s.Require().Len(expectedAliceRevealedAccounts, 1)
  1051  	s.Require().Equal(expectedAliceRevealedAccounts[0].Address, aliceAddress1)
  1052  	s.Require().Equal(true, expectedAliceRevealedAccounts[0].IsAirdropAddress)
  1053  
  1054  	// check that bob received alice request to join without revealed accounts
  1055  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
  1056  		return checkRequestToJoinInResponse(r, s.alice, communities.RequestToJoinStateAccepted, 0)
  1057  	}, "alice request to join was not delivered to admin bob")
  1058  	s.Require().NoError(err)
  1059  
  1060  	emptyAliceAccounts, err := s.bob.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
  1061  	s.Require().NoError(err)
  1062  	s.Require().Len(emptyAliceAccounts, 0)
  1063  
  1064  	// make bob satisfy TokenMaster criteria
  1065  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenMasterTokenCriteria)
  1066  
  1067  	// wait for owner to send sync message for bob, who got a TM role
  1068  	waitOnOwnerSendSyncMessage := waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
  1069  		return sub.CommunityPrivilegedMemberSyncMessage != nil &&
  1070  			sub.CommunityPrivilegedMemberSyncMessage.CommunityPrivilegedUserSyncMessage.Type == protobuf.CommunityPrivilegedUserSyncMessage_CONTROL_NODE_ALL_SYNC_REQUESTS_TO_JOIN &&
  1071  			len(sub.CommunityPrivilegedMemberSyncMessage.Receivers) == 1 &&
  1072  			sub.CommunityPrivilegedMemberSyncMessage.Receivers[0].Equal(&s.bob.identity.PublicKey)
  1073  	})
  1074  
  1075  	err = s.owner.communitiesManager.ForceMembersReevaluation(community.ID())
  1076  	s.Require().NoError(err)
  1077  
  1078  	err = <-waitOnOwnerSendSyncMessage
  1079  	s.Require().NoError(err)
  1080  
  1081  	// check that bob received alice request to join with revealed accounts
  1082  	s.waitForRevealedAddresses(s.bob, community.ID(), expectedAliceRevealedAccounts)
  1083  }
  1084  
  1085  func (s *MessengerCommunitiesSharedMemberAddressSuite) TestOwnerRejectAndAcceptAliceRequestToJoin() {
  1086  	community, _ := createOnRequestCommunity(&s.Suite, s.owner)
  1087  	s.Require().False(community.AutoAccept())
  1088  
  1089  	tokenCriteria := createTokenMasterTokenCriteria()
  1090  
  1091  	// make bob satisfy the Token Master criteria
  1092  	s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, tokenCriteria)
  1093  
  1094  	_, err := s.owner.CreateCommunityTokenPermission(&requests.CreateCommunityTokenPermission{
  1095  		CommunityID:   community.ID(),
  1096  		Type:          protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER,
  1097  		TokenCriteria: []*protobuf.TokenCriteria{tokenCriteria},
  1098  	})
  1099  	s.Require().NoError(err)
  1100  
  1101  	community, err = s.owner.communitiesManager.GetByID(community.ID())
  1102  	s.Require().NoError(err)
  1103  	s.Require().Len(community.TokenPermissions(), 1)
  1104  
  1105  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
  1106  	s.joinOnRequestCommunityAsTokenMaster(community)
  1107  
  1108  	community, err = s.owner.communitiesManager.GetByID(community.ID())
  1109  	s.Require().NoError(err)
  1110  	s.Require().True(community.IsMemberTokenMaster(&s.bob.identity.PublicKey))
  1111  
  1112  	advertiseCommunityTo(&s.Suite, community, s.owner, s.alice)
  1113  
  1114  	aliceRequest := createRequestToJoinCommunity(&s.Suite, community.ID(), s.alice, alicePassword, []string{aliceAddress1})
  1115  	aliceRequestToJoinID := requestToJoinCommunity(&s.Suite, s.owner, s.alice, aliceRequest)
  1116  
  1117  	// check that bob received alice request to join without revealed accounts due to pending state
  1118  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
  1119  		return checkRequestToJoinInResponse(r, s.alice, communities.RequestToJoinStatePending, 0)
  1120  	}, "alice pending request to join was not delivered to token master bob")
  1121  	s.Require().NoError(err)
  1122  
  1123  	// request to join was not approved, bob should not have alice revealed addresses
  1124  	aliceRevealedAccounts, err := s.bob.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
  1125  	s.Require().NoError(err)
  1126  	s.Require().Len(aliceRevealedAccounts, 0)
  1127  
  1128  	_, err = s.owner.DeclineRequestToJoinCommunity(&requests.DeclineRequestToJoinCommunity{ID: aliceRequestToJoinID})
  1129  	s.Require().NoError(err)
  1130  
  1131  	// check that bob received owner decline sync msg
  1132  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
  1133  		return checkRequestToJoinInResponse(r, s.alice, communities.RequestToJoinStateDeclined, 0)
  1134  	}, "alice declined request to join was not delivered to token master bob")
  1135  	s.Require().NoError(err)
  1136  
  1137  	// request to join was declined, bob should not have alice revealed addresses
  1138  	aliceRevealedAccounts, err = s.bob.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
  1139  	s.Require().NoError(err)
  1140  	s.Require().Len(aliceRevealedAccounts, 0)
  1141  
  1142  	_, err = s.owner.AcceptRequestToJoinCommunity(&requests.AcceptRequestToJoinCommunity{ID: aliceRequestToJoinID})
  1143  	s.Require().NoError(err)
  1144  
  1145  	_, err = WaitOnMessengerResponse(s.bob, func(r *MessengerResponse) bool {
  1146  		return checkRequestToJoinInResponse(r, s.alice, communities.RequestToJoinStateAccepted, len(aliceRequest.AddressesToReveal))
  1147  	}, "bob didn't receive accepted Alice request to join")
  1148  	s.Require().NoError(err)
  1149  
  1150  	// request to join was accepted, bob should have alice revealed addresses
  1151  	aliceRevealedAccounts, err = s.bob.communitiesManager.GetRevealedAddresses(community.ID(), s.alice.IdentityPublicKeyString())
  1152  	s.Require().NoError(err)
  1153  	s.Require().Len(aliceRevealedAccounts, 1)
  1154  }