6 "github.com/vapor/blockchain/txbuilder"
7 "github.com/vapor/consensus"
8 "github.com/vapor/errors"
9 "github.com/vapor/protocol/bc"
10 "github.com/vapor/protocol/bc/types"
13 type SpendAccountAction struct {
14 AccountID string `json:"account_id"`
18 func (s *SpendAccountAction) MarshalJSON() ([]byte, error) {
19 return json.Marshal(&struct {
20 Type string `json:"type"`
21 AccountID string `json:"account_id"`
24 Type: "spend_account",
25 AccountID: s.AccountID,
26 AssetAmount: s.AssetAmount,
30 type ControlAddressAction struct {
31 Address string `json:"address"`
35 func (c *ControlAddressAction) MarshalJSON() ([]byte, error) {
36 return json.Marshal(&struct {
37 Type string `json:"type"`
38 Address string `json:"address"`
41 Type: "control_address",
43 AssetAmount: c.AssetAmount,
47 func (n *Node) BatchSendBTM(accountID, password string, outputs map[string]uint64) (string, error) {
48 totalBTM := uint64(1000000)
49 actions := []interface{}{}
50 for address, amount := range outputs {
51 actions = append(actions, &ControlAddressAction{
53 AssetAmount: &bc.AssetAmount{AssetId: consensus.BTMAssetID, Amount: amount},
58 actions = append(actions, &SpendAccountAction{
60 AssetAmount: &bc.AssetAmount{AssetId: consensus.BTMAssetID, Amount: totalBTM},
63 tpl, err := n.buildTx(actions)
68 tpl, err = n.signTx(tpl, password)
73 return n.SubmitTx(tpl.Transaction)
76 type buildTxReq struct {
77 Actions []interface{} `json:"actions"`
80 func (n *Node) buildTx(actions []interface{}) (*txbuilder.Template, error) {
81 url := "/build-transaction"
82 payload, err := json.Marshal(&buildTxReq{Actions: actions})
84 return nil, errors.Wrap(err, "Marshal spend request")
87 result := &txbuilder.Template{}
88 return result, n.request(url, payload, result)
91 type signTxReq struct {
92 Tx *txbuilder.Template `json:"transaction"`
93 Password string `json:"password"`
96 type signTxResp struct {
97 Tx *txbuilder.Template `json:"transaction"`
98 SignComplete bool `json:"sign_complete"`
101 func (n *Node) signTx(tpl *txbuilder.Template, password string) (*txbuilder.Template, error) {
102 url := "/sign-transaction"
103 payload, err := json.Marshal(&signTxReq{Tx: tpl, Password: password})
105 return nil, errors.Wrap(err, "json marshal")
108 resp := &signTxResp{}
109 if err := n.request(url, payload, resp); err != nil {
113 if !resp.SignComplete {
114 return nil, errors.New("sign fail")
120 type submitTxReq struct {
121 Tx *types.Tx `json:"raw_transaction"`
124 type submitTxResp struct {
125 TxID string `json:"tx_id"`
128 func (n *Node) SubmitTx(tx *types.Tx) (string, error) {
129 url := "/submit-transaction"
130 payload, err := json.Marshal(submitTxReq{Tx: tx})
132 return "", errors.Wrap(err, "json marshal")
135 res := &submitTxResp{}
136 return res.TxID, n.request(url, payload, res)