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

     1  package main
     2  
     3  import (
     4  	"os"
     5  	"fmt"
     6  	"bytes"
     7  	"strconv"
     8  	"io/ioutil"
     9  	"encoding/hex"
    10  	"github.com/piotrnar/gocoin/lib/btc"
    11  )
    12  
    13  /*
    14  {
    15  "address" : "2NAHUDSC1EmbTBwQQp4VQ2FNzWDqHtmk1i6",
    16  "redeemScript" : "512102cdc4fff0ad031ea5f2d0d4337e2bf976b84334f8f80b08fe3f69886d58bc5a8a2102ebf54926d3edaae51bde71f2976948559a8d43fce52f5e7ed9ed85dbaa449d7f52ae"
    17  }
    18  */
    19  func main() {
    20  	var testnet bool
    21  	if len(os.Args)<3 {
    22  		fmt.Println("Specify one integer and at least one public key.")
    23  		fmt.Println("For Testent, make the integer negative.")
    24  		return
    25  	}
    26  	cnt, er := strconv.ParseInt(os.Args[1], 10, 32)
    27  	if er!=nil {
    28  		println("Count value:", er.Error())
    29  		return
    30  	}
    31  	if cnt<0 {
    32  		testnet = true
    33  		cnt = -cnt
    34  	}
    35  	if cnt<1 || cnt>16 {
    36  		println("The integer (required number of keys) must be between 1 and 16")
    37  		return
    38  	}
    39  	buf := new(bytes.Buffer)
    40  	buf.WriteByte(byte(0x50+cnt))
    41  	fmt.Println("Trying to prepare multisig address for", cnt, "out of", len(os.Args)-2, "public keys ...")
    42  	var pkeys byte
    43  	var ads string
    44  	for i:=2; i<len(os.Args); i++ {
    45  		if pkeys==16 {
    46  			println("Oh, give me a break. You don't need more than 16 public keys - stopping here!")
    47  			break
    48  		}
    49  		d, er := hex.DecodeString(os.Args[i])
    50  		if er != nil {
    51  			println("pubkey", i, er.Error())
    52  		}
    53  		_, er = btc.NewPublicKey(d)
    54  		if er != nil {
    55  			println("pubkey", i, er.Error())
    56  			return
    57  		}
    58  		pkeys++
    59  		buf.WriteByte(byte(len(d)))
    60  		buf.Write(d)
    61  		if ads!="" {
    62  			ads += ", "
    63  		}
    64  		ads += "\"" + btc.NewAddrFromPubkey(d, btc.AddrVerPubkey(testnet)).String() + "\""
    65  	}
    66  	buf.WriteByte(0x50+pkeys)
    67  	buf.WriteByte(0xae)
    68  
    69  	p2sh := buf.Bytes()
    70  	addr := btc.NewAddrFromPubkey(p2sh, btc.AddrVerScript(testnet))
    71  
    72  	rec := "{\n"
    73  	rec += fmt.Sprintf("\t\"multiAddress\" : \"%s\",\n", addr.String())
    74  	rec += fmt.Sprintf("\t\"scriptPubKey\" : \"a914%s87\",\n", hex.EncodeToString(addr.Hash160[:]))
    75  	rec += fmt.Sprintf("\t\"keysRequired\" : %d,\n", cnt)
    76  	rec += fmt.Sprintf("\t\"keysProvided\" : %d,\n", pkeys)
    77  	rec += fmt.Sprintf("\t\"redeemScript\" : \"%s\",\n", hex.EncodeToString(p2sh))
    78  	rec += fmt.Sprintf("\t\"listOfAddres\" : [%s]\n", ads)
    79  	rec += "}\n"
    80  	fname := addr.String()+".json"
    81  	ioutil.WriteFile(fname, []byte(rec), 0666)
    82  	fmt.Println("The address record stored in", fname)
    83  }