rosacastillo commited on
Commit
48ce3b8
·
1 Parent(s): 06ca88f

Adding new staking tab for trades

Browse files
app.py CHANGED
@@ -12,6 +12,7 @@ from tabs.trades import (
12
  integrated_plot_trades_per_market_by_week,
13
  integrated_plot_winning_trades_per_market_by_week,
14
  )
 
15
 
16
  from tabs.metrics import (
17
  trade_metric_choices,
@@ -173,6 +174,7 @@ tools_df, trades_df, tools_accuracy_info, invalid_trades = prepare_data()
173
 
174
 
175
  demo = gr.Blocks()
 
176
  # preparing data for the errors
177
  error_by_markets = get_error_data_by_market(tools_df=tools_df, inc_tools=INC_TOOLS)
178
  error_overall_by_markets = get_error_data_overall_by_market(error_df=error_by_markets)
@@ -242,7 +244,25 @@ with demo:
242
  trade_details_plot
243
  with gr.Column(scale=1):
244
  trade_details_text
245
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  with gr.TabItem("🚀 Tool Winning Dashboard"):
247
  with gr.Row():
248
  gr.Markdown("# All tools winning performance")
 
12
  integrated_plot_trades_per_market_by_week,
13
  integrated_plot_winning_trades_per_market_by_week,
14
  )
15
+ from tabs.staking import plot_staking_trades_per_market_by_week
16
 
17
  from tabs.metrics import (
18
  trade_metric_choices,
 
174
 
175
 
176
  demo = gr.Blocks()
177
+
178
  # preparing data for the errors
179
  error_by_markets = get_error_data_by_market(tools_df=tools_df, inc_tools=INC_TOOLS)
180
  error_overall_by_markets = get_error_data_overall_by_market(error_df=error_by_markets)
 
244
  trade_details_plot
245
  with gr.Column(scale=1):
246
  trade_details_text
247
+ with gr.TabItem("🔒 Staking traders"):
248
+ with gr.Row():
249
+ gr.Markdown("# Trades done at the pearl markets")
250
+ with gr.Row():
251
+ staking_trades_by_week = plot_staking_trades_per_market_by_week(
252
+ trades_df=trades_df, market_creator="pearl"
253
+ )
254
+ with gr.Row():
255
+ gr.Markdown("# Trades done at the quickstart markets")
256
+ with gr.Row():
257
+ staking_trades_by_week = plot_staking_trades_per_market_by_week(
258
+ trades_df=trades_df, market_creator="quickstart"
259
+ )
260
+ with gr.Row():
261
+ gr.Markdown("# Trades done at the all markets")
262
+ with gr.Row():
263
+ staking_trades_by_week = plot_staking_trades_per_market_by_week(
264
+ trades_df=trades_df, market_creator="all"
265
+ )
266
  with gr.TabItem("🚀 Tool Winning Dashboard"):
267
  with gr.Row():
268
  gr.Markdown("# All tools winning performance")
data/all_trades_profitability.parquet CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:a111f63a2c14218a53c3e807716e8430385b97044058fa61c57c412a3cc2a49a
3
- size 410473
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fa8f1d9bc8b3f1f017dfc7df01367beafa4de12af9d40030317784d06f9e3dde
3
+ size 411164
data/outliers.parquet CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:9a8d36a738da0bbd73b08887b103118087c0b6a347045be7fca3f3ce60a276cc
3
- size 17324
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7da1c4dba61686a580c61a870ba9a38c83ff5b25201cfe1f7ddf5a214438c322
3
+ size 17851
data/service_map.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6d0859b181fccfb5cf28a19af36f099f3f828d8fcc72c95a5a6a3bff94044d87
3
+ size 72340
notebooks/roi_analysis.ipynb CHANGED
@@ -19,7 +19,7 @@
19
  "metadata": {},
20
  "outputs": [],
21
  "source": [
22
- "tools = pd.read_parquet('../data/tools.parquet')\n",
23
  "fpmms = pd.read_parquet('../data/fpmms.parquet')\n",
24
  "summary_traders = pd.read_parquet('../data/summary_profitability.parquet')\n",
25
  "all_trades = pd.read_parquet('../data/all_trades_profitability.parquet')"
@@ -51,7 +51,7 @@
51
  },
52
  {
53
  "cell_type": "code",
54
- "execution_count": 4,
55
  "metadata": {},
56
  "outputs": [
57
  {
@@ -59,31 +59,32 @@
59
  "output_type": "stream",
60
  "text": [
61
  "<class 'pandas.core.frame.DataFrame'>\n",
62
- "RangeIndex: 24053 entries, 0 to 24052\n",
63
- "Data columns (total 19 columns):\n",
64
  " # Column Non-Null Count Dtype \n",
65
  "--- ------ -------------- ----- \n",
66
- " 0 trader_address 24053 non-null object \n",
67
- " 1 trade_id 24053 non-null object \n",
68
- " 2 creation_timestamp 24053 non-null datetime64[ns, UTC]\n",
69
- " 3 title 24053 non-null object \n",
70
- " 4 market_status 24053 non-null object \n",
71
- " 5 collateral_amount 24053 non-null float64 \n",
72
- " 6 outcome_index 24053 non-null object \n",
73
- " 7 trade_fee_amount 24053 non-null float64 \n",
74
- " 8 outcomes_tokens_traded 24053 non-null float64 \n",
75
- " 9 current_answer 24053 non-null int64 \n",
76
- " 10 is_invalid 24053 non-null bool \n",
77
- " 11 winning_trade 24053 non-null bool \n",
78
- " 12 earnings 24053 non-null float64 \n",
79
- " 13 redeemed 24053 non-null bool \n",
80
- " 14 redeemed_amount 24053 non-null float64 \n",
81
- " 15 num_mech_calls 24053 non-null int64 \n",
82
- " 16 mech_fee_amount 24053 non-null float64 \n",
83
- " 17 net_earnings 24053 non-null float64 \n",
84
- " 18 roi 24053 non-null float64 \n",
85
- "dtypes: bool(3), datetime64[ns, UTC](1), float64(8), int64(2), object(5)\n",
86
- "memory usage: 3.0+ MB\n"
 
87
  ]
88
  }
89
  ],
@@ -722,7 +723,7 @@
722
  "name": "python",
723
  "nbconvert_exporter": "python",
724
  "pygments_lexer": "ipython3",
725
- "version": "3.12.3"
726
  }
727
  },
728
  "nbformat": 4,
 
19
  "metadata": {},
20
  "outputs": [],
21
  "source": [
22
+ "#tools = pd.read_parquet('../data/tools.parquet')\n",
23
  "fpmms = pd.read_parquet('../data/fpmms.parquet')\n",
24
  "summary_traders = pd.read_parquet('../data/summary_profitability.parquet')\n",
25
  "all_trades = pd.read_parquet('../data/all_trades_profitability.parquet')"
 
51
  },
52
  {
53
  "cell_type": "code",
54
+ "execution_count": 3,
55
  "metadata": {},
56
  "outputs": [
57
  {
 
59
  "output_type": "stream",
60
  "text": [
61
  "<class 'pandas.core.frame.DataFrame'>\n",
62
+ "RangeIndex: 4872 entries, 0 to 4871\n",
63
+ "Data columns (total 20 columns):\n",
64
  " # Column Non-Null Count Dtype \n",
65
  "--- ------ -------------- ----- \n",
66
+ " 0 trader_address 4872 non-null object \n",
67
+ " 1 market_creator 4872 non-null object \n",
68
+ " 2 trade_id 4872 non-null object \n",
69
+ " 3 creation_timestamp 4872 non-null datetime64[ns, UTC]\n",
70
+ " 4 title 4872 non-null object \n",
71
+ " 5 market_status 4872 non-null object \n",
72
+ " 6 collateral_amount 4872 non-null float64 \n",
73
+ " 7 outcome_index 4872 non-null object \n",
74
+ " 8 trade_fee_amount 4872 non-null float64 \n",
75
+ " 9 outcomes_tokens_traded 4872 non-null float64 \n",
76
+ " 10 current_answer 4872 non-null int64 \n",
77
+ " 11 is_invalid 4872 non-null bool \n",
78
+ " 12 winning_trade 4872 non-null bool \n",
79
+ " 13 earnings 4872 non-null float64 \n",
80
+ " 14 redeemed 4872 non-null bool \n",
81
+ " 15 redeemed_amount 4872 non-null float64 \n",
82
+ " 16 num_mech_calls 4872 non-null int64 \n",
83
+ " 17 mech_fee_amount 4872 non-null float64 \n",
84
+ " 18 net_earnings 4872 non-null float64 \n",
85
+ " 19 roi 4872 non-null float64 \n",
86
+ "dtypes: bool(3), datetime64[ns, UTC](1), float64(8), int64(2), object(6)\n",
87
+ "memory usage: 661.5+ KB\n"
88
  ]
89
  }
90
  ],
 
723
  "name": "python",
724
  "nbconvert_exporter": "python",
725
  "pygments_lexer": "ipython3",
726
+ "version": "3.12.2"
727
  }
