github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/tools/tap2old/tap2old.go (about)

     1  package main
     2  
     3  // Convert TAP-public-key address to the old P2KH address
     4  // Or
     5  // COnvert public key to all compatibe BTC deposit addresses
     6  
     7  import (
     8  	"encoding/hex"
     9  	"fmt"
    10  	"os"
    11  
    12  	"github.com/piotrnar/gocoin/lib/btc"
    13  )
    14  
    15  func dump_all_addrs(pk []byte, testnet bool) {
    16  	ad := btc.NewAddrFromPubkey(pk, btc.AddrVerPubkey(testnet))
    17  	if ad == nil {
    18  		println("Unexpected error returned by NewAddrFromPubkey()")
    19  		return
    20  	}
    21  	hrp := btc.GetSegwitHRP(testnet)
    22  	fmt.Println("", ad.String())
    23  
    24  	ad.Enc58str = ""
    25  	ad.SegwitProg = &btc.SegwitProg{HRP: hrp, Version: 1, Program: pk[1:]}
    26  	fmt.Println("", ad.String())
    27  
    28  	ad.Enc58str = ""
    29  	ad.SegwitProg = &btc.SegwitProg{HRP: hrp, Version: 0, Program: ad.Hash160[:]}
    30  	fmt.Println("", ad.String())
    31  
    32  	h160 := btc.Rimp160AfterSha256(append([]byte{0, 20}, ad.Hash160[:]...))
    33  	ad = btc.NewAddrFromHash160(h160[:], btc.AddrVerScript(testnet))
    34  	fmt.Println("", ad.String())
    35  }
    36  
    37  func main() {
    38  	if len(os.Args) < 2 {
    39  		println("Specify bech32 encoded Taproot deposit address or hex encoded public key")
    40  		return
    41  	}
    42  
    43  	// Try to decode public key first
    44  	if len(os.Args[1]) == 66 && os.Args[1][0] == '0' && (os.Args[1][1] == '2' || os.Args[1][1] == '3') {
    45  		pk, er := hex.DecodeString(os.Args[1])
    46  		if er != nil {
    47  			println(er.Error())
    48  			return
    49  		}
    50  		fmt.Println("Mainnet:")
    51  		dump_all_addrs(pk, false)
    52  
    53  		fmt.Println("Testnet:")
    54  		dump_all_addrs(pk, true)
    55  		return
    56  	}
    57  
    58  	// if not public key, do the taproot bech32 encoded...
    59  	ad, er := btc.NewAddrFromString(os.Args[1])
    60  	if er != nil {
    61  		println(er.Error())
    62  		return
    63  	}
    64  	if ad.SegwitProg == nil {
    65  		println("This is not a segwit type address")
    66  		return
    67  	}
    68  	fmt.Println("Version:", ad.SegwitProg.Version)
    69  	fmt.Println("Program:", hex.EncodeToString(ad.SegwitProg.Program))
    70  	if ad.SegwitProg.Version != 1 {
    71  		println("This is not segwit version 1 address")
    72  		return
    73  	}
    74  	if len(ad.SegwitProg.Program) != 32 {
    75  		println("Program length must be 32 bytes")
    76  		return
    77  	}
    78  	fmt.Println("Possible P2KH addresses:")
    79  	fmt.Println("", btc.NewAddrFromPubkey(append([]byte{0x02}, ad.SegwitProg.Program...), btc.AddrVerPubkey(false)))
    80  	fmt.Println("", btc.NewAddrFromPubkey(append([]byte{0x03}, ad.SegwitProg.Program...), btc.AddrVerPubkey(false)))
    81  }