2021-06-06 09:34:18 +02:00
|
|
|
|
# standard imports
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
|
|
# local imports
|
|
|
|
|
from erc20_demurrage_token import DemurrageTokenSettings
|
|
|
|
|
from erc20_demurrage_token.sim import DemurrageTokenSimulation
|
|
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.WARNING)
|
|
|
|
|
logg = logging.getLogger()
|
|
|
|
|
|
|
|
|
|
decay_per_minute = 0.000050105908373373 # equals approx 2% per month
|
|
|
|
|
|
|
|
|
|
# parameters for simulation object
|
|
|
|
|
settings = DemurrageTokenSettings()
|
|
|
|
|
settings.name = 'Simulated Demurrage Token'
|
|
|
|
|
settings.symbol = 'SIM'
|
|
|
|
|
settings.decimals = 6
|
|
|
|
|
settings.demurrage_level = int(decay_per_minute*(10**40))
|
|
|
|
|
settings.period_minutes = 10800 # 1 week in minutes
|
|
|
|
|
chain = 'evm:foochain:42'
|
2021-06-06 10:09:26 +02:00
|
|
|
|
cap = (10 ** 6) * (10 ** 12)
|
2021-06-06 09:34:18 +02:00
|
|
|
|
|
|
|
|
|
# instantiate simulation
|
|
|
|
|
sim = DemurrageTokenSimulation(chain, settings, redistribute=True, cap=cap, actors=10)
|
|
|
|
|
|
|
|
|
|
# name the usual suspects
|
|
|
|
|
alice = sim.actors[0]
|
|
|
|
|
bob = sim.actors[1]
|
|
|
|
|
carol = sim.actors[2]
|
|
|
|
|
|
|
|
|
|
# mint and transfer (every single action advances one block, and one second in time)
|
|
|
|
|
sim.mint(alice, sim.from_units(100)) # 10000000 tokens
|
|
|
|
|
sim.mint(bob, sim.from_units(100))
|
|
|
|
|
sim.transfer(alice, carol, sim.from_units(50))
|
|
|
|
|
|
|
|
|
|
# check that balances have been updated
|
|
|
|
|
assert sim.balance(alice) == sim.from_units(50)
|
|
|
|
|
assert sim.balance(bob) == sim.from_units(100)
|
|
|
|
|
assert sim.balance(carol) == sim.from_units(50)
|
|
|
|
|
|
|
|
|
|
# advance to next redistribution period
|
|
|
|
|
sim.next()
|
|
|
|
|
|
|
|
|
|
# inspect balances
|
|
|
|
|
print('alice balance: demurraged {:>9d} base {:>9d}'.format(sim.balance(alice), sim.balance(alice, base=True)))
|
|
|
|
|
print('bob balance: demurraged {:>9d} base {:>9d}'.format(sim.balance(bob), sim.balance(bob, base=True)))
|
|
|
|
|
print('carol balance: demurraged {:>9d} base {:>9d}'.format(sim.balance(carol), sim.balance(carol, base=True)))
|
2021-06-06 11:52:36 +02:00
|
|
|
|
print('sink balance: demurraged {:>9d} base {:>9d}'.format(sim.balance(sim.sink_address), sim.balance(sim.sink_address, base=True)))
|
2021-06-06 09:34:18 +02:00
|
|
|
|
|
|
|
|
|
# get times
|
|
|
|
|
minutes = sim.get_minutes()
|
|
|
|
|
start = sim.get_now()
|
|
|
|
|
timestamp = sim.get_start()
|
|
|
|
|
period = sim.get_period()
|
|
|
|
|
print('start {} now {} period {} minutes passed {}'.format(start, timestamp, period, minutes))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
contract_demurrage = 1 - sim.get_demurrage_modifier() # demurrage in percent (float)
|
|
|
|
|
frontend_demurrage = ((1 - decay_per_minute) ** minutes / 100) # corresponding demurrage modifier (float)
|
|
|
|
|
demurrage_delta = contract_demurrage - frontend_demurrage # difference between demurrage in contract and demurrage calculated in frontend
|
|
|
|
|
|
|
|
|
|
alice_checksum = 50000000 - (50000000 * frontend_demurrage) + (200000000 * frontend_demurrage) # alice's balance calculated with frontend demurrage
|
|
|
|
|
print("""alice frontend balance {}
|
|
|
|
|
alice contract balance {}
|
|
|
|
|
frontend demurrage {}
|
|
|
|
|
contract demurrage {}
|
|
|
|
|
demurrage delta {}""".format(
|
|
|
|
|
alice_checksum,
|
|
|
|
|
sim.balance(alice),
|
|
|
|
|
frontend_demurrage,
|
|
|
|
|
contract_demurrage,
|
|
|
|
|
demurrage_delta),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
balance_sum = sim.balance(alice) + sim.balance(bob) + sim.balance(carol)
|
|
|
|
|
print('sum of contract demurraged balances {}'.format(balance_sum))
|