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 }