728
  },
729
  "nbformat": 4,
notebooks/staking.ipynb ADDED
@@ -0,0 +1,812 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 9,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import json\n",
10
+ "import sys\n",
11
+ "from pathlib import Path\n",
12
+ "from typing import Any, List\n",
13
+ "import requests\n",
14
+ "from tqdm import tqdm\n",
15
+ "from web3 import Web3\n",
16
+ "import pandas as pd\n",
17
+ "import pickle\n",
18
+ "from concurrent.futures import ThreadPoolExecutor, as_completed\n",
19
+ "\n",
20
+ "NUM_WORKERS = 10\n",
21
+ "DEPRECATED_STAKING_PROGRAMS = {\n",
22
+ " \"quickstart_alpha_everest\": \"0x5add592ce0a1B5DceCebB5Dcac086Cd9F9e3eA5C\",\n",
23
+ " \"quickstart_alpha_alpine\": \"0x2Ef503950Be67a98746F484DA0bBAdA339DF3326\",\n",
24
+ " \"quickstart_alpha_coastal\": \"0x43fB32f25dce34EB76c78C7A42C8F40F84BCD237\",\n",
25
+ "}\n",
26
+ "STAKING_PROGRAMS_QS = {\n",
27
+ " \"quickstart_beta_hobbyist\": \"0x389B46c259631Acd6a69Bde8B6cEe218230bAE8C\",\n",
28
+ " \"quickstart_beta_hobbyist_2\": \"0x238EB6993b90a978ec6AAD7530d6429c949C08DA\",\n",
29
+ " \"quickstart_beta_expert\": \"0x5344B7DD311e5d3DdDd46A4f71481bD7b05AAA3e\",\n",
30
+ " \"quickstart_beta_expert_2\": \"0xb964e44c126410df341ae04B13aB10A985fE3513\",\n",
31
+ " \"quickstart_beta_expert_3\": \"0x80faD33Cadb5F53f9D29F02Db97D682E8b101618\",\n",
32
+ "}\n",
33
+ "\n",
34
+ "STAKING_PROGRAMS_PEARL = {\n",
35
+ " \"pearl_alpha\": \"0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A\",\n",
36
+ " \"pearl_beta\": \"0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d\",\n",
37
+ " \"pearl_beta_2\": \"0x1c2F82413666d2a3fD8bC337b0268e62dDF67434\",\n",
38
+ "}\n",
39
+ "SERVICE_REGISTRY_ADDRESS = \"0x9338b5153AE39BB89f50468E608eD9d764B755fD\"\n",
40
+ "\n",
41
+ "\n",
42
+ "\n",
43
+ "\n",
44
+ "def check_owner_staking_contract(owner_address: str) -> str:\n",
45
+ " staking = \"\"\n",
46
+ " owner_address = owner_address.lower()\n",
47
+ " # check quickstart staking contracts\n",
48
+ " qs_list = [x.lower() for x in STAKING_PROGRAMS_QS.values()]\n",
49
+ " if owner_address in qs_list:\n",
50
+ " return \"quickstart\"\n",
51
+ "\n",
52
+ " # check pearl staking contracts\n",
53
+ " pearl_list = [x.lower() for x in STAKING_PROGRAMS_PEARL.values()]\n",
54
+ " if owner_address in pearl_list:\n",
55
+ " return \"pearl\"\n",
56
+ "\n",
57
+ " # check legacy staking contracts\n",
58
+ " deprec_list = [x.lower() for x in DEPRECATED_STAKING_PROGRAMS.values()]\n",
59
+ " if owner_address in deprec_list:\n",
60
+ " return \"quickstart\"\n",
61
+ "\n",
62
+ " return staking\n",
63
+ "\n",
64
+ "\n",
65
+ "def get_trader_address_staking(trader_address: str) -> str:\n",
66
+ " # check if there is any service id linked with that trader address\n",
67
+ " with open(\"../data/service_map.pkl\", \"rb\") as f:\n",
68
+ " service_map = pickle.load(f)\n",
69
+ " found_key = -1\n",
70
+ " for key, value in service_map.items():\n",
71
+ " if value[\"safe_address\"].lower() == trader_address.lower():\n",
72
+ " # found a service\n",
73
+ " found_key = key\n",
74
+ " break\n",
75
+ "\n",
76
+ " if found_key == -1:\n",
77
+ " print(\"trader address not found in the service map\")\n",
78
+ " return \"\"\n",
79
+ " owner = service_map[found_key][\"owner_address\"]\n",
80
+ " return check_owner_staking_contract(owner_address=owner)\n",
81
+ "\n",
82
+ "\n",
83
+ "def label_trades_by_staking(trades_df: pd.DataFrame) -> pd.DataFrame:\n",
84
+ " all_traders = trades_df.trader_address.unique()\n",
85
+ " trades_df[\"staking\"] = \"\"\n",
86
+ " for trader in tqdm(all_traders, desc=\"Labeling traders by staking\", unit=\"trader\"):\n",
87
+ " tqdm.write(f\"checking trader {trader}\")\n",
88
+ " staking_label = get_trader_address_staking(trader)\n",
89
+ " if staking_label != \"\":\n",
90
+ " trades_df.loc[trades_df[\"trader_address\"] == trader, \"staking\"] = staking_label\n",
91
+ " tqdm.write(f\"statking label {staking_label}\")\n",
92
+ " return trades_df"
93
+ ]
94
+ },
95
+ {
96
+ "cell_type": "code",
97
+ "execution_count": 10,
98
+ "metadata": {},
99
+ "outputs": [
100
+ {
101
+ "name": "stderr",
102
+ "output_type": "stream",
103
+ "text": [
104
+ "Labeling traders by staking: 51%|█████ | 104/204 [00:00<00:00, 522.80trader/s]"
105
+ ]
106
+ },
107
+ {
108
+ "name": "stdout",
109
+ "output_type": "stream",
110
+ "text": [
111
+ "checking trader 0x022b36c50b85b8ae7addfb8a35d76c59d5814834\n",
112
+ "statking label \n",
113
+ "checking trader 0x034c4ad84f7ac6638bf19300d5bbe7d9b981e736\n",
114
+ "trader address not found in the service map\n",
115
+ "statking label \n",
116
+ "checking trader 0x09e9d42a029e8b0c2df3871709a762117a681d92\n",
117
+ "statking label \n",
118
+ "checking trader 0x0d049dcaece0ecb6fc81a460da7bcc2a4785d6e5\n",
119
+ "statking label \n",
120
+ "checking trader 0x1c1bb5398ba525c5bca07eeade45958e455de4b3\n",
121
+ "statking label quickstart\n",
122
+ "checking trader 0x246f6787c409dd5139b7029cd63b7d6aad08cc61\n",
123
+ "statking label \n",
124
+ "checking trader 0x2dd9f5678484c1f59f97ed334725858b938b4102\n",
125
+ "trader address not found in the service map\n",
126
+ "statking label \n",
127
+ "checking trader 0x3666da333dadd05083fef9ff6ddee588d26e4307\n",
128
+ "trader address not found in the service map\n",
129
+ "statking label \n",
130
+ "checking trader 0x3a461ae963acf0fedc72a07d060b8e1f44851b28\n",
131
+ "statking label \n",
132
+ "checking trader 0x49f4e3d8edc85efda9b0a36d96e406a59b13fcc2\n",
133
+ "statking label quickstart\n",
134
+ "checking trader 0x4e8b85a2b2ffa1f586441d1410f09b416d450d91\n",
135
+ "statking label \n",
136
+ "checking trader 0x559480d7892f1934ca93ab9cb9100c048057fb32\n",
137
+ "trader address not found in the service map\n",
138
+ "statking label \n",
139
+ "checking trader 0x5adc20d9d3c55ca147a280ac3f911707c6a138d0\n",
140
+ "statking label \n",
141
+ "checking trader 0x625cf416a9f525d9480cafb9b9ac83401a2b2b33\n",
142
+ "statking label \n",
143
+ "checking trader 0x6990f82b90a151aa63fca5d3afd8e9e275dba4cf\n",
144
+ "statking label \n",
145
+ "checking trader 0x70fdcdcef0d636db08a581dc510755cc53facdc2\n",
146
+ "statking label \n",
147
+ "checking trader 0x74d2b585a46279b4fa9feeae001efc972726c709\n",
148
+ "statking label \n",
149
+ "checking trader 0x77ca61cb789799bd8918036edb3ca8e6c4ca76f1\n",
150
+ "trader address not found in the service map\n",
151
+ "statking label \n",
152
+ "checking trader 0x95ecc70d9f4feb162ed9f41c4432d990c36c8f57\n",
153
+ "statking label quickstart\n",
154
+ "checking trader 0x966802275f0208ac34f3e74c67d62c46e69fe378\n",
155
+ "statking label quickstart\n",
156
+ "checking trader 0x9694c0fdb79a37d048ea19deb15e051482a690c4\n",
157
+ "statking label \n",
158
+ "checking trader 0x98973c9c66a79b6cc7ed655d830d1ad84067c5e5\n",
159
+ "statking label quickstart\n",
160
+ "checking trader 0x9d8337b10c7b820e44ae3273dab47220ea41bfc9\n",
161
+ "statking label quickstart\n",
162
+ "checking trader 0xa7314a168445a32fe43da3759d5861630f3b5d91\n",
163
+ "statking label \n",
164
+ "checking trader 0xa8efa5bb5c6ad476c9e0377dbf66cc41cb6d5bdd\n",
165
+ "trader address not found in the service map\n",
166
+ "statking label \n",
167
+ "checking trader 0xb611a9f02b318339049264c7a66ac3401281cc3c\n",
168
+ "trader address not found in the service map\n",
169
+ "statking label \n",
170
+ "checking trader 0xc4985d8b12eeef642c955c43c86b568417658839\n",
171
+ "statking label \n",
172
+ "checking trader 0xe7715def604bccfb93f34ccaf3610ed6ee9c6741\n",
173
+ "statking label \n",
174
+ "checking trader 0xe7aa88a1d044e5c987ecce55ae8d2b562a41b72d\n",
175
+ "trader address not found in the service map\n",
176
+ "statking label \n",
177
+ "checking trader 0xe84605f215126abdafb0b5a47de2d513e80aba68\n",
178
+ "statking label \n",
179
+ "checking trader 0xec97bdf61fcb901033a3b8fcbcde77a372927b61\n",
180
+ "statking label quickstart\n",
181
+ "checking trader 0xf8a323e669edabca3952e3bf7f18ade953d7e9b9\n",
182
+ "statking label \n",
183
+ "checking trader 0xfd3b85c97f0feeaf3a8f90c5022ab3ad9cce0000\n",
184
+ "trader address not found in the service map\n",
185
+ "statking label \n",
186
+ "checking trader 0x0822e82311bd2d7e381bd2c64cacd13b4c3fbe8a\n",
187
+ "statking label \n",
188
+ "checking trader 0x197a0a79d62af21c50813899b79947c7621281ad\n",
189
+ "statking label \n",
190
+ "checking trader 0x1bde46e6a3128fff5f0b94911bf6c447ad909215\n",
191
+ "statking label \n",
192
+ "checking trader 0x22335c348afa4eae4cc6d2158c1ac259aaaecdfe\n",
193
+ "statking label \n",
194
+ "checking trader 0x36c0dfb4ffae10005db68c5a755aca5d3d711627\n",
195
+ "statking label \n",
196
+ "checking trader 0x3784c7866a0d308d72719aa17e888b457d399ca7\n",
197
+ "statking label quickstart\n",
198
+ "checking trader 0x4ecc9626b80a623e7bb2545d5cc1082ace765d03\n",
199
+ "statking label \n",
200
+ "checking trader 0x593c4ca4c85f24145de87e2591b7ec5d2e01d5e9\n",
201
+ "statking label quickstart\n",
202
+ "checking trader 0x61f5c7fa710bae60ab917fad0043f8efb4f8c3be\n",
203
+ "statking label \n",
204
+ "checking trader 0x8cd3e072c8341cfe1a03dbe1d6c32b5177b06164\n",
205
+ "statking label quickstart\n",
206
+ "checking trader 0x8dd0f0f64e575a356545d9ed096122a1887e64bf\n",
207
+ "statking label quickstart\n",
208
+ "checking trader 0x902a59ffe708d36f4498c8c9df51802250c5111c\n",
209
+ "statking label \n",
210
+ "checking trader 0xa0748aa2cc9ac8e5c7a813171590b92140aee491\n",
211
+ "statking label \n",
212
+ "checking trader 0xaa6763ea75eb13de1da2f3367d452336747f6e29\n",
213
+ "statking label quickstart\n",
214
+ "checking trader 0xb2f2958c02819dbc163d526ea699ab49a34d6dfb\n",
215
+ "statking label quickstart\n",
216
+ "checking trader 0xdacbe9368b329af4244727acfe20514d64d129ac\n",
217
+ "statking label \n",
218
+ "checking trader 0xfe2c8e93ce30d1c961831d8e4d120a307aedbe72\n",
219
+ "statking label \n",
220
+ "checking trader 0x3c01b79bad670a37c8784bdf47b973b341064f10\n",
221
+ "statking label quickstart\n",
222
+ "checking trader 0xc598397ce2b8bdf93071c0446d1eedc2141f01d0\n",
223
+ "statking label quickstart\n",
224
+ "checking trader 0x05e8bbdb89c84a14d05194bbbae81caf2340db72\n",
225
+ "trader address not found in the service map\n",
226
+ "statking label \n",
227
+ "checking trader 0x06944ca496e269bdefc322e453102022ac1d24e7\n",
228
+ "statking label quickstart\n",
229
+ "checking trader 0x0917ca217a8c679845bc97dfade9fd33f323a2f9\n",
230
+ "statking label quickstart\n",
231
+ "checking trader 0x1b80f1f8fee6fa9d4081e28a6aea4745a41e80d6\n",
232
+ "statking label quickstart\n",
233
+ "checking trader 0x1d942103400c1f1657dcbffd5e08904787ea936b\n",
234
+ "statking label quickstart\n",
235
+ "checking trader 0x38d5f6c7a4d9c3f09a9210412da80a7fd2e7325b\n",
236
+ "statking label quickstart\n",
237
+ "checking trader 0x3e013a3ca156032005c239de6d84badd3f9b13a9\n",
238
+ "trader address not found in the service map\n",
239
+ "statking label \n",
240
+ "checking trader 0x50cd23744cc33df8ea0c53c8e97174b2b8ea03c1\n",
241
+ "statking label quickstart\n",
242
+ "checking trader 0x59fab0cc4dd160862a55e5cf8b37719f156111a4\n",
243
+ "statking label quickstart\n",
244
+ "checking trader 0x61766a46659b67bbda5484bba45e524ccc652ee4\n",
245
+ "statking label quickstart\n",
246
+ "checking trader 0x6f40dbf1f102d47248802a423c0cd117ac4a3781\n",
247
+ "statking label quickstart\n",
248
+ "checking trader 0x75c0366bd0cbc3db434fd117267e32f26c5ed857\n",
249
+ "statking label quickstart\n",
250
+ "checking trader 0x839eaee319420e6dc83383bbb41fce4f8b0bb9aa\n",
251
+ "statking label quickstart\n",
252
+ "checking trader 0x9257309f1b614e84a5e73016ad393c378b3094ec\n",
253
+ "statking label quickstart\n",
254
+ "checking trader 0x9373cb196a3542afa583a91db604aee92068552a\n",
255
+ "statking label quickstart\n",
256
+ "checking trader 0x96fc9f4eb6b7c228aa018b7fea9b43d77023aa5a\n",
257
+ "statking label quickstart\n",
258
+ "checking trader 0xa156f5e98383c3e2a70faef71cc420780809e130\n",
259
+ "statking label quickstart\n",
260
+ "checking trader 0xaa14414fe80e18223e3d585b222ec699a6ccccfd\n",
261
+ "statking label quickstart\n",
262
+ "checking trader 0xacb24b20805c6e475d2c17edb2a997c1ba47de79\n",
263
+ "statking label quickstart\n",
264
+ "checking trader 0xb2912a22ee91272861931b693c434d420610abfe\n",
265
+ "statking label quickstart\n",
266
+ "checking trader 0xc08300f16b755b017a50347aa72b054be5dbd34b\n",
267
+ "statking label \n",
268
+ "checking trader 0xe594853a6cca34dda096b0a21062d12febd8a2c0\n",
269
+ "statking label quickstart\n",
270
+ "checking trader 0xe94b68e26c091dbb55e6e953b15168b0e6acba1f\n",
271
+ "statking label \n",
272
+ "checking trader 0xf21c4230f137ffcee12e69786d854e62a7b4b0ae\n",
273
+ "trader address not found in the service map\n",
274
+ "statking label \n",
275
+ "checking trader 0xf5fecb12cd783920d0ea71def523848fbc3ef972\n",
276
+ "statking label quickstart\n",
277
+ "checking trader 0xf758c18402ddef2d231911c4c326aa46510788f0\n",
278
+ "trader address not found in the service map\n",
279
+ "statking label \n",
280
+ "checking trader 0x0364b1a30877ade164271213d641494bd0475645\n",
281
+ "statking label \n",
282
+ "checking trader 0x32f47d021ffc0b8b883a8aef184556f68e993aba\n",
283
+ "statking label \n",
284
+ "checking trader 0x3c529bdcaf1f7b449abce3136ca7f56dfbd68373\n",
285
+ "statking label \n",
286
+ "checking trader 0x480e5b5abd27cd754745871116e79caf90468dd4\n",
287
+ "statking label \n",
288
+ "checking trader 0x6716c1831d0f2477891f5579e5e3b05dee3f176b\n",
289
+ "trader address not found in the service map\n",
290
+ "statking label \n",
291
+ "checking trader 0x6cbd1a957cbf3a84187113f58c0c026c268c7294\n",
292
+ "statking label \n",
293
+ "checking trader 0x6f99ccc54f239a9c0e7fe501e99c16b89785b96b\n",
294
+ "statking label \n",
295
+ "checking trader 0xc918c15b87746e6351e5f0646ddcaaca11af8568\n",
296
+ "trader address not found in the service map\n",
297
+ "statking label \n",
298
+ "checking trader 0xe711f95807145121e027df264612098ddf202fd7\n",
299
+ "statking label \n",
300
+ "checking trader 0xf089874165be0377680683fd5187a058dea82683\n",
301
+ "statking label \n",
302
+ "checking trader 0x217e261e0558938a878265d61603db1787744314\n",
303
+ "statking label \n",
304
+ "checking trader 0x6d0cb5f3264b5e11d61260538f9acc4385cbd767\n",
305
+ "statking label \n",
306
+ "checking trader 0x75f58030c190bb4288f56100f0ee49b6eeb4a134\n",
307
+ "trader address not found in the service map\n",
308
+ "statking label \n",
309
+ "checking trader 0x7c3bebb1eab77e6119d61f7c064bfca2eff788ad\n",
310
+ "statking label \n",
311
+ "checking trader 0x2349580dd7bbf6e6f54269068b8ed9cd5ddb7ba4\n",
312
+ "statking label \n",
313
+ "checking trader 0x671ccc08559041185f594c8f305b8fc66c8c9dda\n",
314
+ "statking label \n",
315
+ "checking trader 0x433f6981f65e97a629eda89accde2d8a0b11b5a6\n",
316
+ "trader address not found in the service map\n",
317
+ "statking label \n",
318
+ "checking trader 0xacdc2eebddaff07bcdab82f82bcc07f731e784aa\n",
319
+ "trader address not found in the service map\n",
320
+ "statking label \n",
321
+ "checking trader 0xd243a01df42f64ddc9e2f921e22832d4c1de9dcd\n",
322
+ "statking label \n",
323
+ "checking trader 0xb2b30b71bf8166fa3a3b9744a48765d43eb93d53\n",
324
+ "statking label \n",
325
+ "checking trader 0xbb9ee65ce6646a6b1d6a2511b72343a7e3d355af\n",
326
+ "statking label \n",
327
+ "checking trader 0x6200bf2a60f0174a3def2a82617153cbe6641f52\n",
328
+ "statking label \n",
329
+ "checking trader 0x7d3a0da18e14ccb63375cdc250e8a8399997816f\n",
330
+ "trader address not found in the service map\n",
331
+ "statking label \n",
332
+ "checking trader 0xdd9de3412e91d958b0ccfd447d671a4ac1fb7866\n",
333
+ "statking label \n",
334
+ "checking trader 0xca74e5dc5a8941b41858d597125071284572e9c6\n",
335
+ "statking label \n",
336
+ "checking trader 0x217dc62fca6027231a8b954e333d088375fe21d0\n",
337
+ "statking label \n"
338
+ ]
339
+ },
340
+ {
341
+ "name": "stderr",
342
+ "output_type": "stream",
343
+ "text": [
344
+ "Labeling traders by staking: 77%|███████▋ | 157/204 [00:00<00:00, 393.35trader/s]"
345
+ ]
346
+ },
347
+ {
348
+ "name": "stdout",
349
+ "output_type": "stream",
350
+ "text": [
351
+ "checking trader 0x64b9afc7343374b8b89a6a83d56e859349722115\n",
352
+ "statking label \n",
353
+ "checking trader 0xe3483992c90fff85ce99b8047ff5988d6a4a9ad9\n",
354
+ "statking label quickstart\n",
355
+ "checking trader 0xca6a7735745ab50ba3831ad92437fbb4a49474e4\n",
356
+ "statking label \n",
357
+ "checking trader 0x36ff6381fd5f30c06428b47ed36ee0f8a018d49e\n",
358
+ "statking label \n",
359
+ "checking trader 0xd75b30e0f3093a3a4c90bb14028a21684047884c\n",
360
+ "statking label \n",
361
+ "checking trader 0x20a55f64186b467fa67df63c2b8d2e0d84ecdaa4\n",
362
+ "statking label pearl\n",
363
+ "checking trader 0xed907a98de939f9817faa1c6e644922e3ee0cdec\n",
364
+ "statking label pearl\n",
365
+ "checking trader 0x360e606b22df1f808366255ef0bbefa425f570f4\n",
366
+ "statking label pearl\n",
367
+ "checking trader 0x4b9e1890640e5f56f7fdc580347c938aaab56c25\n",
368
+ "statking label pearl\n",
369
+ "checking trader 0x82f80ff2d0ebf6680c98ad8fc874990b073f25cc\n",
370
+ "statking label pearl\n",
371
+ "checking trader 0x03429c1ab7d9d14baa42ded8a2dd7d684fc950ed\n",
372
+ "statking label pearl\n",
373
+ "checking trader 0x66a022b113b41e08d90cfd9468b8b6565d6ea995\n",
374
+ "statking label pearl\n",
375
+ "checking trader 0xfaa64c148c32af3552413438ec78599bffbd077a\n",
376
+ "statking label pearl\n",
377
+ "checking trader 0xfd5f7d27f31aea2fdba38ced1c2a3ace4bf41c64\n",
378
+ "trader address not found in the service map\n",
379
+ "statking label \n",
380
+ "checking trader 0x23651c17d74e6b44808224cf77069dae3cbafec1\n",
381
+ "statking label pearl\n",
382
+ "checking trader 0x11d3628a251761404a86919297a7ccf6081232a2\n",
383
+ "statking label pearl\n",
384
+ "checking trader 0xc6c10307b9ae985507064a7da090bc8efce5e908\n",
385
+ "statking label \n",
386
+ "checking trader 0x4ffeaa1389ba49cd30dee138031d0c8ab3091ea4\n",
387
+ "statking label pearl\n",
388
+ "checking trader 0xe283e408c6017447da9fe092d52c386753699680\n",
389
+ "statking label pearl\n",
390
+ "checking trader 0x42a6ddcec8760f181cc2ac3ba6ebf30e9887e953\n",
391
+ "statking label \n",
392
+ "checking trader 0xe61aacd2218dda951d0d0a0c014b5cd2c0d79d9e\n",
393
+ "statking label pearl\n",
394
+ "checking trader 0x2b00ebb18be2224d60fc55ae52df5cf6177f8fb7\n",
395
+ "statking label pearl\n",
396
+ "checking trader 0xdab47894968c773be2b2205332e17f5599bc3634\n",
397
+ "statking label pearl\n",
398
+ "checking trader 0x7011de27693bd17bfc248722488aec71f8941137\n",
399
+ "statking label pearl\n",
400
+ "checking trader 0x358e58683e54b2b1b0536727df52a001df5acdf8\n",
401
+ "statking label pearl\n",
402
+ "checking trader 0xfe94203ab2c1c22fe8585cbebf865f7b69eb7027\n",
403
+ "statking label pearl\n",
404
+ "checking trader 0x1fe2b09de07475b1027b0c73a5bf52693b31a52e\n",
405
+ "statking label pearl\n",
406
+ "checking trader 0x27f64fbfcab718c03a91d9d8782ef2253f92af92\n",
407
+ "statking label pearl\n",
408
+ "checking trader 0x30071aa627e6accc474d4adaa228b2e2007576ea\n",
409
+ "statking label pearl\n",
410
+ "checking trader 0xbef5e39616ee3d565fd2c77dae89fdd5a5ec982b\n",
411
+ "statking label pearl\n",
412
+ "checking trader 0x532ac93de6fa041665fd2ea25d4232bfd0ae4553\n",
413
+ "statking label pearl\n",
414
+ "checking trader 0x5540b853357c2c04bf02896b028c1e5a8f6a114c\n",
415
+ "statking label pearl\n",
416
+ "checking trader 0x8e03d3a7a3dfd930f73577ba4204deadf12b33f3\n",
417
+ "statking label pearl\n",
418
+ "checking trader 0xdbd9367514f2ca6ff6c792fe0ee7cbdb80cc36d2\n",
419
+ "statking label pearl\n",
420
+ "checking trader 0x43ce1d7a706c7ea44d5c5b9eb9956cfc0003b9ee\n",
421
+ "statking label pearl\n",
422
+ "checking trader 0x2c83cf4bb92e55e35b6e4af6eca6c0a85fb73650\n",
423
+ "statking label pearl\n",
424
+ "checking trader 0x2cb043eb5506a5a1c71a239f62957f8b4b148978\n",
425
+ "statking label pearl\n",
426
+ "checking trader 0x51b86fccc3d92d6d2459b7a2bc6498e18bd0afa2\n",
427
+ "statking label pearl\n",
428
+ "checking trader 0x559c37c1b34a1802618a9ff36211f360ca5c5f02\n",
429
+ "statking label pearl\n",
430
+ "checking trader 0x7bcf0f480e52da1597d7437d5b4a4644b1e7ec23\n",
431
+ "statking label pearl\n",
432
+ "checking trader 0x8069ea45a18910fa493a6a736438971b0e59ec9b\n",
433
+ "statking label pearl\n",
434
+ "checking trader 0x87f0fcfe810502555f8d1439793155cbfa2eb583\n",
435
+ "statking label pearl\n",
436
+ "checking trader 0xd0b3c90682dd4abbd1135c17b39c1726b96e0f78\n",
437
+ "statking label pearl\n",
438
+ "checking trader 0xe0113a139f591efa8bf5e19308c7c27199682d77\n",
439
+ "statking label pearl\n",
440
+ "checking trader 0xe271378e094db9d64e34c6c14a7492bcccd11dfb\n",
441
+ "statking label pearl\n",
442
+ "checking trader 0x04430ebfb7d088960233b7353cb4cefb528dc31e\n",
443
+ "statking label pearl\n",
444
+ "checking trader 0x1a138c65f8423fcf144bb0fd4d5a5f8b5c99a558\n",
445
+ "statking label pearl\n",
446
+ "checking trader 0x2604cb57b88a3d1be9301b5e786d92961ea4a1d1\n",
447
+ "statking label \n",
448
+ "checking trader 0xd5fcb0db8af1c19655103c499ab7e20c58b888d4\n",
449
+ "statking label \n",
450
+ "checking trader 0xd71b78ce490776a8f0cad6876ea79bc190f7bcce\n",
451
+ "statking label pearl\n",
452
+ "checking trader 0xfe16926cefc4db4a7496bfc3e961445228fbbf39\n",
453
+ "statking label pearl\n",
454
+ "checking trader 0x0554b950e493fad8e89d7cd9d2368ffbab9d3e4e\n",
455
+ "statking label pearl\n",
456
+ "checking trader 0x913dedfcfb335a49509b67acb3b1ab2612a5c0c9\n",
457
+ "statking label pearl\n",
458
+ "checking trader 0xc5bc3ae599aa5dc2f56faeb074e0544d39193790\n",
459
+ "statking label pearl\n",
460
+ "checking trader 0x032533005f65026fa7f360ff9a211bc94315325d\n",
461
+ "statking label pearl\n",
462
+ "checking trader 0xa2247313e3a32c21866d5a7484bcc4fe466a3b94\n",
463
+ "statking label pearl\n",
464
+ "checking trader 0x5bc54e5c4b7ce1f5d006f7b0910901c1dbea8d4c\n",
465
+ "statking label pearl\n",
466
+ "checking trader 0xa1019a256cb5ef81e11809dd021269b4cafc071c\n",
467
+ "statking label pearl\n",
468
+ "checking trader 0xe27ab203204bb40d8853b4b576950ae4b407de3a\n",
469
+ "statking label pearl\n",
470
+ "checking trader 0x333dd90d00c8a46dde6a0e59569a9a8c25a9e2f4\n",
471
+ "statking label pearl\n",
472
+ "checking trader 0x4ba7229c275774e44cdde802e59e1bcf352981a7\n",
473
+ "statking label pearl\n",
474
+ "checking trader 0x1b9e28e7f817e1312636a485f31cca8a4be61fac\n",
475
+ "statking label pearl\n",
476
+ "checking trader 0x245b25aa5728368d7efafdf107f887bf3b72ce78\n",
477
+ "statking label pearl\n",
478
+ "checking trader 0x37c241945001f6c26c886c8d551cc2e6cf34c214\n",
479
+ "statking label pearl\n",
480
+ "checking trader 0x528907630bfda4f3b00580c0d7d3a69ccec62173\n",
481
+ "statking label pearl\n",
482
+ "checking trader 0x84aeb93d348c6da1ea4b0016c207aefc26edaa44\n"
483
+ ]
484
+ },
485
+ {
486
+ "name": "stderr",
487
+ "output_type": "stream",
488
+ "text": [
489
+ "Labeling traders by staking: 100%|██████████| 204/204 [00:00<00:00, 415.07trader/s]\n"
490
+ ]
491
+ },
492
+ {
493
+ "name": "stdout",
494
+ "output_type": "stream",
495
+ "text": [
496
+ "statking label pearl\n",
497
+ "checking trader 0x8cedb179299b99eeef4f6b231bc194952a339557\n",
498
+ "statking label pearl\n",
499
+ "checking trader 0x96d56cf7c906ab13752d5770e93e69330d050f5b\n",
500
+ "statking label pearl\n",
501
+ "checking trader 0xb972c2fdd528c3a56a6548c1247b9f68a00beae8\n",
502
+ "statking label pearl\n",
503
+ "checking trader 0xffc47cb1ecd41daae58e39fd4193d6fe9a6f5d2e\n",
504
+ "statking label pearl\n",
505
+ "checking trader 0x2ff064d951996c9fe70d6ba22d8684f37b2e24ec\n",
506
+ "trader address not found in the service map\n",
507
+ "statking label \n",
508
+ "checking trader 0xdb741a8f175b9baadd9b6777c1d57322117266e3\n",
509
+ "statking label pearl\n",
510
+ "checking trader 0x8e9d20cab5a3ed63ed7984092dd214e012a919bb\n",
511
+ "statking label pearl\n",
512
+ "checking trader 0xac3ebb0ab2e0dc9aff761a9841e91e02e537cdbf\n",
513
+ "statking label pearl\n",
514
+ "checking trader 0x6ed28d3d8996dccc661559cd34a160b18cd3c7a8\n",
515
+ "statking label \n",
516
+ "checking trader 0xc7fc9c1e1ba6bb6a49f62b7b0d8a77d6d3c9dfbc\n",
517
+ "statking label pearl\n",
518
+ "checking trader 0x6957f7ac4a0a09f237a901749e518a678d1a614a\n",
519
+ "statking label pearl\n",
520
+ "checking trader 0xe715cc8f264ab48f75bb1b5c11d7dbaf949d73c5\n",
521
+ "statking label pearl\n",
522
+ "checking trader 0x24bb7773d38fb1555fcd8be28859f679fe242dbf\n",
523
+ "statking label pearl\n",
524
+ "checking trader 0x10ece1553b5017414388fe78f64720814d7f8799\n",
525
+ "statking label pearl\n",
526
+ "checking trader 0x2ad146e33b27933241dd68eeb18e77d860ba361d\n",
527
+ "statking label pearl\n",
528
+ "checking trader 0x29e9576633cafd8b0040cd3054c190d85a97a95b\n",
529
+ "statking label pearl\n",
530
+ "checking trader 0x300e2a08034a1e2a962da72f5569fa053dfde44c\n",
531
+ "statking label pearl\n",
532
+ "checking trader 0x8969bd87b9e743d8120e41445462f0cbe29f5d7c\n",
533
+ "statking label \n",
534
+ "checking trader 0xc0de1041eaef133b72e22697a497db4f266c9584\n",
535
+ "statking label pearl\n",
536
+ "checking trader 0x047f8663b254d90d28af6d8ca7181947e94577ce\n",
537
+ "statking label pearl\n",
538
+ "checking trader 0x006f70b4e3c3a3648f31ec16b2e7106fc58166f2\n",
539
+ "statking label pearl\n",
540
+ "checking trader 0x06d873e7465a6680f5487905d7b5daf7f2c6e299\n",
541
+ "statking label pearl\n",
542
+ "checking trader 0xad8aa6f927bb6a38af8121418f1b64d4ed8be99c\n",
543
+ "statking label pearl\n",
544
+ "checking trader 0x651d04044b780e68f3f952796fb7c06fb0928ad2\n",
545
+ "statking label pearl\n",
546
+ "checking trader 0x7ddbfbebbec1635315f9217cbf9de8afd272c8de\n",
547
+ "statking label pearl\n",
548
+ "checking trader 0x3badd0a1beb34fc1532f6c717fa857b3325da184\n",
549
+ "statking label pearl\n",
550
+ "checking trader 0xe0d01efee7a9740f8e702f086dd4fcae87926abf\n",
551
+ "trader address not found in the service map\n",
552
+ "statking label \n",
553
+ "checking trader 0xd75859beb7a211f44ae613743aaae48f87844e43\n",
554
+ "statking label pearl\n",
555
+ "checking trader 0x86c250c602f9afefac6eb559bb2e2ade96c460de\n",
556
+ "statking label pearl\n",
557
+ "checking trader 0x35ba3f37a5d44ffba63aee80c74fefa6f6ac0599\n",
558
+ "statking label pearl\n",
559
+ "checking trader 0x5813be58870670255d8694aed4c8d54bbc7286cf\n",
560
+ "statking label pearl\n",
561
+ "checking trader 0x6e5d93fdcc14db02a58ace636c2dcff8db36039d\n",
562
+ "statking label pearl\n",
563
+ "checking trader 0xbc7adca303cdda308b379e8b7925789f64296ef4\n",
564
+ "statking label pearl\n",
565
+ "checking trader 0x312a3a73155aab4033134c22205d9788c3fffcfc\n",
566
+ "statking label pearl\n",
567
+ " trader_address creation_timestamp \\\n",
568
+ "0 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 2024-08-25 02:37:35+00:00 \n",
569
+ "1 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 2024-08-30 03:24:45+00:00 \n",
570
+ "2 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 2024-08-26 02:48:20+00:00 \n",
571
+ "3 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 2024-08-27 00:23:25+00:00 \n",
572
+ "4 0x022b36c50b85b8ae7addfb8a35d76c59d5814834 2024-08-28 01:41:30+00:00 \n",
573
+ "... ... ... \n",
574
+ "4867 0x35ba3f37a5d44ffba63aee80c74fefa6f6ac0599 2024-08-18 17:16:50+00:00 \n",
575
+ "4868 0x5813be58870670255d8694aed4c8d54bbc7286cf 2024-08-26 20:28:00+00:00 \n",
576
+ "4869 0x6e5d93fdcc14db02a58ace636c2dcff8db36039d 2024-09-27 17:30:25+00:00 \n",
577
+ "4870 0xbc7adca303cdda308b379e8b7925789f64296ef4 2024-09-03 08:47:50+00:00 \n",
578
+ "4871 0x312a3a73155aab4033134c22205d9788c3fffcfc 2024-09-05 02:04:55+00:00 \n",
579
+ "\n",
580
+ " market_creator staking collateral_amount \n",
581
+ "0 quickstart 0.450426 \n",
582
+ "1 quickstart 0.419662 \n",
583
+ "2 quickstart 0.641732 \n",
584
+ "3 quickstart 0.482506 \n",
585
+ "4 quickstart 0.567930 \n",
586
+ "... ... ... ... \n",
587
+ "4867 pearl pearl 0.274184 \n",
588
+ "4868 pearl pearl 1.000000 \n",
589
+ "4869 pearl pearl 0.559664 \n",
590
+ "4870 pearl pearl 1.000000 \n",
591
+ "4871 pearl pearl 1.000000 \n",
592
+ "\n",
593
+ "[4872 rows x 5 columns]\n",
594
+ "staking\n",
595
+ " 2503\n",
596
+ "quickstart 1699\n",
597
+ "pearl 670\n",
598
+ "Name: count, dtype: int64\n"
599
+ ]
600
+ }
601
+ ],
602
+ "source": [
603
+ "trades_df = pd.read_parquet(\"../data/all_trades_profitability.parquet\")\n",
604
+ "trades_df = label_trades_by_staking(trades_df=trades_df)\n",
605
+ "print(\n",
606
+ " trades_df[\n",
607
+ " [\n",
608
+ " \"trader_address\",\n",
609
+ " \"creation_timestamp\",\n",
610
+ " \"market_creator\",\n",
611
+ " \"staking\",\n",
612
+ " \"collateral_amount\",\n",
613
+ " ]\n",
614
+ " ]\n",
615
+ ")\n",
616
+ "print(trades_df.staking.value_counts())"
617
+ ]
618
+ },
619
+ {
620
+ "cell_type": "code",
621
+ "execution_count": 6,
622
+ "metadata": {},
623
+ "outputs": [
624
+ {
625
+ "data": {
626
+ "text/plain": [
627
+ "staking\n",
628
+ " 808\n",
629
+ "pearl 670\n",
630
+ "Name: count, dtype: int64"
631
+ ]
632
+ },
633
+ "execution_count": 6,
634
+ "metadata": {},
635
+ "output_type": "execute_result"
636
+ }
637
+ ],
638
+ "source": [
639
+ "trades_df.loc[trades_df[\"market_creator\"]==\"pearl\"].staking.value_counts()"
640
+ ]
641
+ },
642
+ {
643
+ "cell_type": "code",
644
+ "execution_count": 7,
645
+ "metadata": {},
646
+ "outputs": [],
647
+ "source": [
648
+ "trades_df['staking'] = trades_df['staking'].replace({\n",
649
+ " \"\": \"non_staking\",\n",
650
+ " \"pearl\": \"staking\"\n",
651
+ "})"
652
+ ]
653
+ },
654
+ {
655
+ "cell_type": "code",
656
+ "execution_count": 8,
657
+ "metadata": {},
658
+ "outputs": [
659
+ {
660
+ "data": {
661
+ "text/plain": [
662
+ "staking\n",
663
+ "non_staking 808\n",
664
+ "staking 670\n",
665
+ "Name: count, dtype: int64"
666
+ ]
667
+ },
668
+ "execution_count": 8,
669
+ "metadata": {},
670
+ "output_type": "execute_result"
671
+ }
672
+ ],
673
+ "source": [
674
+ "trades_df.loc[trades_df[\"market_creator\"]==\"pearl\"].staking.value_counts()"
675
+ ]
676
+ },
677
+ {
678
+ "cell_type": "code",
679
+ "execution_count": 11,
680
+ "metadata": {},
681
+ "outputs": [
682
+ {
683
+ "data": {
684
+ "text/plain": [
685
+ "market_creator\n",
686
+ "quickstart 3394\n",
687
+ "pearl 1478\n",
688
+ "Name: count, dtype: int64"
689
+ ]
690
+ },
691
+ "execution_count": 11,
692
+ "metadata": {},
693
+ "output_type": "execute_result"
694
+ }
695
+ ],
696
+ "source": [
697
+ "trades_df.market_creator.value_counts()"
698
+ ]
699
+ },
700
+ {
701
+ "cell_type": "code",
702
+ "execution_count": 12,
703
+ "metadata": {},
704
+ "outputs": [],
705
+ "source": [
706
+ "trades_all = trades_df.copy(deep=True)\n",
707
+ "trades_all[\"market_creator\"] = \"all\""
708
+ ]
709
+ },
710
+ {
711
+ "cell_type": "code",
712
+ "execution_count": 13,
713
+ "metadata": {},
714
+ "outputs": [],
715
+ "source": [
716
+ "\n",
717
+ "# merging both dataframes\n",
718
+ "all_filtered_trades = pd.concat([trades_df, trades_all], ignore_index=True)\n",
719
+ "all_filtered_trades = all_filtered_trades.sort_values(\n",
720
+ " by=\"creation_timestamp\", ascending=True\n",
721
+ ")"
722
+ ]
723
+ },
724
+ {
725
+ "cell_type": "code",
726
+ "execution_count": 14,
727
+ "metadata": {},
728
+ "outputs": [
729
+ {
730
+ "data": {
731
+ "text/plain": [
732
+ "market_creator\n",
733
+ "all 4872\n",
734
+ "quickstart 3394\n",
735
+ "pearl 1478\n",
736
+ "Name: count, dtype: int64"
737
+ ]
738
+ },
739
+ "execution_count": 14,
740
+ "metadata": {},
741
+ "output_type": "execute_result"
742
+ }
743
+ ],
744
+ "source": [
745
+ "all_filtered_trades.market_creator.value_counts()"
746
+ ]
747
+ },
748
+ {
749
+ "cell_type": "code",
750
+ "execution_count": 15,
751
+ "metadata": {},
752
+ "outputs": [],
753
+ "source": [
754
+ "all_filtered_trades = all_filtered_trades.loc[\n",
755
+ " all_filtered_trades[\"market_creator\"] == \"all\"\n",
756
+ "]"
757
+ ]
758
+ },
759
+ {
760
+ "cell_type": "code",
761
+ "execution_count": 16,
762
+ "metadata": {},
763
+ "outputs": [
764
+ {
765
+ "data": {
766
+ "text/plain": [
767
+ "staking\n",
768
+ " 2503\n",
769
+ "quickstart 1699\n",
770
+ "pearl 670\n",
771
+ "Name: count, dtype: int64"
772
+ ]
773
+ },
774
+ "execution_count": 16,
775
+ "metadata": {},
776
+ "output_type": "execute_result"
777
+ }
778
+ ],
779
+ "source": [
780
+ "all_filtered_trades.staking.value_counts()"
781
+ ]
782
+ },
783
+ {
784
+ "cell_type": "code",
785
+ "execution_count": null,
786
+ "metadata": {},
787
+ "outputs": [],
788
+ "source": []
789
+ }
790
+ ],
791
+ "metadata": {
792
+ "kernelspec": {
793
+ "display_name": "hf_dashboards",
794
+ "language": "python",
795
+ "name": "python3"
796
+ },
797
+ "language_info": {
798
+ "codemirror_mode": {
799
+ "name": "ipython",
800
+ "version": 3
801
+ },
802
+ "file_extension": ".py",
803
+ "mimetype": "text/x-python",
804
+ "name": "python",
805
+ "nbconvert_exporter": "python",
806
+ "pygments_lexer": "ipython3",
807
+ "version": "3.12.2"
808
+ }
809
+ },
810
+ "nbformat": 4,
811
+ "nbformat_minor": 2
812
+ }
scripts/profitability.py CHANGED
@@ -32,6 +32,7 @@ from pathlib import Path
32
  from get_mech_info import DATETIME_60_DAYS_AGO
33
  from utils import SUBGRAPH_API_KEY, wei_to_unit, convert_hex_to_int, _to_content
34
  from queries import omen_xdai_trades_query, conditional_tokens_gc_user_query
 
35
 
36
  QUERY_BATCH_SIZE = 1000
37
  DUST_THRESHOLD = 10000000000000
@@ -573,6 +574,9 @@ def run_profitability_analysis(
573
  print("Summarising trades...")
574
  summary_df = summary_analyse(all_trades_df)
575
 
 
 
 
576
  # save to parquet
577
  all_trades_df.to_parquet(DATA_DIR / "all_trades_profitability.parquet", index=False)
578
  summary_df.to_parquet(DATA_DIR / "summary_profitability.parquet", index=False)
 
32
  from get_mech_info import DATETIME_60_DAYS_AGO
33
  from utils import SUBGRAPH_API_KEY, wei_to_unit, convert_hex_to_int, _to_content
34
  from queries import omen_xdai_trades_query, conditional_tokens_gc_user_query
35
+ from scripts.staking import label_trades_by_staking
36
 
37
  QUERY_BATCH_SIZE = 1000
38
  DUST_THRESHOLD = 10000000000000
 
574
  print("Summarising trades...")
575
  summary_df = summary_analyse(all_trades_df)
576
 
577
+ # add staking labels
578
+ label_trades_by_staking(trades_df=all_trades_df)
579
+
580
  # save to parquet
581
  all_trades_df.to_parquet(DATA_DIR / "all_trades_profitability.parquet", index=False)
582
  summary_df.to_parquet(DATA_DIR / "summary_profitability.parquet", index=False)
scripts/staking.py ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import sys
3
+ from pathlib import Path
4
+ from typing import Any, List
5
+ from utils import RPC, DATA_DIR
6
+ import requests
7
+ from tqdm import tqdm
8
+ from web3 import Web3
9
+ import pandas as pd
10
+ import pickle
11
+ import os
12
+ from concurrent.futures import ThreadPoolExecutor, as_completed
13
+
14
+ NUM_WORKERS = 10
15
+ DEPRECATED_STAKING_PROGRAMS = {
16
+ "quickstart_alpha_everest": "0x5add592ce0a1B5DceCebB5Dcac086Cd9F9e3eA5C",
17
+ "quickstart_alpha_alpine": "0x2Ef503950Be67a98746F484DA0bBAdA339DF3326",
18
+ "quickstart_alpha_coastal": "0x43fB32f25dce34EB76c78C7A42C8F40F84BCD237",
19
+ }
20
+ STAKING_PROGRAMS_QS = {
21
+ "quickstart_beta_hobbyist": "0x389B46c259631Acd6a69Bde8B6cEe218230bAE8C",
22
+ "quickstart_beta_hobbyist_2": "0x238EB6993b90a978ec6AAD7530d6429c949C08DA",
23
+ "quickstart_beta_expert": "0x5344B7DD311e5d3DdDd46A4f71481bD7b05AAA3e",
24
+ "quickstart_beta_expert_2": "0xb964e44c126410df341ae04B13aB10A985fE3513",
25
+ "quickstart_beta_expert_3": "0x80faD33Cadb5F53f9D29F02Db97D682E8b101618",
26
+ }
27
+
28
+ STAKING_PROGRAMS_PEARL = {
29
+ "pearl_alpha": "0xEE9F19b5DF06c7E8Bfc7B28745dcf944C504198A",
30
+ "pearl_beta": "0xeF44Fb0842DDeF59D37f85D61A1eF492bbA6135d",
31
+ "pearl_beta_2": "0x1c2F82413666d2a3fD8bC337b0268e62dDF67434",
32
+ }
33
+ SERVICE_REGISTRY_ADDRESS = "0x9338b5153AE39BB89f50468E608eD9d764B755fD"
34
+
35
+
36
+ def _get_contract(address: str) -> Any:
37
+ w3 = Web3(Web3.HTTPProvider(RPC))
38
+ abi = _get_abi(address)
39
+ contract = w3.eth.contract(address=Web3.to_checksum_address(address), abi=abi)
40
+ return contract
41
+
42
+
43
+ def _get_abi(address: str) -> List:
44
+ contract_abi_url = (
45
+ "https://gnosis.blockscout.com/api/v2/smart-contracts/{contract_address}"
46
+ )
47
+ response = requests.get(contract_abi_url.format(contract_address=address)).json()
48
+
49
+ if "result" in response:
50
+ result = response["result"]
51
+ try:
52
+ abi = json.loads(result)
53
+ except json.JSONDecodeError:
54
+ print("Error: Failed to parse 'result' field as JSON")
55
+ sys.exit(1)
56
+ else:
57
+ abi = response.get("abi")
58
+
59
+ return abi if abi else []
60
+
61
+
62
+ def get_service_safe(service_id: int) -> str:
63
+ """Gets the service Safe"""
64
+ service_registry = _get_contract(SERVICE_REGISTRY_ADDRESS)
65
+ service_safe_address = service_registry.functions.getService(service_id).call()[1]
66
+ return service_safe_address
67
+
68
+
69
+ def list_contract_functions(contract):
70
+ function_names = []
71
+ for item in contract.abi:
72
+ if item.get("type") == "function":
73
+ function_names.append(item.get("name"))
74
+ return function_names
75
+
76
+
77
+ def get_service_data(service_registry: Any, service_id: int) -> dict:
78
+ tmp_map = {}
79
+ # Get the list of addresses
80
+ # print(f"getting addresses from service id ={service_id}")
81
+
82
+ # available_functions = list_contract_functions(service_registry)
83
+ # print("Available Contract Functions:")
84
+ # for func in available_functions:
85
+ # print(f"- {func}")
86
+
87
+ data = service_registry.functions.getService(service_id).call()
88
+ try:
89
+ owner_data = service_registry.functions.ownerOf(service_id).call()
90
+ except Exception as e:
91
+ tqdm.write(f"Error: no owner data infor from {service_id}")
92
+ return None
93
+ # print(f"owner data = {owner_data}")
94
+ address = data[1]
95
+ state = data[-1]
96
+ # print(f"address = {address}")
97
+ # print(f"state={state}")
98
+ if address != "0x0000000000000000000000000000000000000000":
99
+ tmp_map[service_id] = {
100
+ "safe_address": address,
101
+ "state": state,
102
+ "owner_address": owner_data,
103
+ }
104
+ return tmp_map
105
+
106
+
107
+ def update_service_map(start: int = 1, end: int = 1000):
108
+ if os.path.exists(DATA_DIR / "service_map.pkl"):
109
+ with open(DATA_DIR / "service_map.pkl", "rb") as f:
110
+ service_map = pickle.load(f)
111
+ else:
112
+ service_map = {}
113
+
114
+ # we do not know which is the last service id right now
115
+ service_registry = _get_contract(SERVICE_REGISTRY_ADDRESS)
116
+ with ThreadPoolExecutor(max_workers=NUM_WORKERS) as executor:
117
+ futures = []
118
+ for service_id in range(start, end):
119
+ futures.append(
120
+ executor.submit(
121
+ get_service_data,
122
+ service_registry,
123
+ service_id,
124
+ )
125
+ )
126
+
127
+ for future in tqdm(
128
+ as_completed(futures),
129
+ total=len(futures),
130
+ desc=f"Fetching all service data from contracts",
131
+ ):
132
+ partial_dict = future.result()
133
+ if partial_dict:
134
+ service_map.update(partial_dict)
135
+
136
+ with open(DATA_DIR / "service_map.pkl", "wb") as f:
137
+ pickle.dump(service_map, f)
138
+
139
+
140
+ def check_owner_staking_contract(owner_address: str) -> str:
141
+ staking = ""
142
+ owner_address = owner_address.lower()
143
+ # check quickstart staking contracts
144
+ qs_list = [x.lower() for x in STAKING_PROGRAMS_QS.values()]
145
+ if owner_address in qs_list:
146
+ return "quickstart"
147
+
148
+ # check pearl staking contracts
149
+ pearl_list = [x.lower() for x in STAKING_PROGRAMS_PEARL.values()]
150
+ if owner_address in pearl_list:
151
+ return "pearl"
152
+
153
+ # check legacy staking contracts
154
+ deprec_list = [x.lower() for x in DEPRECATED_STAKING_PROGRAMS.values()]
155
+ if owner_address in deprec_list:
156
+ return "quickstart"
157
+
158
+ return staking
159
+
160
+
161
+ def get_trader_address_staking(trader_address: str, service_map: dict) -> str:
162
+ # check if there is any service id linked with that trader address
163
+
164
+ found_key = -1
165
+ for key, value in service_map.items():
166
+ if value["safe_address"].lower() == trader_address.lower():
167
+ # found a service
168
+ found_key = key
169
+ break
170
+
171
+ if found_key == -1:
172
+ return ""
173
+ owner = service_map[found_key]["owner_address"]
174
+ return check_owner_staking_contract(owner_address=owner)
175
+
176
+
177
+ def label_trades_by_staking(trades_df: pd.DataFrame) -> pd.DataFrame:
178
+ with open(DATA_DIR / "service_map.pkl", "rb") as f:
179
+ service_map = pickle.load(f)
180
+ # get the last service id
181
+ keys = service_map.keys()
182
+ last_key = max(keys)
183
+ update_service_map(start=last_key)
184
+ all_traders = trades_df.trader_address.unique()
185
+ trades_df["staking"] = ""
186
+ for trader in tqdm(all_traders, desc="Labeling traders by staking", unit="trader"):
187
+ # tqdm.write(f"checking trader {trader}")
188
+ staking_label = get_trader_address_staking(trader, service_map)
189
+ if staking_label:
190
+ trades_df.loc[trades_df["trader_address"] == trader, "staking"] = (
191
+ staking_label
192
+ )
193
+ # tqdm.write(f"statking label {staking_label}")
194
+ return
195
+
196
+
197
+ if __name__ == "__main__":
198
+ # create_service_map()
199
+ trades_df = pd.read_parquet(DATA_DIR / "all_trades_profitability.parquet")
200
+ label_trades_by_staking(trades_df=trades_df)
201
+ print(
202
+ trades_df[
203
+ [
204
+ "trader_address",
205
+ "creation_timestamp",
206
+ "market_creator",
207
+ "staking",
208
+ "collateral_amount",
209
+ ]
210
+ ]
211
+ )
212
+ print(trades_df.staking.value_counts())
213
+ trades_df.to_parquet(DATA_DIR / "all_trades_profitability.parquet", index=False)
tabs/staking.py ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ import plotly.express as px
4
+
5
+
6
+ def get_overall_by_staking_traders(trades_df: pd.DataFrame) -> pd.DataFrame:
7
+ """Gets the overall trades data"""
8
+ trades_count = (
9
+ trades_df.groupby(["month_year_week", "staking"], sort=False)
10
+ .size()
11
+ .reset_index()
12
+ )
13
+ trades_count.columns = trades_count.columns.astype(str)
14
+ trades_count.rename(columns={"0": "trades"}, inplace=True)
15
+ return trades_count
16
+
17
+
18
+ def plot_staking_trades_per_market_by_week(
19
+ trades_df: pd.DataFrame, market_creator: str
20
+ ) -> gr.Plot:
21
+
22
+ # adding the total
23
+ trades_all = trades_df.copy(deep=True)
24
+ trades_all["market_creator"] = "all"
25
+
26
+ # choose colour
27
+ market_colour = "darkgreen"
28
+ if market_creator == "pearl":
29
+ market_colour = "purple"
30
+ elif market_creator == "quickstart":
31
+ market_colour = "goldenrod"
32
+
33
+ # merging both dataframes
34
+ all_filtered_trades = pd.concat([trades_df, trades_all], ignore_index=True)
35
+ all_filtered_trades = all_filtered_trades.sort_values(
36
+ by="creation_timestamp", ascending=True
37
+ )
38
+
39
+ all_filtered_trades = all_filtered_trades.loc[
40
+ all_filtered_trades["market_creator"] == market_creator
41
+ ]
42
+ if market_creator != "all":
43
+ all_filtered_trades["staking"] = all_filtered_trades["staking"].replace(
44
+ {"": "non_staking_traders", market_creator: "staking_traders"}
45
+ )
46
+ colour_sequence = ["gray", market_colour]
47
+ categories_sorted = {"staking": ["non_staking_traders", "staking_traders"]}
48
+ else:
49
+ all_filtered_trades["staking"] = all_filtered_trades["staking"].replace(
50
+ {
51
+ "": "non_staking_traders",
52
+ "pearl": "staking_pearl_traders",
53
+ "quickstart": "staking_quickstart_traders",
54
+ }
55
+ )
56
+ colour_sequence = ["gray", "purple", "goldenrod"]
57
+ categories_sorted = {
58
+ "staking": [
59
+ "non_staking_traders",
60
+ "staking_pearl_traders",
61
+ "staking_quickstart_traders",
62
+ ]
63
+ }
64
+ trades = get_overall_by_staking_traders(all_filtered_trades)
65
+ fig = px.bar(
66
+ trades,
67
+ x="month_year_week",
68
+ y="trades",
69
+ color="staking",
70
+ barmode="group",
71
+ color_discrete_sequence=colour_sequence,
72
+ category_orders=categories_sorted,
73
+ )
74
+
75
+ fig.update_layout(
76
+ xaxis_title="Week",
77
+ yaxis_title="Weekly nr of trades",
78
+ legend=dict(yanchor="top", y=0.5),
79
+ width=1000, # Adjusted for better fit on laptop screens
80
+ height=600, # Adjusted for better fit on laptop screens
81
+ )
82
+ fig.update_xaxes(tickformat="%b %d\n%Y")
83
+ return gr.Plot(value=fig)