From e754a6c0fdcb0e5c87768ba0b622340359064f62 Mon Sep 17 00:00:00 2001 From: Martin Boehm Date: Tue, 19 Nov 2019 11:13:15 +0100 Subject: [PATCH] Fix incorrect registration of network params in unobtanium and viacoin --- bchain/coins/dogecoin/dogecoinparser_test.go | 81 ++++++++++++++++++++ bchain/coins/unobtanium/unobtaniumparser.go | 12 +-- bchain/coins/viacoin/viacoinparser.go | 19 +++-- 3 files changed, 99 insertions(+), 13 deletions(-) diff --git a/bchain/coins/dogecoin/dogecoinparser_test.go b/bchain/coins/dogecoin/dogecoinparser_test.go index 5738290a..e2803fd3 100644 --- a/bchain/coins/dogecoin/dogecoinparser_test.go +++ b/bchain/coins/dogecoin/dogecoinparser_test.go @@ -46,6 +46,12 @@ func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { want: "76a914efb6158f75743c611858fdfd0f4aaec6cc6196bc88ac", wantErr: false, }, + { + name: "P2PKH3", + args: args{address: "DHobAps6DjZ5n4xMV75n7kJv299Zi85FCG"}, + want: "76a9148ae937291e72f7368421dbaa966c44950eb14db788ac", + wantErr: false, + }, { name: "P2SH1", args: args{address: "9tg1kVUk339Tk58ewu5T8QT82Z6cE4UvSU"}, @@ -76,6 +82,81 @@ func Test_GetAddrDescFromAddress_Mainnet(t *testing.T) { } } +func Test_GetAddressesFromAddrDesc_Mainnet(t *testing.T) { + type args struct { + script string + } + tests := []struct { + name string + args args + want []string + want2 bool + wantErr bool + }{ + { + name: "P2PKH1", + args: args{script: "76a9148841590909747c0f97af158f22fadacb1652522088ac"}, + want: []string{"DHZYinsaM9nW5piCMN639ELRKbZomThPnZ"}, + want2: true, + wantErr: false, + }, + { + name: "P2PKH2", + args: args{script: "76a914efb6158f75743c611858fdfd0f4aaec6cc6196bc88ac"}, + want: []string{"DSzaAYEYyy9ngjoJ294r7jzFM3xhD6bKHK"}, + want2: true, + wantErr: false, + }, + { + name: "P2PKH3", + args: args{script: "76a91450e86eeac599ad023b8981296d01b50bdabcdd9788ac"}, + want: []string{"DCWu3MLz9xBGFuuLyNDf6QjuGp49f5tfc9"}, + want2: true, + wantErr: false, + }, + { + name: "P2SH1", + args: args{script: "a9141889a089400ea25d28694fd98aa7702b21eeeab187"}, + want: []string{"9tg1kVUk339Tk58ewu5T8QT82Z6cE4UvSU"}, + want2: true, + wantErr: false, + }, + { + name: "OP_RETURN ascii", + args: args{script: "6a0461686f6a"}, + want: []string{"OP_RETURN (ahoj)"}, + want2: false, + wantErr: false, + }, + { + name: "OP_RETURN hex", + args: args{script: "6a072020f1686f6a20"}, + want: []string{"OP_RETURN 2020f1686f6a20"}, + want2: false, + wantErr: false, + }, + } + + parser := NewDogecoinParser(GetChainParams("main"), &btc.Configuration{}) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + b, _ := hex.DecodeString(tt.args.script) + got, got2, err := parser.GetAddressesFromAddrDesc(b) + if (err != nil) != tt.wantErr { + t.Errorf("GetAddressesFromAddrDesc() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want) + } + if !reflect.DeepEqual(got2, tt.want2) { + t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2) + } + }) + } +} + var ( testTx1 bchain.Tx testTxPacked1 = "00030e6d8ba8d7aa2001000000016b3c0c53267964120acf7f7e72217e3f463e52ce622f89659f6a6bb8e69a4d91000000006c493046022100a96454237e3a020994534583e28c04757881374bceac89f933ea9ff00b4db259022100fbb757ff7ea4f02c4e42556b2834c61eba1f1af605db089d836a0614d90a3b46012103cebdde6d1046e285df4f48497bc50dc20a4a258ca5b7308cb0a929c9fdadcd9dffffffff0217e823ca7f0200001976a914eef21768a546590993e313c7f3dfadf6a6efa1e888acaddf4cba010000001976a914e0fee2ea29dd9c6c759d8341bd0da4c4f738cced88ac00000000" diff --git a/bchain/coins/unobtanium/unobtaniumparser.go b/bchain/coins/unobtanium/unobtaniumparser.go index eac2cc95..aab02aa4 100644 --- a/bchain/coins/unobtanium/unobtaniumparser.go +++ b/bchain/coins/unobtanium/unobtaniumparser.go @@ -27,11 +27,6 @@ func init() { // Mainnet address encoding magics MainNetParams.PubKeyHashAddrID = []byte{130} MainNetParams.ScriptHashAddrID = []byte{30} - - err := chaincfg.Register(&MainNetParams) - if err != nil { - panic(err) - } } // UnobtaniumParser handle @@ -44,7 +39,14 @@ func NewUnobtaniumParser(params *chaincfg.Params, c *btc.Configuration) *Unobtan return &UnobtaniumParser{BitcoinParser: btc.NewBitcoinParser(params, c)} } +// GetChainParams returns network parameters func GetChainParams(chain string) *chaincfg.Params { + if !chaincfg.IsRegistered(&MainNetParams) { + err := chaincfg.Register(&MainNetParams) + if err != nil { + panic(err) + } + } switch chain { default: return &MainNetParams diff --git a/bchain/coins/viacoin/viacoinparser.go b/bchain/coins/viacoin/viacoinparser.go index d0583ecd..3617e90a 100644 --- a/bchain/coins/viacoin/viacoinparser.go +++ b/bchain/coins/viacoin/viacoinparser.go @@ -38,14 +38,6 @@ func init() { RegtestParams.PubKeyHashAddrID = []byte{111} // base58 prefix: m or n RegtestParams.ScriptHashAddrID = []byte{196} // base58 prefix: 2 RegtestParams.Bech32HRPSegwit = "tvia" - - err := chaincfg.Register(&MainNetParams) - if err == nil { - err = chaincfg.Register(&RegtestParams) - } - if err != nil { - panic(err) - } } // ViacoinParser handle @@ -58,7 +50,18 @@ func NewViacoinParser(params *chaincfg.Params, c *btc.Configuration) *ViacoinPar return &ViacoinParser{BitcoinParser: btc.NewBitcoinParser(params, c)} } +// GetChainParams returns network parameters func GetChainParams(chain string) *chaincfg.Params { + if !chaincfg.IsRegistered(&MainNetParams) { + err := chaincfg.Register(&MainNetParams) + if err == nil { + err = chaincfg.Register(&RegtestParams) + } + if err != nil { + panic(err) + } + } + switch chain { case "regtest": return &RegtestParams