From d24a9065846150ffc25322aacd894df5994164b2 Mon Sep 17 00:00:00 2001 From: Hans Moog <hm@mkjc.net> Date: Mon, 29 Jul 2019 02:39:49 +0200 Subject: [PATCH] Feat: added formula to calculate mana of transfer --- packages/mana/mana.go | 35 +++++++++++++++++++++++------------ packages/mana/mana_test.go | 12 +++++++----- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/packages/mana/mana.go b/packages/mana/mana.go index a2706c74..d8f6b10a 100644 --- a/packages/mana/mana.go +++ b/packages/mana/mana.go @@ -1,28 +1,39 @@ package mana -import "math" +import ( + "math" +) func CoinTimeDestroyed(transferredValue uint64, parkedTime uint64) uint64 { return transferredValue * parkedTime } -func ErodedGains(gainsPerInterval uint64, elapsedIntervals uint64) uint64 { - return uint64(float64(gainsPerInterval) * DECAY_FACTOR * (1 - math.Pow(DECAY_FACTOR, float64(elapsedIntervals))) / (1 - DECAY_FACTOR)) -} +func ManaOfTransfer(value uint64, receivedTime uint64, spentTime uint64) (result uint64) { + firstIntervalDuration := DECAY_INTERVAL - receivedTime%DECAY_INTERVAL + lastIntervalDuration := spentTime % DECAY_INTERVAL + erosionCount := (spentTime - receivedTime) / DECAY_INTERVAL + + gainsInFirstInterval := CoinTimeDestroyed(value, firstIntervalDuration) + gainsInLastInterval := CoinTimeDestroyed(value, lastIntervalDuration) + gainsPerConsecutiveInterval := CoinTimeDestroyed(value, DECAY_INTERVAL) -func ManaOfTransfer(value uint64, parkedTime uint64) uint64 { - fullErosionIntervals := parkedTime / DECAY_INTERVAL + scaleFactor := 1 - DECAY_RATE - if fullErosionIntervals >= 1 { - gainsPerInterval := CoinTimeDestroyed(value, DECAY_INTERVAL) + erodedGainsOfFirstInterval := uint64(float64(gainsInFirstInterval) * math.Pow(scaleFactor, float64(erosionCount))) - return ErodedGains(gainsPerInterval, fullErosionIntervals) + CoinTimeDestroyed(value, (parkedTime-fullErosionIntervals*DECAY_INTERVAL)) - } else { - return CoinTimeDestroyed(value, parkedTime) + var erodedGainsOfConsecutiveIntervals uint64 + if erosionCount >= 1 { + erodedGainsOfConsecutiveIntervals = uint64(float64(gainsPerConsecutiveInterval) * scaleFactor * (1 - math.Pow(scaleFactor, float64(erosionCount-1))) / (1 - scaleFactor)) } + + result += erodedGainsOfFirstInterval + result += erodedGainsOfConsecutiveIntervals + result += gainsInLastInterval + + return } const ( DECAY_INTERVAL = 100 - DECAY_FACTOR = 0.9 + DECAY_RATE = 0.5 ) diff --git a/packages/mana/mana_test.go b/packages/mana/mana_test.go index 018bbea7..5e1eee80 100644 --- a/packages/mana/mana_test.go +++ b/packages/mana/mana_test.go @@ -6,9 +6,11 @@ import ( ) func TestManaOfTransfer(t *testing.T) { - fmt.Println(ManaOfTransfer(50, 99)) - fmt.Println(ManaOfTransfer(50, 100)) - fmt.Println(ManaOfTransfer(50, 200)) - fmt.Println(ManaOfTransfer(50, 290)) - fmt.Println(ManaOfTransfer(50, 300)) + fmt.Println(ManaOfTransfer(50, 10, 110)) + fmt.Println(ManaOfTransfer(50, 0, 190)) + fmt.Println(ManaOfTransfer(50, 0, 200)) + fmt.Println(ManaOfTransfer(50, 0, 290)) + fmt.Println(ManaOfTransfer(50, 0, 300)) + fmt.Println(ManaOfTransfer(50, 0, 390)) + fmt.Println(ManaOfTransfer(50, 0, 400)) } -- GitLab