mirror of
https://github.com/muun/recovery.git
synced 2025-02-23 11:32:33 -05:00
51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
|
package addresses
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/btcsuite/btcd/chaincfg"
|
||
|
"github.com/btcsuite/btcutil/hdkeychain"
|
||
|
"github.com/muun/libwallet/btcsuitew/btcutilw"
|
||
|
"github.com/muun/libwallet/musig"
|
||
|
)
|
||
|
|
||
|
// CreateAddressV5 returns a P2TR WalletAddress using Musig with the signing and cosigning keys.
|
||
|
func CreateAddressV5(userKey, muunKey *hdkeychain.ExtendedKey, path string, network *chaincfg.Params) (*WalletAddress, error) {
|
||
|
witnessProgram, err := CreateWitnessScriptV5(userKey, muunKey)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("failed to generate witness script v5: %w", err)
|
||
|
}
|
||
|
|
||
|
address, err := btcutilw.NewAddressTaprootKey(witnessProgram, network)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &WalletAddress{
|
||
|
address: address.EncodeAddress(),
|
||
|
version: V5,
|
||
|
derivationPath: path,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func CreateWitnessScriptV5(userKey, muunKey *hdkeychain.ExtendedKey) ([]byte, error) {
|
||
|
userPublicKey, err := userKey.ECPubKey()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
muunPublicKey, err := muunKey.ECPubKey()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
combined, err := musig.CombinePubKeysWithTweak(userPublicKey, muunPublicKey, nil)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
xOnlyCombined := combined.SerializeCompressed()[1:]
|
||
|
|
||
|
return xOnlyCombined, nil
|
||
|
}
|