package state import ( "ripple/bug" "ripple/types" ) func (p *Payment) GetTaxRate() float32 { if p.Tax == 0 { return 0 } return float32(p.Tax)/float32(p.Amount+p.Tax) } func (a *Account) IncreaseBalance(amount uint64, taxrate float32) { if amount == 0 { return } newBalance := a.Balance + amount var weight float32 if a.Balance > 0 { weight = float32(a.Balance) / float32(newBalance) a.Width = weight*a.Width + (1 - weight)*taxrate } else { a.Width = taxrate } a.Balance = newBalance } func (s *Storage) MustFinalizeIncomingWithAmount(userID types.UserIdentifier, paymentID [32]byte, amount uint64, taxrate float32) { account := s.MustGetAccount(userID) if _, ok := account.Pending[paymentID]; !ok { panic(bug.BugStateViolated) } account.IncreaseBalance(amount, taxrate) delete(account.Pending, paymentID) s.Accounts[userID] = account }