Skip to content
Snippets Groups Projects
Commit 1735f291 authored by Hans Moog's avatar Hans Moog
Browse files

Feat: added mana burn foundation for spam prevention

parent 106a4a82
Branches
No related tags found
No related merge requests found
......@@ -2,6 +2,7 @@ package mana
import (
"github.com/iotaledger/goshimmer/packages/datastructure"
"github.com/iotaledger/goshimmer/packages/errors"
)
type Balance struct {
......@@ -17,12 +18,30 @@ func NewBalance(calculator *Calculator) *Balance {
}
// Returns the current mana balance.
func (balance *Balance) GetValue() uint64 {
if lastBalanceHistoryEntry, err := balance.transferHistory.GetLast(); datastructure.ErrNoSuchElement.Equals(err) {
return 0
func (balance *Balance) GetValue(now ...uint64) (result uint64, err errors.IdentifiableError) {
if lastBalanceHistoryEntry, historyErr := balance.transferHistory.GetLast(); historyErr != nil {
if !datastructure.ErrNoSuchElement.Equals(historyErr) {
err = historyErr
}
} else {
return lastBalanceHistoryEntry.(*BalanceHistoryEntry).balance
switch len(now) {
case 0:
result = lastBalanceHistoryEntry.(*BalanceHistoryEntry).balance
case 1:
lastErosionTime := lastBalanceHistoryEntry.(*BalanceHistoryEntry).transfer.spentTime
if lastErosionTime > now[0] {
panic("watt")
} else {
result, _ = balance.calculator.ErodeMana(lastBalanceHistoryEntry.(*BalanceHistoryEntry).balance, now[0]-lastErosionTime)
}
default:
err = errors.New("Test")
}
}
return
}
// Returns the timestamp of the last mana erosion.
......@@ -109,7 +128,7 @@ func (balance *Balance) applyTransfer(transfer *Transfer) {
// store results
balance.transferHistory.AddLast(&BalanceHistoryEntry{
transfer: transfer,
balance: currentBalance + gainedMana,
balance: currentBalance + gainedMana - transfer.burnedMana,
accumulatedRoundingError: roundingError,
})
}
......@@ -11,15 +11,37 @@ func TestBalance_AddTransfer(t *testing.T) {
// spend coins multiple times
balance1 := NewBalance(calculator)
balance1.AddTransfer(NewTransfer(1000, 1000, 1700))
balance1.AddTransfer(NewTransfer(1000, 700, 1000))
balance1.AddTransfer(NewTransfer(1000, 0, 700))
balance1.AddTransfer(&Transfer{
movedCoins: 1000,
burnedMana: 10,
receivedTime: 1000,
spentTime: 1700,
})
balance1.AddTransfer(&Transfer{
movedCoins: 1000,
burnedMana: 0,
receivedTime: 700,
spentTime: 1000,
})
balance1.AddTransfer(&Transfer{
movedCoins: 1000,
burnedMana: 0,
receivedTime: 0,
spentTime: 700,
})
// hold coins for the full time
balance2 := NewBalance(calculator)
balance2.AddTransfer(NewTransfer(1000, 0, 1700))
balance2.AddTransfer(&Transfer{
movedCoins: 1000,
burnedMana: 10,
receivedTime: 0,
spentTime: 1700,
})
// check result
assert.Equal(t, balance1.GetValue(), uint64(301))
assert.Equal(t, balance2.GetValue(), uint64(301))
val1, _ := balance1.GetValue()
assert.Equal(t, val1, uint64(291))
val2, _ := balance2.GetValue()
assert.Equal(t, val2, uint64(291))
}
package mana
......@@ -2,13 +2,15 @@ package mana
type Transfer struct {
movedCoins uint64
burnedMana uint64
receivedTime uint64
spentTime uint64
}
func NewTransfer(movedCoins uint64, receivedTime uint64, spentTime uint64) *Transfer {
func NewTransfer(movedCoins uint64, burnedMana uint64, receivedTime uint64, spentTime uint64) *Transfer {
return &Transfer{
movedCoins: movedCoins,
burnedMana: burnedMana,
receivedTime: receivedTime,
spentTime: spentTime,
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment