Skip to content

Instantly share code, notes, and snippets.

@rafaelugolini
Created May 4, 2023 11:03
Show Gist options
  • Save rafaelugolini/1cb0242749c7062f7069d970b0d80ed4 to your computer and use it in GitHub Desktop.
Save rafaelugolini/1cb0242749c7062f7069d970b0d80ed4 to your computer and use it in GitHub Desktop.
origin apy calculation
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [],
"source": [
"from __future__ import annotations\n",
"\n",
"import datetime as dt\n",
"from decimal import Decimal\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"from ctc import evm, rpc, spec"
]
},
{
"cell_type": "code",
"execution_count": 134,
"metadata": {},
"outputs": [],
"source": [
"# Addresses\n",
"OETH = \"0x856c4efb76c1d1ae02e20ceb03a2a6a08b0b8dc3\".lower()\n",
"OUSD = \"0x2a8e1e676ec238d8a992307b495b45b3feaa5e86\".lower()\n",
"\n",
"# block\n",
"block_number = 16430217 # 2023-01-18\n",
"ousdv2_start_block = 11596940 # OUSD v2 launch block\n",
"\n",
"\n",
"# ABI\n",
"evt_total_supply_updated_abi: spec.FunctionABI = {\n",
" \"anonymous\": False,\n",
" \"inputs\": [\n",
" {\n",
" \"indexed\": False,\n",
" \"internalType\": \"uint256\",\n",
" \"name\": \"totalSupply\",\n",
" \"type\": \"uint256\",\n",
" },\n",
" {\n",
" \"indexed\": False,\n",
" \"internalType\": \"uint256\",\n",
" \"name\": \"rebasingCredits\",\n",
" \"type\": \"uint256\",\n",
" },\n",
" {\n",
" \"indexed\": False,\n",
" \"internalType\": \"uint256\",\n",
" \"name\": \"rebasingCreditsPerToken\",\n",
" \"type\": \"uint256\",\n",
" },\n",
" ],\n",
" \"name\": \"TotalSupplyUpdatedHighres\",\n",
" \"type\": \"event\",\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 135,
"metadata": {},
"outputs": [],
"source": [
"# utils\n",
"\n",
"def to_date(timestamp: int) -> str:\n",
" dtt = dt.datetime.fromtimestamp(timestamp, tz=dt.timezone.utc)\n",
" return dtt.date()\n",
" # return dtt.strftime(\"%Y-%m-%d\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ts_ousd: pd.DataFrame = (\n",
" await evm.async_get_events(\n",
" contract_address=OUSD,\n",
" event_abi=evt_total_supply_updated_abi,\n",
" start_block=block_number,\n",
" include_timestamps=True,\n",
" )\n",
").reset_index()\n",
"\n",
"ts_oeth: pd.DataFrame = (\n",
" await evm.async_get_events(\n",
" contract_address=OETH,\n",
" event_abi=evt_total_supply_updated_abi,\n",
" start_block=block_number,\n",
" include_timestamps=True,\n",
" )\n",
").reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {},
"outputs": [],
"source": [
"# date\n",
"\n",
"def get_apy(total_supply_df: pd.DataFrame):\n",
" total_supply_df[\"date\"] = total_supply_df[\"timestamp\"].apply(to_date)\n",
" total_supply_df[\"prev_date\"] = total_supply_df[\"date\"].shift(1)\n",
" total_supply_df[\"days\"] = total_supply_df[\"date\"] - total_supply_df[\"prev_date\"]\n",
" total_supply_df[\"days\"] = total_supply_df[\"days\"].apply(lambda x: Decimal(x.days))\n",
"\n",
" # cast\n",
" total_supply_df[\"arg__rebasingCreditsPerToken\"] = total_supply_df[\"arg__rebasingCreditsPerToken\"].apply(\n",
" Decimal\n",
" )\n",
"\n",
" # aggregate and get max\n",
" df = total_supply_df.groupby(\"date\").agg(\n",
" {\n",
" \"arg__rebasingCreditsPerToken\": \"max\",\n",
" \"days\": \"max\",\n",
" }\n",
" ).reset_index()\n",
"\n",
" df[\"rebasingCreditsPerTokenRatio\"] = (\n",
" df[\"arg__rebasingCreditsPerToken\"].shift(1).fillna(0)\n",
" )\n",
" df[\"rebasingCreditsPerTokenRatio\"] = (\n",
" df[\"rebasingCreditsPerTokenRatio\"] / df[\"arg__rebasingCreditsPerToken\"]\n",
" )\n",
"\n",
" # apr\n",
" df[\"apr\"] = (df[\"rebasingCreditsPerTokenRatio\"] - Decimal(1)) * Decimal(100) * Decimal(365.25) / df[\"days\"]\n",
" # apy\n",
" df[\"apy\"] = ((1 + df[\"apr\"] / (Decimal(365.25) / df[\"days\"]) / Decimal(100)) ** (Decimal(365.25) / df[\"days\"]) - Decimal(1)) * Decimal(100)\n",
"\n",
" return df\n",
"\n",
"ousd_apy = get_apy(ts_ousd)\n",
"oeth_apy = get_apy(ts_oeth)"
]
},
{
"cell_type": "code",
"execution_count": 138,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>arg__rebasingCreditsPerToken</th>\n",
" <th>days</th>\n",
" <th>rebasingCreditsPerTokenRatio</th>\n",
" <th>apr</th>\n",
" <th>apy</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>97</th>\n",
" <td>2023-04-25</td>\n",
" <td>759786764003557820478489277</td>\n",
" <td>1</td>\n",
" <td>1.000158241529976407206176331</td>\n",
" <td>5.779771882388273205590489775</td>\n",
" <td>5.949581241961028631474097700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>98</th>\n",
" <td>2023-04-26</td>\n",
" <td>759675339452849020435504284</td>\n",
" <td>1</td>\n",
" <td>1.000146673907815742466147353</td>\n",
" <td>5.357264482969993576032068325</td>\n",
" <td>5.502948706200521514990940400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>2023-04-27</td>\n",
" <td>759566716059680401000344939</td>\n",
" <td>1</td>\n",
" <td>1.000143007047138812118829369</td>\n",
" <td>5.223332396745112640242702725</td>\n",
" <td>5.361761424240679806970012700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>100</th>\n",
" <td>2023-04-28</td>\n",
" <td>759403129314870600886509476</td>\n",
" <td>1</td>\n",
" <td>1.000215414894270171352739725</td>\n",
" <td>7.868029013218008658818455625</td>\n",
" <td>8.184921916910229859350741600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>101</th>\n",
" <td>2023-04-29</td>\n",
" <td>759254268836775670753972600</td>\n",
" <td>1</td>\n",
" <td>1.000196061430544201692237663</td>\n",
" <td>7.161143750626966808980641075</td>\n",
" <td>7.423031415198646086029046400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>102</th>\n",
" <td>2023-04-30</td>\n",
" <td>759122327766040010520396224</td>\n",
" <td>1</td>\n",
" <td>1.000173807390337126546475560</td>\n",
" <td>6.348314932063547110019829000</td>\n",
" <td>6.553565274112792922258263300</td>\n",
" </tr>\n",
" <tr>\n",
" <th>103</th>\n",
" <td>2023-05-01</td>\n",
" <td>758996071784674431212304177</td>\n",
" <td>1</td>\n",
" <td>1.000166346027415801779091326</td>\n",
" <td>6.075788651362159981310682150</td>\n",
" <td>6.263623381426941384131579100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>104</th>\n",
" <td>2023-05-02</td>\n",
" <td>758847081661784010130708106</td>\n",
" <td>1</td>\n",
" <td>1.000196337478908333677131402</td>\n",
" <td>7.171226417126887557224458050</td>\n",
" <td>7.433860942396397392021667100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>105</th>\n",
" <td>2023-05-03</td>\n",
" <td>758704170428951763662508985</td>\n",
" <td>1</td>\n",
" <td>1.000188362260815632717841524</td>\n",
" <td>6.879931576290985019161664100</td>\n",
" <td>7.121427017616739367599614900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>106</th>\n",
" <td>2023-05-04</td>\n",
" <td>758571168699717689307069357</td>\n",
" <td>1</td>\n",
" <td>1.000175331906513208684135491</td>\n",
" <td>6.403997885394947188048808775</td>\n",
" <td>6.612903606600552733315787700</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date arg__rebasingCreditsPerToken days \\\n",
"97 2023-04-25 759786764003557820478489277 1 \n",
"98 2023-04-26 759675339452849020435504284 1 \n",
"99 2023-04-27 759566716059680401000344939 1 \n",
"100 2023-04-28 759403129314870600886509476 1 \n",
"101 2023-04-29 759254268836775670753972600 1 \n",
"102 2023-04-30 759122327766040010520396224 1 \n",
"103 2023-05-01 758996071784674431212304177 1 \n",
"104 2023-05-02 758847081661784010130708106 1 \n",
"105 2023-05-03 758704170428951763662508985 1 \n",
"106 2023-05-04 758571168699717689307069357 1 \n",
"\n",
" rebasingCreditsPerTokenRatio apr \\\n",
"97 1.000158241529976407206176331 5.779771882388273205590489775 \n",
"98 1.000146673907815742466147353 5.357264482969993576032068325 \n",
"99 1.000143007047138812118829369 5.223332396745112640242702725 \n",
"100 1.000215414894270171352739725 7.868029013218008658818455625 \n",
"101 1.000196061430544201692237663 7.161143750626966808980641075 \n",
"102 1.000173807390337126546475560 6.348314932063547110019829000 \n",
"103 1.000166346027415801779091326 6.075788651362159981310682150 \n",
"104 1.000196337478908333677131402 7.171226417126887557224458050 \n",
"105 1.000188362260815632717841524 6.879931576290985019161664100 \n",
"106 1.000175331906513208684135491 6.403997885394947188048808775 \n",
"\n",
" apy \n",
"97 5.949581241961028631474097700 \n",
"98 5.502948706200521514990940400 \n",
"99 5.361761424240679806970012700 \n",
"100 8.184921916910229859350741600 \n",
"101 7.423031415198646086029046400 \n",
"102 6.553565274112792922258263300 \n",
"103 6.263623381426941384131579100 \n",
"104 7.433860942396397392021667100 \n",
"105 7.121427017616739367599614900 \n",
"106 6.612903606600552733315787700 "
]
},
"execution_count": 138,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ousd_apy.tail(10)"
]
},
{
"cell_type": "code",
"execution_count": 139,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>arg__rebasingCreditsPerToken</th>\n",
" <th>days</th>\n",
" <th>rebasingCreditsPerTokenRatio</th>\n",
" <th>apr</th>\n",
" <th>apy</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2023-04-26</td>\n",
" <td>999147833631217615079819987</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2023-04-28</td>\n",
" <td>998266025936088046385350165</td>\n",
" <td>2</td>\n",
" <td>1.000883339382708817779724281</td>\n",
" <td>16.13198547671978470221468176</td>\n",
" <td>17.49770865619387581381386180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2023-04-29</td>\n",
" <td>981904910365195432582980249</td>\n",
" <td>1</td>\n",
" <td>1.016662627305537659869279105</td>\n",
" <td>608.6024623347630267254193101</td>\n",
" <td>41716.51058660586787849046226</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2023-04-30</td>\n",
" <td>980772607295983824680785657</td>\n",
" <td>1</td>\n",
" <td>1.001154501115537267698606959</td>\n",
" <td>42.16815324499870269161917748</td>\n",
" <td>52.41521736216318807727357890</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2023-05-02</td>\n",
" <td>980094110939187871679241896</td>\n",
" <td>2</td>\n",
" <td>1.000692276740797651648718685</td>\n",
" <td>12.64270397881711323472498481</td>\n",
" <td>13.47170205254778990713744090</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2023-05-03</td>\n",
" <td>979773547215571404918160616</td>\n",
" <td>1</td>\n",
" <td>1.000327181443638155090558952</td>\n",
" <td>11.95030222888361468266572180</td>\n",
" <td>12.69146238650552821083533100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>2023-05-04</td>\n",
" <td>979469030170281006551813101</td>\n",
" <td>1</td>\n",
" <td>1.000310900126405689396719433</td>\n",
" <td>11.35562711696780521517729032</td>\n",
" <td>12.02351543369132500705441010</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date arg__rebasingCreditsPerToken days \\\n",
"0 2023-04-26 999147833631217615079819987 NaN \n",
"1 2023-04-28 998266025936088046385350165 2 \n",
"2 2023-04-29 981904910365195432582980249 1 \n",
"3 2023-04-30 980772607295983824680785657 1 \n",
"4 2023-05-02 980094110939187871679241896 2 \n",
"5 2023-05-03 979773547215571404918160616 1 \n",
"6 2023-05-04 979469030170281006551813101 1 \n",
"\n",
" rebasingCreditsPerTokenRatio apr \\\n",
"0 0 NaN \n",
"1 1.000883339382708817779724281 16.13198547671978470221468176 \n",
"2 1.016662627305537659869279105 608.6024623347630267254193101 \n",
"3 1.001154501115537267698606959 42.16815324499870269161917748 \n",
"4 1.000692276740797651648718685 12.64270397881711323472498481 \n",
"5 1.000327181443638155090558952 11.95030222888361468266572180 \n",
"6 1.000310900126405689396719433 11.35562711696780521517729032 \n",
"\n",
" apy \n",
"0 NaN \n",
"1 17.49770865619387581381386180 \n",
"2 41716.51058660586787849046226 \n",
"3 52.41521736216318807727357890 \n",
"4 13.47170205254778990713744090 \n",
"5 12.69146238650552821083533100 \n",
"6 12.02351543369132500705441010 "
]
},
"execution_count": 139,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"oeth_apy.tail(10)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "tgraph",
"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.10.8"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment