github.com/status-im/status-go@v1.1.0/protocol/requests/create_account.go (about) 1 package requests 2 3 import ( 4 "github.com/pkg/errors" 5 6 utils "github.com/status-im/status-go/common" 7 "github.com/status-im/status-go/params" 8 ) 9 10 var ErrCreateAccountInvalidDisplayName = errors.New("create-account: invalid display name") 11 var ErrCreateAccountInvalidPassword = errors.New("create-account: invalid password") 12 var ErrCreateAccountInvalidCustomizationColor = errors.New("create-account: invalid customization color") 13 var ErrCreateAccountInvalidRootKeystoreDir = errors.New("create-account: invalid root keystore directory") 14 var ErrCreateAccountInvalidRootDataDir = errors.New("create-account: invalid root data directory") 15 16 type ImageCropRectangle struct { 17 Ax int `json:"ax"` 18 Ay int `json:"ay"` 19 Bx int `json:"bx"` 20 By int `json:"by"` 21 } 22 23 type APIConfig struct { 24 APIModules string `json:"apiModules"` 25 ConnectorEnabled bool `json:"connectorEnabled"` 26 HTTPEnabled bool `json:"httpEnabled"` 27 HTTPHost string `json:"httpHost"` 28 HTTPPort int `json:"httpPort"` 29 HTTPVirtualHosts []string `json:"httpVirtualHosts"` 30 WSEnabled bool `json:"wsEnabled"` 31 WSHost string `json:"wsHost"` 32 WSPort int `json:"wsPort"` 33 } 34 35 type CreateAccount struct { 36 // RootDataDir is an absolute path to the root directory where all data will be stored. 37 RootDataDir string `json:"rootDataDir"` 38 KdfIterations int `json:"kdfIterations"` 39 40 DeviceName string `json:"deviceName"` 41 DisplayName string `json:"displayName"` 42 Password string `json:"password"` 43 ImagePath string `json:"imagePath"` 44 ImageCropRectangle *ImageCropRectangle `json:"imageCropRectangle"` 45 CustomizationColor string `json:"customizationColor"` 46 47 WakuV2Nameserver *string `json:"wakuV2Nameserver"` 48 WakuV2LightClient bool `json:"wakuV2LightClient"` 49 WakuV2EnableStoreConfirmationForMessagesSent bool `json:"wakuV2EnableStoreConfirmationForMessagesSent"` 50 WakuV2EnableMissingMessageVerification bool `json:"wakuV2EnableMissingMessageVerification"` 51 WakuV2Fleet string `json:"wakuV2Fleet"` 52 53 LogLevel *string `json:"logLevel"` 54 LogFilePath string `json:"logFilePath"` // absolute path 55 LogEnabled bool `json:"logEnabled"` 56 57 PreviewPrivacy bool `json:"previewPrivacy"` 58 59 VerifyTransactionURL *string `json:"verifyTransactionURL"` 60 VerifyENSURL *string `json:"verifyENSURL"` 61 VerifyENSContractAddress *string `json:"verifyENSContractAddress"` 62 VerifyTransactionChainID *int64 `json:"verifyTransactionChainID"` 63 UpstreamConfig string `json:"upstreamConfig"` 64 65 // Deprecated: CurrentNetwork is deprecated. It was passed and not used, so nothing should be passed instead. 66 // If you want to use non-default network, use NetworkID. 67 CurrentNetwork string `json:"currentNetwork"` 68 NetworkID *uint64 `json:"networkId"` 69 TestOverrideNetworks []params.Network `json:"-"` // This is used for testing purposes only 70 71 TestNetworksEnabled bool `json:"testNetworksEnabled"` 72 73 WalletSecretsConfig 74 75 TorrentConfigEnabled *bool 76 TorrentConfigPort *int 77 78 TelemetryServerURL string `json:"telemetryServerURL"` 79 80 APIConfig *APIConfig `json:"apiConfig"` 81 82 KeycardInstanceUID string `json:"keycardInstanceUID"` 83 KeycardPairingDataFile *string `json:"keycardPairingDataFile"` 84 StatusProxyEnabled bool `json:"statusProxyEnabled"` 85 } 86 87 type WalletSecretsConfig struct { 88 PoktToken string `json:"poktToken"` 89 InfuraToken string `json:"infuraToken"` 90 InfuraSecret string `json:"infuraSecret"` 91 OpenseaAPIKey string `json:"openseaApiKey"` 92 RaribleMainnetAPIKey string `json:"raribleMainnetApiKey"` 93 RaribleTestnetAPIKey string `json:"raribleTestnetApiKey"` 94 95 AlchemyEthereumMainnetToken string `json:"alchemyEthereumMainnetToken"` 96 AlchemyEthereumGoerliToken string `json:"alchemyEthereumGoerliToken"` 97 AlchemyEthereumSepoliaToken string `json:"alchemyEthereumSepoliaToken"` 98 AlchemyArbitrumMainnetToken string `json:"alchemyArbitrumMainnetToken"` 99 AlchemyArbitrumGoerliToken string `json:"alchemyArbitrumGoerliToken"` 100 AlchemyArbitrumSepoliaToken string `json:"alchemyArbitrumSepoliaToken"` 101 AlchemyOptimismMainnetToken string `json:"alchemyOptimismMainnetToken"` 102 AlchemyOptimismGoerliToken string `json:"alchemyOptimismGoerliToken"` 103 AlchemyOptimismSepoliaToken string `json:"alchemyOptimismSepoliaToken"` 104 105 StatusProxyStageName string `json:"statusProxyStageName"` 106 StatusProxyMarketUser string `json:"statusProxyMarketUser"` 107 StatusProxyMarketPassword string `json:"statusProxyMarketPassword"` 108 StatusProxyBlockchainUser string `json:"statusProxyBlockchainUser"` 109 StatusProxyBlockchainPassword string `json:"statusProxyBlockchainPassword"` 110 111 // Testing 112 GanacheURL string `json:"ganacheURL"` 113 } 114 115 func (c *CreateAccount) Validate(validation *CreateAccountValidation) error { 116 // TODO(cammellos): Add proper validation for password/displayname/etc 117 // Empty display name is allowed during account restore 118 if len(c.DisplayName) == 0 && !validation.AllowEmptyDisplayName { 119 return ErrCreateAccountInvalidDisplayName 120 } 121 122 if err := utils.ValidateDisplayName(&c.DisplayName); err != nil { 123 return errors.Wrap(ErrCreateAccountInvalidDisplayName, err.Error()) 124 } 125 126 if len(c.Password) == 0 && !validation.AllowEmptyPassword { 127 return ErrCreateAccountInvalidPassword 128 } 129 130 if len(c.CustomizationColor) == 0 && !validation.AllowEmptyCustomizationColor { 131 return ErrCreateAccountInvalidCustomizationColor 132 } 133 134 if len(c.RootDataDir) == 0 { 135 return ErrCreateAccountInvalidRootDataDir 136 } 137 138 return nil 139 } 140 141 // NOTE: Reasoning for this struct here: https://github.com/status-im/status-go/pull/4980#discussion_r1539219099 142 type CreateAccountValidation struct { 143 AllowEmptyDisplayName bool 144 AllowEmptyPassword bool 145 AllowEmptyCustomizationColor bool 146 }