mirror of
git://holbrook.no/erc20-demurrage-token
synced 2024-11-05 10:06:45 +01:00
77 lines
2.7 KiB
Python
77 lines
2.7 KiB
Python
|
# 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'
|
|||
|
cap = sim.from_units(10 ** 12) # 1 tn token units, with 6 decimal places
|
|||
|
|
|||
|
# 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)))
|
|||
|
|
|||
|
|
|||
|
# 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))
|