diff --git a/packages/mana/mana.go b/packages/mana/mana.go
index a2706c743d5a9459f64929d90ff0f8544d194b93..d8f6b10a7ca4a9094cda378176772d17a2a0baed 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 018bbea735b6adcb78e204ce34117ce7f9a63adf..5e1eee80eb502b35851df8336e355f40055b5452 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))
 }