// minimumFee calculates the minimum fee required for a transaction. // If allowFree is true, a fee may be zero so long as the entire // transaction has a serialized length less than 1 kilobyte // and none of the outputs contain a value less than 1 bitcent. // Otherwise, the fee will be calculated using TxFeeIncrement, // incrementing the fee for each kilobyte of transaction. func minimumFee(tx *btcwire.MsgTx, allowFree bool) btcutil.Amount { txLen := tx.SerializeSize() TxFeeIncrement.Lock() incr := TxFeeIncrement.i TxFeeIncrement.Unlock() fee := btcutil.Amount(int64(1+txLen/1000) * int64(incr)) if allowFree && txLen < 1000 { fee = 0 } if fee < incr { for _, txOut := range tx.TxOut { if txOut.Value < btcutil.SatoshiPerBitcent { return incr } } } max := btcutil.Amount(btcutil.MaxSatoshi) if fee < 0 || fee > max { fee = max } return fee }
// SignRawTransaction2Async returns an instance of a type that can be used to // get the result of the RPC at some future time by invoking the Receive // function on the returned instance. // // See SignRawTransaction2 for the blocking version and more details. func (c *Client) SignRawTransaction2Async(tx *btcwire.MsgTx, inputs []btcjson.RawTxInput) FutureSignRawTransactionResult { txHex := "" if tx != nil { // Serialize the transaction and convert to hex string. buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize())) if err := tx.Serialize(buf); err != nil { return newFutureError(err) } txHex = hex.EncodeToString(buf.Bytes()) } id := c.NextID() cmd, err := btcjson.NewSignRawTransactionCmd(id, txHex, inputs) if err != nil { return newFutureError(err) } return c.sendCmd(cmd) }
// toHex converts a msgTx into a hex string. func ToHex(tx *btcwire.MsgTx) string { buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize())) tx.Serialize(buf) txHex := hex.EncodeToString(buf.Bytes()) return txHex }