@@ -219,17 +219,6 @@ func bi(hex string) *big.Int {
219219 return n
220220}
221221
222- var Networks = map [NetworkType ]* Network {
223- Mainnet : mainNet (),
224- Testnet : testNet (),
225- Regtest : regTest (),
226- Simnet : simNet (),
227- }
228-
229- func SelectNetwork (t NetworkType ) * Network {
230- return Networks [t ]
231- }
232-
233222func testNet () * Network {
234223 const (
235224 targetSpacing = uint32 (10 * 60 )
@@ -634,3 +623,177 @@ func simNet() *Network {
634623 // Need to implement
635624 return & Network {}
636625}
626+
627+ var Networks = map [NetworkType ]* Network {
628+ Mainnet : mainNet (),
629+ Testnet : testNet (),
630+ Regtest : regTest (),
631+ Simnet : simNet (),
632+ }
633+
634+ func SelectNetwork (t NetworkType ) * Network {
635+ return Networks [t ]
636+ }
637+
638+ var primary * Network
639+
640+ // SetPrimary sets the default/primary network.
641+ func SetPrimary (t NetworkType ) * Network {
642+ n := SelectNetwork (t )
643+ if n == nil {
644+ panic ("protocol: unknown network: " + string (t ))
645+ }
646+ primary = n
647+ return n
648+ }
649+
650+ // Primary returns the default network and defaults to mainnet
651+ func Primary () * Network {
652+ if primary == nil {
653+ return SetPrimary (Mainnet )
654+ }
655+ return primary
656+ }
657+
658+ // Get returns a network by type (nil if unknown)
659+ func Get (t NetworkType ) * Network {
660+ return SelectNetwork (t )
661+ }
662+
663+ // Ensure returns n if known, else returns Primary()
664+ func Ensure (n * Network ) * Network {
665+ if n != nil {
666+ return n
667+ }
668+ return Primary ()
669+ }
670+
671+ // Lookups helper functions
672+
673+ // FromMagic finds a network by magic number.
674+ func FromMagic (magic uint32 , prefer ... NetworkType ) * Network {
675+ if len (prefer ) > 0 {
676+ n := SelectNetwork (prefer [0 ])
677+ if n != nil && n .Magic == magic {
678+ return n
679+ }
680+ return nil
681+ }
682+ for _ , n := range Networks {
683+ if n != nil && n .Magic == magic {
684+ return n
685+ }
686+ }
687+ return nil
688+ }
689+
690+ // FromWIF finds a network by WIF prefix.
691+ func FromWIF (prefix uint32 , prefer ... NetworkType ) * Network {
692+ if len (prefer ) > 0 {
693+ n := SelectNetwork (prefer [0 ])
694+ if n != nil && n .KeyPrefix .Privkey == prefix {
695+ return n
696+ }
697+ return nil
698+ }
699+ for _ , n := range Networks {
700+ if n != nil && n .KeyPrefix .Privkey == prefix {
701+ return n
702+ }
703+ }
704+ return nil
705+ }
706+
707+ // FromPublic finds a network by xpubkey prefix.
708+ func FromPublic (prefix uint32 , prefer ... NetworkType ) * Network {
709+ if len (prefer ) > 0 {
710+ n := SelectNetwork (prefer [0 ])
711+ if n != nil && n .KeyPrefix .XPubKey == prefix {
712+ return n
713+ }
714+ return nil
715+ }
716+ for _ , n := range Networks {
717+ if n != nil && n .KeyPrefix .XPubKey == prefix {
718+ return n
719+ }
720+ }
721+ return nil
722+ }
723+
724+ // FromPrivate finds a network by its xprivkey prefix.
725+ func FromPrivate (prefix uint32 , prefer ... NetworkType ) * Network {
726+ if len (prefer ) > 0 {
727+ n := SelectNetwork (prefer [0 ])
728+ if n != nil && n .KeyPrefix .XPrivKey == prefix {
729+ return n
730+ }
731+ return nil
732+ }
733+ for _ , n := range Networks {
734+ if n != nil && n .KeyPrefix .XPrivKey == prefix {
735+ return n
736+ }
737+ }
738+ return nil
739+ }
740+
741+ // FromPublic58 finds a network by its xpubkey base58 prefix.
742+ func FromPublic58 (prefix string , prefer ... NetworkType ) * Network {
743+ if len (prefer ) > 0 {
744+ n := SelectNetwork (prefer [0 ])
745+ if n != nil && n .KeyPrefix .XPubKey58 == prefix {
746+ return n
747+ }
748+ return nil
749+ }
750+ for _ , n := range Networks {
751+ if n != nil && n .KeyPrefix .XPubKey58 == prefix {
752+ return n
753+ }
754+ }
755+ return nil
756+ }
757+
758+ // FromPrivate58 finds a network by its xprivkey base58 prefix.
759+ func FromPrivate58 (prefix string , prefer ... NetworkType ) * Network {
760+ if len (prefer ) > 0 {
761+ n := SelectNetwork (prefer [0 ])
762+ if n != nil && n .KeyPrefix .XPrivKey58 == prefix {
763+ return n
764+ }
765+ return nil
766+ }
767+ for _ , n := range Networks {
768+ if n != nil && n .KeyPrefix .XPrivKey58 == prefix {
769+ return n
770+ }
771+ }
772+ return nil
773+ }
774+
775+ // FromAddress finds a network by its bech32 address prefix.
776+ func FromAddress (hrp string , prefer ... NetworkType ) * Network {
777+ if len (prefer ) > 0 {
778+ n := SelectNetwork (prefer [0 ])
779+ if n != nil && n .AddressPrefix == hrp {
780+ return n
781+ }
782+ return nil
783+ }
784+ for _ , n := range Networks {
785+ if n != nil && n .AddressPrefix == hrp {
786+ return n
787+ }
788+ }
789+ return nil
790+ }
791+
792+ func (n * Network ) String () string {
793+ return n .Type
794+ }
795+
796+ // Types lists all supported network type constants.
797+ func Types () []NetworkType {
798+ return []NetworkType {Mainnet , Testnet , Regtest , Simnet }
799+ }
0 commit comments