@@ -6,15 +6,17 @@ import (
6
6
"fmt"
7
7
"net/http"
8
8
"net/url"
9
+ "strings"
9
10
"time"
11
+ "unicode"
10
12
11
13
"github.com/pkg/errors"
12
14
)
13
15
14
16
var ErrorFarmNotFround = fmt .Errorf ("failed to get requested farm from node regiatrar" )
15
17
16
- func (c * RegistrarClient ) CreateFarm (farmName string , dedicated bool ) (farmID uint64 , err error ) {
17
- return c .createFarm (farmName , dedicated )
18
+ func (c * RegistrarClient ) CreateFarm (farmName , stellarAddr string , dedicated bool ) (farmID uint64 , err error ) {
19
+ return c .createFarm (farmName , stellarAddr , dedicated )
18
20
}
19
21
20
22
func (c * RegistrarClient ) UpdateFarm (farmID uint64 , opts ... UpdateFarmOpts ) (err error ) {
@@ -30,12 +32,13 @@ func (c *RegistrarClient) ListFarms(opts ...ListFarmOpts) (farms []Farm, err err
30
32
}
31
33
32
34
type farmCfg struct {
33
- farmName string
34
- farmID uint64
35
- twinID uint64
36
- dedicated bool
37
- page uint32
38
- size uint32
35
+ farmName string
36
+ farmID uint64
37
+ twinID uint64
38
+ dedicated bool
39
+ stellarAddress string
40
+ page uint32
41
+ size uint32
39
42
}
40
43
41
44
type (
@@ -91,26 +94,29 @@ func UpdateFarmWithDedicated() UpdateFarmOpts {
91
94
}
92
95
}
93
96
94
- func (c * RegistrarClient ) createFarm (farmName string , dedicated bool ) (farmID uint64 , err error ) {
95
- err = c .ensureTwinID ()
96
- if err != nil {
97
+ func (c * RegistrarClient ) createFarm (farmName , stellarAddr string , dedicated bool ) (farmID uint64 , err error ) {
98
+ if err := c .ensureTwinID (); err != nil {
97
99
return farmID , errors .Wrap (err , "failed to ensure twin id" )
98
100
}
99
101
102
+ if err = validateStellarAddress (stellarAddr ); err != nil {
103
+ return
104
+ }
105
+
100
106
url , err := url .JoinPath (c .baseURL , "farms" )
101
107
if err != nil {
102
108
return farmID , errors .Wrap (err , "failed to construct registrar url" )
103
109
}
104
110
105
111
data := Farm {
106
- FarmName : farmName ,
107
- TwinID : c .twinID ,
108
- Dedicated : dedicated ,
112
+ FarmName : farmName ,
113
+ TwinID : c .twinID ,
114
+ Dedicated : dedicated ,
115
+ StellarAddress : stellarAddr ,
109
116
}
110
117
111
118
var body bytes.Buffer
112
- err = json .NewEncoder (& body ).Encode (data )
113
- if err != nil {
119
+ if err = json .NewEncoder (& body ).Encode (data ); err != nil {
114
120
return farmID , errors .Wrap (err , "failed to encode request body" )
115
121
}
116
122
@@ -150,8 +156,7 @@ func (c *RegistrarClient) createFarm(farmName string, dedicated bool) (farmID ui
150
156
}
151
157
152
158
func (c * RegistrarClient ) updateFarm (farmID uint64 , opts []UpdateFarmOpts ) (err error ) {
153
- err = c .ensureTwinID ()
154
- if err != nil {
159
+ if c .ensureTwinID (); err != nil {
155
160
return errors .Wrap (err , "failed to ensure twin id" )
156
161
}
157
162
@@ -163,8 +168,13 @@ func (c *RegistrarClient) updateFarm(farmID uint64, opts []UpdateFarmOpts) (err
163
168
var body bytes.Buffer
164
169
data := parseUpdateFarmOpts (opts )
165
170
166
- err = json .NewEncoder (& body ).Encode (data )
167
- if err != nil {
171
+ if stellarAddr , ok := data ["stellar_address" ]; ok {
172
+ if err = validateStellarAddress (stellarAddr .(string )); err != nil {
173
+ return
174
+ }
175
+ }
176
+
177
+ if err = json .NewEncoder (& body ).Encode (data ); err != nil {
168
178
return errors .Wrap (err , "failed to encode request body" )
169
179
}
170
180
@@ -215,8 +225,7 @@ func (c *RegistrarClient) getFarm(id uint64) (farm Farm, err error) {
215
225
}
216
226
defer resp .Body .Close ()
217
227
218
- err = json .NewDecoder (resp .Body ).Decode (& farm )
219
- if err != nil {
228
+ if err = json .NewDecoder (resp .Body ).Decode (& farm ); err != nil {
220
229
return farm , err
221
230
}
222
231
@@ -253,8 +262,7 @@ func (c *RegistrarClient) listFarms(opts ...ListFarmOpts) (farms []Farm, err err
253
262
return farms , errors .Wrapf (err , "failed to get list farms with status code %s" , resp .Status )
254
263
}
255
264
defer resp .Body .Close ()
256
- err = json .NewDecoder (resp .Body ).Decode (& farms )
257
- if err != nil {
265
+ if err = json .NewDecoder (resp .Body ).Decode (& farms ); err != nil {
258
266
return farms , errors .Wrap (err , "failed to decode response body" )
259
267
}
260
268
@@ -318,6 +326,31 @@ func parseUpdateFarmOpts(opts []UpdateFarmOpts) map[string]any {
318
326
if cfg .dedicated {
319
327
data ["dedicated" ] = true
320
328
}
329
+ if len (cfg .stellarAddress ) != 0 {
330
+ data ["stellar_address" ] = cfg .stellarAddress
331
+ }
321
332
322
333
return data
323
334
}
335
+
336
+ func validateStellarAddress (stellarAddr string ) error {
337
+ stellarAddr = strings .TrimSpace (stellarAddr )
338
+ if len (stellarAddr ) != 56 {
339
+ return fmt .Errorf ("invalid stellar address %s, address length should be 56 characters" , stellarAddr )
340
+ }
341
+ if stellarAddr [0 ] != 'G' {
342
+ return fmt .Errorf ("invalid stellar address %s, address should should start with 'G'" , stellarAddr )
343
+ }
344
+
345
+ if strings .Compare (stellarAddr , strings .ToUpper (stellarAddr )) != 0 {
346
+ return fmt .Errorf ("invalid stellar address %s, address should be all uppercase" , stellarAddr )
347
+ }
348
+
349
+ // check if not alphanumeric
350
+ for _ , c := range stellarAddr {
351
+ if ! unicode .IsLetter (c ) && ! unicode .IsNumber (c ) {
352
+ return fmt .Errorf ("invalid stellar address %s, address character should be alphanumeric only" , stellarAddr )
353
+ }
354
+ }
355
+ return nil
356
+ }
0 commit comments