2025-04-04 14:20:12 +04:00

140 lines
4.0 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 116,
"id": "eca38ae3-3df1-40f9-9a4b-ddc539559aba",
"metadata": {},
"outputs": [],
"source": [
"from dataclasses import dataclass\n",
"\n",
"@dataclass\n",
"class ServiceNetwork:\n",
" total_nmo_stake: int = 0\n",
" total_lp_supply: int = 0\n",
" \n",
" def stake(self, nmo):\n",
" if self.total_nmo_stake == 0:\n",
" # this is the only staker in the network\n",
" self.total_nmo_stake = nmo\n",
" self.total_lp_supply = 1.0\n",
" return self.total_lp_supply\n",
" \n",
" lp_tokens = nmo / self.total_nmo_stake * self.total_lp_supply\n",
" self.total_nmo_stake += nmo\n",
" self.total_lp_supply += lp_tokens\n",
" return lp_tokens\n",
"\n",
" def unstake(self, lp_tokens):\n",
" nmo = self.query_stake(lp_tokens)\n",
" self.total_nmo_stake -= nmo\n",
" self.total_lp_supply -= lp_tokens\n",
" return nmo\n",
"\n",
" def query_stake(self, lp_tokens):\n",
" nmo = lp_tokens / self.total_lp_supply * self.total_nmo_stake \n",
" return nmo\n",
" \n",
" def reward(self, r_nmo):\n",
" self.total_nmo_stake += r_nmo\n",
"\n",
"def print_lp_positions(sn, lpers):\n",
" print(f\"{\"actor\":^7}|{\"lp\":^5}|{\"nmo\":^7}\")\n",
" print(\"-------+-----+-------\")\n",
" for actor, lp in lpers.items():\n",
" print(f\"{actor:7}|{lp:5.2f}|{sn.query_stake(lp):7.2f}\")\n",
"\n",
" print(\"-------+-----+-------\")\n",
" print(\"{actor:7}|{lp:5.2f}|{nmo:7.2f}\".format(actor=\"total\", lp=sum(lpers.values()), nmo=sum(sn.query_stake(lp) for lp in lpers.values())))"
]
},
{
"cell_type": "code",
"execution_count": 119,
"id": "0b58cd02-3427-4388-992b-8347cb2a601a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" actor | lp | nmo \n",
"-------+-----+-------\n",
"alice | 1.00| 10.00\n",
"bob | 1.00| 10.00\n",
"charlie| 3.00| 30.00\n",
"-------+-----+-------\n",
"total | 5.00| 50.00\n",
"\n",
"network is rewarded by 5 NMO\n",
"\n",
" actor | lp | nmo \n",
"-------+-----+-------\n",
"alice | 1.00| 11.00\n",
"bob | 1.00| 11.00\n",
"charlie| 3.00| 33.00\n",
"-------+-----+-------\n",
"total | 5.00| 55.00\n",
"\n",
"new stakers after network rewards get fewer LP tokens\n",
"\n",
" actor | lp | nmo \n",
"-------+-----+-------\n",
"alice | 1.00| 11.00\n",
"bob | 1.00| 11.00\n",
"charlie| 3.00| 33.00\n",
"dan | 0.91| 10.00\n",
"-------+-----+-------\n",
"total | 5.91| 65.00\n"
]
}
],
"source": [
"sn = ServiceNetwork()\n",
"\n",
"stakers = {\"alice\": 10, \"bob\": 10, \"charlie\": 30}\n",
"\n",
"lpers = {actor: sn.stake(nmo) for actor, nmo in stakers.items()}\n",
"\n",
"print_lp_positions(sn, lpers)\n",
"\n",
"print(\"\")\n",
"print(\"network is rewarded by 5 NMO\")\n",
"sn.reward(5)\n",
"print(\"\")\n",
"\n",
"print_lp_positions(sn, lpers)\n",
"\n",
"print(\"\")\n",
"print(\"new stakers after network rewards get fewer LP tokens\")\n",
"print(\"\")\n",
"stakers[\"dan\"] = 10\n",
"lpers[\"dan\"] = sn.stake(stakers[\"dan\"])\n",
"print_lp_positions(sn, lpers)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}