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

Feat: added formula to calculate mana of transfer

parent e4472909
Branches
No related tags found
No related merge requests found
package mana package mana
import "math" import (
"math"
)
func CoinTimeDestroyed(transferredValue uint64, parkedTime uint64) uint64 { func CoinTimeDestroyed(transferredValue uint64, parkedTime uint64) uint64 {
return transferredValue * parkedTime return transferredValue * parkedTime
} }
func ErodedGains(gainsPerInterval uint64, elapsedIntervals uint64) uint64 { func ManaOfTransfer(value uint64, receivedTime uint64, spentTime uint64) (result uint64) {
return uint64(float64(gainsPerInterval) * DECAY_FACTOR * (1 - math.Pow(DECAY_FACTOR, float64(elapsedIntervals))) / (1 - DECAY_FACTOR)) 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 { scaleFactor := 1 - DECAY_RATE
fullErosionIntervals := parkedTime / DECAY_INTERVAL
if fullErosionIntervals >= 1 { erodedGainsOfFirstInterval := uint64(float64(gainsInFirstInterval) * math.Pow(scaleFactor, float64(erosionCount)))
gainsPerInterval := CoinTimeDestroyed(value, DECAY_INTERVAL)
return ErodedGains(gainsPerInterval, fullErosionIntervals) + CoinTimeDestroyed(value, (parkedTime-fullErosionIntervals*DECAY_INTERVAL)) var erodedGainsOfConsecutiveIntervals uint64
} else { if erosionCount >= 1 {
return CoinTimeDestroyed(value, parkedTime) erodedGainsOfConsecutiveIntervals = uint64(float64(gainsPerConsecutiveInterval) * scaleFactor * (1 - math.Pow(scaleFactor, float64(erosionCount-1))) / (1 - scaleFactor))
} }
result += erodedGainsOfFirstInterval
result += erodedGainsOfConsecutiveIntervals
result += gainsInLastInterval
return
} }
const ( const (
DECAY_INTERVAL = 100 DECAY_INTERVAL = 100
DECAY_FACTOR = 0.9 DECAY_RATE = 0.5
) )
...@@ -6,9 +6,11 @@ import ( ...@@ -6,9 +6,11 @@ import (
) )
func TestManaOfTransfer(t *testing.T) { func TestManaOfTransfer(t *testing.T) {
fmt.Println(ManaOfTransfer(50, 99)) fmt.Println(ManaOfTransfer(50, 10, 110))
fmt.Println(ManaOfTransfer(50, 100)) fmt.Println(ManaOfTransfer(50, 0, 190))
fmt.Println(ManaOfTransfer(50, 200)) fmt.Println(ManaOfTransfer(50, 0, 200))
fmt.Println(ManaOfTransfer(50, 290)) fmt.Println(ManaOfTransfer(50, 0, 290))
fmt.Println(ManaOfTransfer(50, 300)) fmt.Println(ManaOfTransfer(50, 0, 300))
fmt.Println(ManaOfTransfer(50, 0, 390))
fmt.Println(ManaOfTransfer(50, 0, 400))
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment