Needed for https://github.com/status-im/status-desktop/issues/14679 On app start, fills controlled communities with missing deployed community tokens if there are.
This commit is contained in:
parent
6f1b82966a
commit
af66f517f5
|
@ -865,6 +865,24 @@ func (o *Community) AddCommunityTokensMetadata(token *protobuf.CommunityTokenMet
|
||||||
return o.config.CommunityDescription, nil
|
return o.config.CommunityDescription, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func containsToken(tokens []*protobuf.CommunityTokenMetadata, symbol string) bool {
|
||||||
|
for _, token := range tokens {
|
||||||
|
if token.Symbol == symbol {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *Community) UpsertCommunityTokensMetadata(token *protobuf.CommunityTokenMetadata) (bool, error) {
|
||||||
|
if containsToken(o.config.CommunityDescription.CommunityTokensMetadata, token.Symbol) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := o.AddCommunityTokensMetadata(token)
|
||||||
|
return true, err
|
||||||
|
}
|
||||||
|
|
||||||
func (o *Community) UnbanUserFromCommunity(pk *ecdsa.PublicKey) (*protobuf.CommunityDescription, error) {
|
func (o *Community) UnbanUserFromCommunity(pk *ecdsa.PublicKey) (*protobuf.CommunityDescription, error) {
|
||||||
o.mutex.Lock()
|
o.mutex.Lock()
|
||||||
defer o.mutex.Unlock()
|
defer o.mutex.Unlock()
|
||||||
|
|
|
@ -481,6 +481,11 @@ func (m *Manager) Start() error {
|
||||||
if m.ownerVerifier != nil {
|
if m.ownerVerifier != nil {
|
||||||
m.runOwnerVerificationLoop()
|
m.runOwnerVerificationLoop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
_ = m.fillMissingCommunityTokens()
|
||||||
|
}()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,6 +518,61 @@ func (m *Manager) runENSVerificationLoop() {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This function is mostly a way to fix any community that is missing tokens in its description
|
||||||
|
func (m *Manager) fillMissingCommunityTokens() error {
|
||||||
|
controlledCommunities, err := m.Controlled()
|
||||||
|
if err != nil {
|
||||||
|
m.logger.Error("failed to retrieve orgs", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
unlock := func() {
|
||||||
|
for _, c := range controlledCommunities {
|
||||||
|
m.communityLock.Unlock(c.ID())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, c := range controlledCommunities {
|
||||||
|
m.communityLock.Lock(c.ID())
|
||||||
|
}
|
||||||
|
defer unlock()
|
||||||
|
|
||||||
|
for _, community := range controlledCommunities {
|
||||||
|
tokens, err := m.GetCommunityTokens(community.IDString())
|
||||||
|
if err != nil {
|
||||||
|
m.logger.Error("failed to retrieve community tokens", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, token := range tokens {
|
||||||
|
if token.DeployState != community_token.Deployed {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
tokenMetadata := &protobuf.CommunityTokenMetadata{
|
||||||
|
ContractAddresses: map[uint64]string{uint64(token.ChainID): token.Address},
|
||||||
|
Description: token.Description,
|
||||||
|
Image: token.Base64Image,
|
||||||
|
Symbol: token.Symbol,
|
||||||
|
TokenType: token.TokenType,
|
||||||
|
Name: token.Name,
|
||||||
|
Decimals: uint32(token.Decimals),
|
||||||
|
}
|
||||||
|
modified, err := community.UpsertCommunityTokensMetadata(tokenMetadata)
|
||||||
|
if err != nil {
|
||||||
|
m.logger.Error("failed to add token metadata to the description", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if modified {
|
||||||
|
err = m.saveAndPublish(community)
|
||||||
|
if err != nil {
|
||||||
|
m.logger.Error("failed to save the new community", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Only for testing
|
// Only for testing
|
||||||
func (m *Manager) CommunitiesToValidate() (map[string][]communityToValidate, error) { // nolint: golint
|
func (m *Manager) CommunitiesToValidate() (map[string][]communityToValidate, error) { // nolint: golint
|
||||||
return m.persistence.getCommunitiesToValidate()
|
return m.persistence.getCommunitiesToValidate()
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
userimages "github.com/status-im/status-go/images"
|
userimages "github.com/status-im/status-go/images"
|
||||||
"github.com/status-im/status-go/params"
|
"github.com/status-im/status-go/params"
|
||||||
"github.com/status-im/status-go/protocol/common"
|
"github.com/status-im/status-go/protocol/common"
|
||||||
|
community_token "github.com/status-im/status-go/protocol/communities/token"
|
||||||
"github.com/status-im/status-go/protocol/requests"
|
"github.com/status-im/status-go/protocol/requests"
|
||||||
"github.com/status-im/status-go/protocol/transport"
|
"github.com/status-im/status-go/protocol/transport"
|
||||||
v1 "github.com/status-im/status-go/protocol/v1"
|
v1 "github.com/status-im/status-go/protocol/v1"
|
||||||
|
@ -2003,3 +2004,48 @@ func (s *ManagerSuite) TestCommunityQueueMultipleDifferentSignersIgnoreIfNotRetu
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
s.Require().Equal(clock1, fetchedCommunity.config.CommunityDescription.Clock)
|
s.Require().Equal(clock1, fetchedCommunity.config.CommunityDescription.Clock)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ManagerSuite) TestFillMissingCommunityTokens() {
|
||||||
|
// Create community
|
||||||
|
request := &requests.CreateCommunity{
|
||||||
|
Name: "status",
|
||||||
|
Description: "token membership description",
|
||||||
|
Membership: protobuf.CommunityPermissions_AUTO_ACCEPT,
|
||||||
|
}
|
||||||
|
|
||||||
|
community, err := s.manager.CreateCommunity(request, true)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().NotNil(community)
|
||||||
|
s.Require().Len(community.CommunityTokensMetadata(), 0)
|
||||||
|
|
||||||
|
// Create community token but without adding to the description
|
||||||
|
token := community_token.CommunityToken{
|
||||||
|
TokenType: protobuf.CommunityTokenType_ERC721,
|
||||||
|
CommunityID: community.IDString(),
|
||||||
|
Address: "0x001",
|
||||||
|
Name: "TestTok",
|
||||||
|
Symbol: "TST",
|
||||||
|
Description: "Desc",
|
||||||
|
Supply: &bigint.BigInt{Int: big.NewInt(0)},
|
||||||
|
InfiniteSupply: true,
|
||||||
|
Transferable: true,
|
||||||
|
RemoteSelfDestruct: true,
|
||||||
|
ChainID: 1,
|
||||||
|
DeployState: community_token.Deployed,
|
||||||
|
Base64Image: "",
|
||||||
|
Decimals: 18,
|
||||||
|
Deployer: "0x0002",
|
||||||
|
PrivilegesLevel: community_token.CommunityLevel,
|
||||||
|
}
|
||||||
|
|
||||||
|
err = s.manager.persistence.AddCommunityToken(&token)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
// Fill community with missing token
|
||||||
|
err = s.manager.fillMissingCommunityTokens()
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
community, err = s.manager.GetByID(community.ID())
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Len(community.CommunityTokensMetadata(), 1)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue