diff --git a/internal/rpc/rpcserver/server.go b/internal/rpc/rpcserver/server.go index d13f8667b..7df807f89 100644 --- a/internal/rpc/rpcserver/server.go +++ b/internal/rpc/rpcserver/server.go @@ -1990,11 +1990,17 @@ func (s *walletServer) ValidateAddress(ctx context.Context, req *pb.ValidateAddr result.IsValid = true - // NOTE: ValidateAddress only sets script type for owned and P2SH, but - // perhaps it should regardless of address type and ownership: - // ver, scr := addr.PaymentScript() - // class, _ := stdscript.ExtractAddrs(ver, scr, s.wallet.ChainParams()) - // result.ScriptType = pb.ValidateAddressResponse_ScriptType(scProto(class)) + ver, scr := addr.PaymentScript() + class, _ := stdscript.ExtractAddrs(ver, scr, s.wallet.ChainParams()) + result.ScriptType = pb.ValidateAddressResponse_ScriptType(scProto(class)) + result.PayToAddrScript = scr + if pker, ok := addr.(stdaddr.SerializedPubKeyer); ok { + result.PubKey = pker.SerializedPubKey() + result.PubKeyAddr = addr.String() + } + if class == stdscript.STScriptHash { + result.IsScript = true + } ka, err := s.wallet.KnownAddress(ctx, addr) if err != nil { @@ -2024,15 +2030,9 @@ func (s *walletServer) ValidateAddress(ctx context.Context, req *pb.ValidateAddr } result.PubKeyAddr = pubKeyAddr.String() case wallet.P2SHAddress: - result.IsScript = true - version, script := ka.PaymentScript() // addr.PaymentScript() - result.PayToAddrScript = script - - // BUG: ka.RedeemScript would only be relevant now since we know the - // PaymentScript class (P2SH), addresses, and required sigs. - class, addrs := stdscript.ExtractAddrs(version, script, s.wallet.ChainParams()) - reqSigs := stdscript.DetermineRequiredSigs(version, script) - + version, redeem := ka.RedeemScript() + class, addrs := stdscript.ExtractAddrs(version, redeem, s.wallet.ChainParams()) + reqSigs := stdscript.DetermineRequiredSigs(version, redeem) addrStrings := make([]string, len(addrs)) for i, a := range addrs { addrStrings[i] = a.String() @@ -2050,7 +2050,7 @@ func (s *walletServer) ValidateAddress(ctx context.Context, req *pb.ValidateAddr switch ka := ka.(type) { case wallet.BIP0044Address: _, branch, child := ka.Path() - result.IsInternal = branch == 1 + result.IsInternal = branch == udb.InternalBranch result.Index = child } diff --git a/wallet/addresses.go b/wallet/addresses.go index 27c410fb3..3a6485f18 100644 --- a/wallet/addresses.go +++ b/wallet/addresses.go @@ -141,7 +141,7 @@ func (m *managedAddress) p2shScript() (uint16, []byte) { s := []byte{ 0: txscript.OP_HASH160, 1: txscript.OP_DATA_20, - 22: txscript.OP_EQUALVERIFY, + 22: txscript.OP_EQUAL, } copy(s[2:22], sh) return 0, s diff --git a/wallet/udb/addressmanager.go b/wallet/udb/addressmanager.go index 977e9d2c6..8e83d6a64 100644 --- a/wallet/udb/addressmanager.go +++ b/wallet/udb/addressmanager.go @@ -106,6 +106,10 @@ func normalizeAddress(addr stdaddr.Address) stdaddr.Address { switch addr := addr.(type) { case *stdaddr.AddressPubKeyEcdsaSecp256k1V0: return addr.AddressPubKeyHash() + case *stdaddr.AddressPubKeyEd25519V0: + return addr.AddressPubKeyHash() + case *stdaddr.AddressPubKeySchnorrSecp256k1V0: + return addr.AddressPubKeyHash() default: return addr }