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 }