@@ -22,49 +22,12 @@ import (
22
22
"math/big"
23
23
"os"
24
24
"reflect"
25
- "sync"
26
25
"time"
27
26
28
27
"github.com/blinklabs-io/gouroboros/cbor"
29
28
"github.com/blinklabs-io/gouroboros/ledger/common"
30
29
)
31
30
32
- // Network stake address headers
33
- var (
34
- stakeHeaderRegistry = map [string ]struct {
35
- Base , Script byte
36
- }{
37
- "Mainnet" : {0xE0 , 0xE1 },
38
- "Testnet" : {0xF0 , 0xF1 },
39
- }
40
- stakeHeaderMutex sync.RWMutex
41
- )
42
-
43
- // RegisterStakeHeaders allows runtime registration of network address headers
44
- func RegisterStakeHeaders (networkId string , baseHeader , scriptHeader byte ) {
45
- stakeHeaderMutex .Lock ()
46
- defer stakeHeaderMutex .Unlock ()
47
- stakeHeaderRegistry [networkId ] = struct { Base , Script byte }{
48
- Base : baseHeader ,
49
- Script : scriptHeader ,
50
- }
51
- }
52
-
53
- func getStakeAddressHeader (networkId string , isScript bool ) (byte , error ) {
54
- stakeHeaderMutex .RLock ()
55
- defer stakeHeaderMutex .RUnlock ()
56
-
57
- headers , exists := stakeHeaderRegistry [networkId ]
58
- if ! exists {
59
- return 0 , errors .New ("network not registered in stake header registry" )
60
- }
61
-
62
- if isScript {
63
- return headers .Script , nil
64
- }
65
- return headers .Base , nil
66
- }
67
-
68
31
type ShelleyGenesis struct {
69
32
cbor.StructAsArray
70
33
SystemStart time.Time `json:"systemStart"`
@@ -269,6 +232,17 @@ func (g *ShelleyGenesis) GenesisUtxos() ([]common.Utxo, error) {
269
232
return ret , nil
270
233
}
271
234
235
+ func (g * ShelleyGenesis ) getNetworkId () (uint8 , error ) {
236
+ switch g .NetworkId {
237
+ case "Mainnet" :
238
+ return common .AddressNetworkMainnet , nil
239
+ case "Testnet" :
240
+ return common .AddressNetworkTestnet , nil
241
+ default :
242
+ return 0 , errors .New ("unknown network ID" )
243
+ }
244
+ }
245
+
272
246
func (g * ShelleyGenesis ) InitialPools () (map [string ]common.PoolRegistrationCertificate , map [string ][]common.Address , error ) {
273
247
pools := make (map [string ]common.PoolRegistrationCertificate )
274
248
poolStake := make (map [string ][]common.Address )
@@ -277,38 +251,36 @@ func (g *ShelleyGenesis) InitialPools() (map[string]common.PoolRegistrationCerti
277
251
return pools , poolStake , nil
278
252
}
279
253
280
- headerByte , err := getStakeAddressHeader ( g . NetworkId , true )
254
+ networkId , err := g . getNetworkId ( )
281
255
if err != nil {
282
- return nil , nil , errors . New ( "failed to get stake address header" )
256
+ return nil , nil , err
283
257
}
284
258
259
+ // Process all stake addresses
285
260
for stakeAddr , poolId := range g .Staking .Stake {
286
- if len (stakeAddr ) != 56 {
287
- return nil , nil , errors .New ("invalid stake address length" )
288
- }
289
-
290
- stakeKeyBytes , err := hex .DecodeString (stakeAddr )
261
+ stakeKey , err := hex .DecodeString (stakeAddr )
291
262
if err != nil {
292
263
return nil , nil , errors .New ("failed to decode stake key" )
293
264
}
294
265
295
- stakeAddrBytes := append ([]byte {headerByte }, stakeKeyBytes ... )
296
- addr , err := common .NewAddressFromBytes (stakeAddrBytes )
266
+ addr , err := common .NewAddressFromParts (
267
+ common .AddressTypeNoneScript , // Script stake address
268
+ networkId ,
269
+ nil ,
270
+ stakeKey ,
271
+ )
297
272
if err != nil {
298
- return nil , nil , errors .New ("failed to create stake address" )
273
+ return nil , nil , errors .New ("failed to create address" )
299
274
}
300
275
301
276
poolStake [poolId ] = append (poolStake [poolId ], addr )
302
277
}
303
278
279
+ // Process all stake pools
304
280
for poolId , pool := range g .Staking .Pools {
305
- if len (poolId ) != 56 {
306
- return nil , nil , errors .New ("invalid pool ID length" )
307
- }
308
-
309
281
operatorBytes , err := hex .DecodeString (poolId )
310
282
if err != nil {
311
- return nil , nil , errors .New ("failed to decode pool operator key " )
283
+ return nil , nil , errors .New ("failed to decode pool ID " )
312
284
}
313
285
314
286
pools [poolId ] = common.PoolRegistrationCertificate {
@@ -334,30 +306,30 @@ func (g *ShelleyGenesis) PoolById(poolId string) (*common.PoolRegistrationCertif
334
306
335
307
pool , exists := g .Staking .Pools [poolId ]
336
308
if ! exists {
337
- return nil , nil , errors .New ("pool not found" )
309
+ return nil , nil , errors .New ("pool not found" )
338
310
}
339
311
340
- headerByte , err := getStakeAddressHeader ( g . NetworkId , true )
312
+ networkId , err := g . getNetworkId ( )
341
313
if err != nil {
342
- return nil , nil , errors . New ( "failed to get stake address header" )
314
+ return nil , nil , err
343
315
}
344
316
345
317
var delegators []common.Address
346
318
for stakeAddr , pId := range g .Staking .Stake {
347
319
if pId == poolId {
348
- if len (stakeAddr ) != 56 {
349
- return nil , nil , errors .New ("invalid stake address length" )
350
- }
351
-
352
- stakeKeyBytes , err := hex .DecodeString (stakeAddr )
320
+ stakeKey , err := hex .DecodeString (stakeAddr )
353
321
if err != nil {
354
322
return nil , nil , errors .New ("failed to decode stake key" )
355
323
}
356
324
357
- stakeAddrBytes := append ([]byte {headerByte }, stakeKeyBytes ... )
358
- addr , err := common .NewAddressFromBytes (stakeAddrBytes )
325
+ addr , err := common .NewAddressFromParts (
326
+ common .AddressTypeNoneScript ,
327
+ networkId ,
328
+ nil ,
329
+ stakeKey ,
330
+ )
359
331
if err != nil {
360
- return nil , nil , errors .New ("failed to create stake address" )
332
+ return nil , nil , errors .New ("failed to create address" )
361
333
}
362
334
363
335
delegators = append (delegators , addr )
0 commit comments