From 207a6b36e8a60fbdd5e23002b3b603a3b17cadcf Mon Sep 17 00:00:00 2001 From: wakiyamap Date: Thu, 27 Sep 2018 13:26:47 -0400 Subject: [PATCH] fix monacoinparser --- bchain/coins/monacoin/monacoinparser.go | 105 +++++++++++++++++++++--- 1 file changed, 93 insertions(+), 12 deletions(-) diff --git a/bchain/coins/monacoin/monacoinparser.go b/bchain/coins/monacoin/monacoinparser.go index d5a9de37..3e3d795d 100644 --- a/bchain/coins/monacoin/monacoinparser.go +++ b/bchain/coins/monacoin/monacoinparser.go @@ -3,6 +3,7 @@ package monacoin import ( "blockbook/bchain" "blockbook/bchain/coins/btc" + "encoding/hex" "github.com/btcsuite/btcd/wire" "github.com/jakm/btcutil/chaincfg" @@ -65,7 +66,9 @@ type MonacoinParser struct { // NewMonacoinParser returns new MonacoinParser instance func NewMonacoinParser(params *chaincfg.Params, c *btc.Configuration) *MonacoinParser { - return &MonacoinParser{BitcoinParser: btc.NewBitcoinParser(params, c)} + p := &MonacoinParser{BitcoinParser: btc.NewBitcoinParser(params, c)} + p.OutputScriptToAddressesFunc = p.outputScriptToAddresses + return p } // GetChainParams contains network parameters for the main Monacoin network, @@ -82,17 +85,6 @@ func GetChainParams(chain string) *chaincfg.Params { } } -// GetMonaChainParams contains network parameters for the main Monacoin network, -// and the test Monacoin network -func GetMonaChainParams(chain string) *monacoinCfg.Params { - switch chain { - case "test": - return &MonaTestParams - default: - return &MonaMainParams - } -} - // GetAddrDescFromAddress returns internal address representation (descriptor) of given address func (p *MonacoinParser) GetAddrDescFromAddress(address string) (bchain.AddressDescriptor, error) { return p.addressToOutputScript(address) @@ -123,3 +115,92 @@ func (p *MonacoinParser) addressToOutputScript(address string) ([]byte, error) { return script, nil } } + +// GetAddressesFromAddrDesc returns addresses for given address descriptor with flag if the addresses are searchable +func (p *MonacoinParser) GetAddressesFromAddrDesc(addrDesc bchain.AddressDescriptor) ([]string, bool, error) { + return p.OutputScriptToAddressesFunc(addrDesc) +} + +// outputScriptToAddresses converts ScriptPubKey to bitcoin addresses +func (p *MonacoinParser) outputScriptToAddresses(script []byte) ([]string, bool, error) { + switch p.Params.Net { + case MainnetMagic: + sc, addresses, _, err := txscript.ExtractPkScriptAddrs(script, &MonaMainParams) + if err != nil { + return nil, false, err + } + rv := make([]string, len(addresses)) + for i, a := range addresses { + rv[i] = a.EncodeAddress() + } + var s bool + if sc != txscript.NonStandardTy && sc != txscript.NullDataTy { + s = true + } else if len(rv) == 0 { + or := TryParseOPReturn(script) + if or != "" { + rv = []string{or} + } + } + return rv, s, nil + default: + sc, addresses, _, err := txscript.ExtractPkScriptAddrs(script, &MonaTestParams) + if err != nil { + return nil, false, err + } + rv := make([]string, len(addresses)) + for i, a := range addresses { + rv[i] = a.EncodeAddress() + } + var s bool + if sc != txscript.NonStandardTy && sc != txscript.NullDataTy { + s = true + } else if len(rv) == 0 { + or := TryParseOPReturn(script) + if or != "" { + rv = []string{or} + } + } + return rv, s, nil + } +} + +// TryParseOPReturn tries to process OP_RETURN script and return its string representation +func TryParseOPReturn(script []byte) string { + if len(script) > 1 && script[0] == txscript.OP_RETURN { + // trying 2 variants of OP_RETURN data + // 1) OP_RETURN OP_PUSHDATA1 + // 2) OP_RETURN + var data []byte + var l int + if script[1] == txscript.OP_PUSHDATA1 && len(script) > 2 { + l = int(script[2]) + data = script[3:] + if l != len(data) { + l = int(script[1]) + data = script[2:] + } + } else { + l = int(script[1]) + data = script[2:] + } + if l == len(data) { + isASCII := true + for _, c := range data { + if c < 32 || c > 127 { + isASCII = false + break + } + } + var ed string + if isASCII { + ed = "(" + string(data) + ")" + } else { + ed = hex.EncodeToString(data) + } + return "OP_RETURN " + ed + } + } + return "" +} +