4 "github.com/vapor/blockchain/txbuilder"
5 "github.com/vapor/crypto/ed25519/chainkd"
6 "github.com/vapor/errors"
9 func SignWithKey(tmpl *txbuilder.Template, xprv chainkd.XPrv) error {
10 for i, sigInst := range tmpl.SigningInstructions {
11 for j, wc := range sigInst.WitnessComponents {
12 switch sw := wc.(type) {
13 case *txbuilder.SignatureWitness:
14 err := sw.Sign(tmpl, uint32(i), xprv)
16 return errors.WithDetailf(err, "adding signature(s) to signature witness component %d of input %d", j, i)
18 case *txbuilder.RawTxSigWitness:
19 err := sw.Sign(tmpl, uint32(i), xprv)
21 return errors.WithDetailf(err, "adding signature(s) to raw-signature witness component %d of input %d", j, i)
26 return materializeWitnessesWithKey(tmpl)
29 func materializeWitnessesWithKey(txTemplate *txbuilder.Template) error {
30 msg := txTemplate.Transaction
33 return errors.Wrap(txbuilder.ErrMissingRawTx)
36 if len(txTemplate.SigningInstructions) > len(msg.Inputs) {
37 return errors.Wrap(txbuilder.ErrBadInstructionCount)
40 for i, sigInst := range txTemplate.SigningInstructions {
41 if msg.Inputs[sigInst.Position] == nil {
42 return errors.WithDetailf(txbuilder.ErrBadTxInputIdx, "signing instruction %d references missing tx input %d", i, sigInst.Position)
46 for j, wc := range sigInst.WitnessComponents {
47 err := wc.Materialize(&witness)
49 return errors.WithDetailf(err, "error in witness component %d of input %d", j, i)
52 msg.SetInputArguments(sigInst.Position, witness)