func FactoidAddOutput(trans fct.ITransaction, key string, address fct.IAddress, amount uint64) error { ok := Utility.IsValidKey(key) if !ok { return fmt.Errorf("Invalid name for transaction") } // First look if this is really an update for _, output := range trans.GetOutputs() { if output.GetAddress().IsSameAs(address) { output.SetAmount(amount) return nil } } // Add our new Output err := factoidState.GetWallet().AddOutput(trans, address, uint64(amount)) if err != nil { return fmt.Errorf("Failed to add output") } // Update our map with our new transaction to the same key. Otherwise, all // of our work will go away! factoidState.GetDB().PutRaw([]byte(fct.DB_BUILD_TRANS), []byte(key), trans) return nil }
// Assumes validation has already been done. func (fs *FactoidState) UpdateTransaction(trans fct.ITransaction) error { for _, input := range trans.GetInputs() { err := fs.UpdateBalance(input.GetAddress(), -int64(input.GetAmount())) if err != nil { return err } } for _, output := range trans.GetOutputs() { err := fs.UpdateBalance(output.GetAddress(), int64(output.GetAmount())) if err != nil { return err } } for _, ecoutput := range trans.GetECOutputs() { err := fs.UpdateECBalance(ecoutput.GetAddress(), int64(ecoutput.GetAmount())) if err != nil { return err } } fs.numTransactions++ cp.CP.AddUpdate( "transprocessed", // tag "status", // Category fmt.Sprintf("Factoid Transactions Processed: %d", fs.numTransactions), // Title "", // Message 0) // When to expire the message; 0 is never return nil }
func filtertransaction(trans fct.ITransaction, addresses [][]byte) bool { if addresses == nil || len(addresses) == 0 { return true } if len(trans.GetInputs()) == 0 && len(trans.GetOutputs()) == 0 { return false } if len(addresses) == 1 && bytes.Equal(addresses[0], trans.GetSigHash().Bytes()) { return true } Search: for _, adr := range addresses { for _, in := range trans.GetInputs() { if bytes.Equal(adr, in.GetAddress().Bytes()) { continue Search } } for _, out := range trans.GetOutputs() { if bytes.Equal(adr, out.GetAddress().Bytes()) { continue Search } } for _, ec := range trans.GetECOutputs() { if bytes.Equal(adr, ec.GetAddress().Bytes()) { continue Search } } return false } return true }
func PrtTrans(t fct.ITransaction) { fmt.Println("Transaction") for _, input := range t.GetInputs() { fmt.Println("in ", input.GetAddress(), input.GetAmount(), fs.GetBalance(input.GetAddress())) } for _, output := range t.GetOutputs() { fmt.Println("out", output.GetAddress(), output.GetAmount(), fs.GetBalance(output.GetAddress())) } for _, ecoutput := range t.GetECOutputs() { fmt.Println("ec ", ecoutput.GetAddress(), ecoutput.GetAmount(), fs.GetECBalance(ecoutput.GetAddress())) } }
func FactoidSubFee(trans fct.ITransaction, key string, address fct.IAddress, name string) (uint64, error) { { ins, err := trans.TotalInputs() if err != nil { return 0, err } outs, err := trans.TotalOutputs() if err != nil { return 0, err } ecs, err := trans.TotalECs() if err != nil { return 0, err } if ins != outs+ecs { return 0, fmt.Errorf("Inputs and outputs don't add up") } } ok := Utility.IsValidKey(key) if !ok { return 0, fmt.Errorf("Invalid name for transaction") } fee, err := GetFee() if err != nil { return 0, err } transfee, err := trans.CalculateFee(uint64(fee)) if err != nil { return 0, err } adr, err := factoidState.GetWallet().GetAddressHash(address) if err != nil { return 0, err } for _, output := range trans.GetOutputs() { if output.GetAddress().IsSameAs(adr) { output.SetAmount(output.GetAmount() - transfee) return transfee, nil } } return 0, fmt.Errorf("%s is not an output to the transaction.", name) }