func Txs(args []string) error { alltx, err := SCon.TS.GetAllTxs() if err != nil { return err } for i, tx := range alltx { fmt.Printf("tx %d %s\n", i, uspv.TxToString(tx)) } return nil }
// SendCoins does send coins, but it's very rudimentary func SendCoins(s uspv.SPVCon, adr btcutil.Address, sendAmt int64) error { var err error var score int64 allUtxos, err := s.TS.GetAllUtxos() if err != nil { return err } for _, utxo := range allUtxos { score += utxo.Value } // important rule in bitcoin, output total > input total is invalid. if sendAmt > score { return fmt.Errorf("trying to send %d but %d available.", sendAmt, score) } tx := wire.NewMsgTx() // make new tx // make address script 76a914...88ac adrScript, err := txscript.PayToAddrScript(adr) if err != nil { return err } // make user specified txout and add to tx txout := wire.NewTxOut(sendAmt, adrScript) tx.AddTxOut(txout) nokori := sendAmt // nokori is how much is needed on input side for _, utxo := range allUtxos { // generate pkscript to sign prevPKscript, err := txscript.PayToAddrScript( s.TS.Adrs[utxo.KeyIdx].PkhAdr) if err != nil { return err } // make new input from this utxo thisInput := wire.NewTxIn(&utxo.Op, prevPKscript) tx.AddTxIn(thisInput) nokori -= utxo.Value if nokori < -10000 { // minimum overage / fee is 1K now break } } // there's enough left to make a change output if nokori < -200000 { change, err := s.TS.NewAdr() if err != nil { return err } changeScript, err := txscript.PayToAddrScript(change) if err != nil { return err } changeOut := wire.NewTxOut((-100000)-nokori, changeScript) tx.AddTxOut(changeOut) } // use txstore method to sign err = s.TS.SignThis(tx) if err != nil { return err } fmt.Printf("tx: %s", uspv.TxToString(tx)) buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize())) tx.Serialize(buf) fmt.Printf("tx: %x\n", buf.Bytes()) // send it out on the wire. hope it gets there. // we should deal with rejects. Don't yet. err = s.NewOutgoingTx(tx) if err != nil { return err } return nil }