// newManagedAddressWithoutPrivKey returns a new managed address based on the // passed account, public key, and whether or not the public key should be // compressed. func newManagedAddressWithoutPrivKey(m *Manager, account uint32, pubKey *btcec.PublicKey, compressed bool, addrType addressType) (*managedAddress, error) { // Create a pay-to-pubkey-hash address from the public key. var pubKeyHash []byte if compressed { pubKeyHash = btcutil.Hash160(pubKey.SerializeCompressed()) } else { pubKeyHash = btcutil.Hash160(pubKey.SerializeUncompressed()) } var address btcutil.Address var err error switch addrType { // TODO(roasbeef): only use these types in the db? case adtChainNestedWitness: // For this address type we'l generate an address which is // backwards compatible to Bitcoin nodes running 0.6.0 onwards, but // allows us to take advantage of segwit's scripting improvments, // and malleability fixes. // First, we'll generate a normal p2wkh address from the pubkey hash. witAddr, err := btcutil.NewAddressWitnessPubKeyHash(pubKeyHash, m.chainParams) if err != nil { return nil, err } // Next we'll generate the witness program which can be used as a // pkScript to pay to this generated address. witnessProgram, err := txscript.PayToAddrScript(witAddr) if err != nil { return nil, err } // Finally, we'll use the witness program itself as the pre-image // to a p2sh address. In order to spend, we first use the // witnessProgram as the sigScript, then present the proper // <sig, pubkey> pair as the witness. address, err = btcutil.NewAddressScriptHash(witnessProgram, m.chainParams) if err != nil { return nil, err } case adtImport: // TODO(roasbeef): truly proper? fallthrough case adtChain: address, err = btcutil.NewAddressPubKeyHash(pubKeyHash, m.chainParams) if err != nil { return nil, err } case adtChainWitness: address, err = btcutil.NewAddressWitnessPubKeyHash(pubKeyHash, m.chainParams) if err != nil { return nil, err } } return &managedAddress{ manager: m, address: address, account: account, imported: false, internal: false, addrType: addrType, compressed: compressed, pubKey: pubKey, privKeyEncrypted: nil, privKeyCT: nil, }, nil }