diff --git a/api/worker.go b/api/worker.go index 397b1247..05d0c55a 100644 --- a/api/worker.go +++ b/api/worker.go @@ -112,8 +112,7 @@ func (w *Worker) GetTransaction(txid string, bestheight uint32, spendingTxs bool vout.Value = w.chainParser.AmountToDecimalString(&bchainVout.ValueSat) valOutSat.Add(&valOutSat, &bchainVout.ValueSat) vout.ScriptPubKey.Hex = bchainVout.ScriptPubKey.Hex - - vout.ScriptPubKey.Addresses = bchainVout.ScriptPubKey.Addresses + vout.ScriptPubKey.Addresses, vout.ScriptPubKey.Searchable, err = w.getAddressesFromVout(bchainVout) if spendingTxs { // TODO } diff --git a/bchain/coins/btc/bitcoinparser.go b/bchain/coins/btc/bitcoinparser.go index f741adf9..e48829fd 100644 --- a/bchain/coins/btc/bitcoinparser.go +++ b/bchain/coins/btc/bitcoinparser.go @@ -63,7 +63,7 @@ func (p *BitcoinParser) GetAddrDescFromAddress(address string) ([]byte, error) { // GetAddressesFromAddrDesc returns addresses for given address descriptor with flag if the addresses are searchable func (p *BitcoinParser) GetAddressesFromAddrDesc(addrDesc []byte) ([]string, bool, error) { - return p.outputScriptToAddresses(addrDesc) + return p.OutputScriptToAddressesFunc(addrDesc) } // GetScriptFromAddrDesc returns output script for given address descriptor @@ -97,6 +97,27 @@ func (p *BitcoinParser) outputScriptToAddresses(script []byte) ([]string, bool, var s bool if sc != txscript.NonStandardTy && sc != txscript.NullDataTy { s = true + } else { + if len(script) > 1 && script[0] == txscript.OP_RETURN && len(rv) == 0 { + 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([]byte{byte(l)}) + " " + hex.EncodeToString(data) + } + rv = []string{"OP_RETURN " + ed} + } + } } return rv, s, nil } diff --git a/bchain/coins/btc/bitcoinparser_test.go b/bchain/coins/btc/bitcoinparser_test.go index a9d367fa..74f7b4cb 100644 --- a/bchain/coins/btc/bitcoinparser_test.go +++ b/bchain/coins/btc/bitcoinparser_test.go @@ -102,10 +102,16 @@ func Test_GetAddressesFromAddrDesc(t *testing.T) { wantErr: false, }, { - // TODO handle OP_RETURN better - name: "OP_RETURN", + name: "OP_RETURN ascii", args: args{script: "6a0461686f6a"}, - want: []string{}, + want: []string{"OP_RETURN (ahoj)"}, + want2: false, + wantErr: false, + }, + { + name: "OP_RETURN hex", + args: args{script: "6a072020f1686f6a20"}, + want: []string{"OP_RETURN 07 2020f1686f6a20"}, want2: false, wantErr: false, }, diff --git a/static/templates/txdetail.html b/static/templates/txdetail.html index 2c70c912..f352700c 100644 --- a/static/templates/txdetail.html +++ b/static/templates/txdetail.html @@ -18,12 +18,11 @@ {{range $a := $vin.Addresses}} - {{if eq $a $addr}}{{$a}}{{else}} - {{$a}}{{end}} + {{if and (ne $a $addr) $vin.Searchable}}{{$a}}{{else}}{{$a}}{{end}} {{else}} No Inputs (Newly Generated Coins) - {{end}} {{if $vin.Addresses}} + {{end}}{{if $vin.Addresses}} {{formatAmount $vin.Value}} {{$cs}} {{end}} @@ -47,8 +46,7 @@ {{range $a := $vout.ScriptPubKey.Addresses}} - {{if eq $a $addr}}{{$a}}{{else}} - {{$a}}{{end}} + {{if and (ne $a $addr) $vout.ScriptPubKey.Searchable}}{{$a}}{{else}}{{$a}}{{end}} {{else}} Unparsed address