// Creates a transaction spending amt with additional fee. Fee is in addition // to the base required fee given amt.Hours. // TODO // - pull in outputs from blockchain from wallet // - create transaction here // - sign transction and return func Spend2(self *visor.Visor, wrpc *WalletRPC, walletID wallet.WalletID, amt wallet.Balance, fee uint64, dest cipher.Address) (coin.Transaction, error) { wallet := wrpc.Wallets.Get(walletID) if wallet == nil { return coin.Transaction{}, fmt.Errorf("Unknown wallet %v", walletID) } //pull in outputs and do this here //FIX tx, err := visor.CreateSpendingTransaction(*wallet, self.Unconfirmed, &self.Blockchain.Unspent, self.Blockchain.Time(), amt, dest) if err != nil { return tx, err } if err := tx.Verify(); err != nil { log.Panicf("Invalid transaction, %v", err) } if err := visor.VerifyTransactionFee(self.Blockchain, &tx); err != nil { log.Panicf("Created invalid spending txn: visor fail, %v", err) } if err := self.Blockchain.VerifyTransaction(tx); err != nil { log.Panicf("Created invalid spending txn: blockchain fail, %v", err) } return tx, err }
//move into visor //DEPRECATE func (self *Visor) InjectTransaction(txn coin.Transaction, pool *Pool) (coin.Transaction, error) { if err := visor.VerifyTransactionFee(self.Visor.Blockchain, &txn); err != nil { return txn, err } if err := txn.Verify(); err != nil { return txn, fmt.Errorf("Transaction Verification Failed, %v", err) } err, _ := self.Visor.InjectTxn(txn) if err == nil { self.BroadcastTransaction(txn, pool) } return txn, err }
//Implement func injectTransaction(gateway *daemon.Gateway) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { wh.Error405(w, "") return } // get the rawtransaction v := struct { Rawtx string `json:"rawtx"` }{} if err := json.NewDecoder(r.Body).Decode(&v); err != nil { logger.Error("bad request: %v", err) wh.Error400(w, err.Error()) return } b, err := hex.DecodeString(v.Rawtx) if err != nil { logger.Error("%v", err) wh.Error400(w, err.Error()) return } txn := coin.TransactionDeserialize(b) if err := visor.VerifyTransactionFee(gateway.D.Visor.Visor.Blockchain, &txn); err != nil { wh.Error400(w, err.Error()) return } t, err := gateway.D.Visor.InjectTransaction(txn, gateway.D.Pool) if err != nil { wh.Error400(w, fmt.Sprintf("inject tx failed:%v", err)) return } wh.SendOr404(w, t.Hash().Hex()) } }