7 log "github.com/sirupsen/logrus"
8 "github.com/vapor/account"
9 "github.com/vapor/blockchain/txbuilder"
10 "github.com/vapor/config"
11 "github.com/vapor/crypto/ed25519/chainkd"
12 "github.com/vapor/errors"
13 "github.com/vapor/protocol/bc"
16 func (a *API) dpos(ctx context.Context, ins struct {
18 Fee uint64 `json:"fee"`
19 Stake uint64 `json:"stake"`
20 TxType uint8 `json:"tx_type"`
23 var assetID bc.AssetID
24 assetID.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"))
26 dpos := account.DopsAction{
27 Accounts: a.wallet.AccountMgr,
28 From: config.CommonConfig.Consensus.Dpos.Coinbase,
32 dpos.Amount = ins.Stake
33 dpos.AssetId = &assetID
34 builder := txbuilder.NewBuilder(time.Now())
35 if err := dpos.Build(ctx, builder); err != nil {
36 return NewErrorResponse(err)
40 tmpl, _, err := builder.Build()
42 return NewErrorResponse(err)
45 xprv.UnmarshalText([]byte(config.CommonConfig.Consensus.Dpos.XPrv))
46 if err := signWithKey(tmpl, xprv); err != nil {
47 return NewErrorResponse(err)
49 log.Info("Sign Transaction complete.")
50 log.Info(txbuilder.SignProgress(tmpl))
51 //return NewSuccessResponse(&signTemplateResp{Tx: tmpl, SignComplete: txbuilder.SignProgress(tmpl)})
54 if err := txbuilder.FinalizeTx(ctx, a.chain, tmpl.Transaction); err != nil {
55 return NewErrorResponse(err)
58 log.WithField("tx_id", tmpl.Transaction.ID.String()).Info("submit single tx")
59 return NewSuccessResponse(&submitTxResp{TxID: &tmpl.Transaction.ID})
61 //return NewSuccessResponse(nil)
64 func signWithKey(tmpl *txbuilder.Template, xprv chainkd.XPrv) error {
65 for i, sigInst := range tmpl.SigningInstructions {
66 for j, wc := range sigInst.WitnessComponents {
67 switch sw := wc.(type) {
68 case *txbuilder.SignatureWitness:
69 err := sw.Sign(tmpl, uint32(i), xprv)
71 return errors.WithDetailf(err, "adding signature(s) to signature witness component %d of input %d", j, i)
73 case *txbuilder.RawTxSigWitness:
74 err := sw.Sign(tmpl, uint32(i), xprv)
76 return errors.WithDetailf(err, "adding signature(s) to raw-signature witness component %d of input %d", j, i)
81 return materializeWitnessesWithKey(tmpl)
84 func materializeWitnessesWithKey(txTemplate *txbuilder.Template) error {
85 msg := txTemplate.Transaction
88 return errors.Wrap(txbuilder.ErrMissingRawTx)
91 if len(txTemplate.SigningInstructions) > len(msg.Inputs) {
92 return errors.Wrap(txbuilder.ErrBadInstructionCount)
95 for i, sigInst := range txTemplate.SigningInstructions {
96 if msg.Inputs[sigInst.Position] == nil {
97 return errors.WithDetailf(txbuilder.ErrBadTxInputIdx, "signing instruction %d references missing tx input %d", i, sigInst.Position)
101 for j, wc := range sigInst.WitnessComponents {
102 err := wc.Materialize(&witness)
104 return errors.WithDetailf(err, "error in witness component %d of input %d", j, i)
107 msg.SetInputArguments(sigInst.Position, witness)