fix monacoinparser
This commit is contained in:
parent
776bebdf23
commit
207a6b36e8
@ -3,6 +3,7 @@ package monacoin
|
|||||||
import (
|
import (
|
||||||
"blockbook/bchain"
|
"blockbook/bchain"
|
||||||
"blockbook/bchain/coins/btc"
|
"blockbook/bchain/coins/btc"
|
||||||
|
"encoding/hex"
|
||||||
|
|
||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/jakm/btcutil/chaincfg"
|
"github.com/jakm/btcutil/chaincfg"
|
||||||
@ -65,7 +66,9 @@ type MonacoinParser struct {
|
|||||||
|
|
||||||
// NewMonacoinParser returns new MonacoinParser instance
|
// NewMonacoinParser returns new MonacoinParser instance
|
||||||
func NewMonacoinParser(params *chaincfg.Params, c *btc.Configuration) *MonacoinParser {
|
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,
|
// 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
|
// GetAddrDescFromAddress returns internal address representation (descriptor) of given address
|
||||||
func (p *MonacoinParser) GetAddrDescFromAddress(address string) (bchain.AddressDescriptor, error) {
|
func (p *MonacoinParser) GetAddrDescFromAddress(address string) (bchain.AddressDescriptor, error) {
|
||||||
return p.addressToOutputScript(address)
|
return p.addressToOutputScript(address)
|
||||||
@ -123,3 +115,92 @@ func (p *MonacoinParser) addressToOutputScript(address string) ([]byte, error) {
|
|||||||
return script, nil
|
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 <datalen> <data>
|
||||||
|
// 2) OP_RETURN <datalen> <data>
|
||||||
|
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 ""
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user