Coverage for src/utils/land_util.py: 0%
126 statements
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-03 19:06 +0000
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-03 19:06 +0000
1import json
2import logging
3from datetime import datetime
5import pandas as pd
7from src.api import spl, hive
8from src.static.static_values_enum import LAND_SWAP_FEE
9from src.utils import progress_util
12def filter_items(deed, df, param):
13 if deed[param]:
14 # return matching values
15 return df.loc[(df[param] == deed[param])]
16 else:
17 # return value either None or ""
18 return df[(df[param].isnull()) | (df[param] == "")]
21def get_deeds_value(account_name):
22 collection = spl.get_deeds_collection(account_name)
23 market_df = pd.DataFrame(spl.get_deeds_market())
24 deeds_price_found = 0
25 deeds_owned = 0
26 deeds_total = 0.0
27 for deed in collection:
28 deeds_owned += 1
29 filter_types = ["rarity", 'plot_status', 'magic_type', 'deed_type']
30 df = market_df
31 missing_types = []
32 for filter_type in filter_types:
33 temp = filter_items(deed, df, filter_type)
34 if not temp.empty:
35 df = temp
36 else:
37 missing_types.append(filter_type)
38 if missing_types:
39 logging.warning("Not a perfect match found missing filters: " + str(missing_types))
40 logging.warning("Was looking for: \n" +
41 "\n".join([str(x) + ": " + str(deed[x]) for x in filter_types]))
42 logging.warning("Current estimated best value now: " +
43 str(df.astype({'listing_price': 'float'}).listing_price.min()))
44 listing_price = df.astype({'listing_price': 'float'}).listing_price.min()
45 deeds_price_found += 1
47 deeds_total += listing_price
49 return pd.DataFrame({'date': datetime.today().strftime('%Y-%m-%d'),
50 'account_name': account_name,
51 'deeds_qty': deeds_owned,
52 'deeds_price_found_qty': deeds_price_found,
53 'deeds_value': deeds_total}, index=[0])
56def get_staked_dec_value(account_name):
57 dec_staked_value = 0
58 dec_staked_qty = 0
60 dec_staked_df = spl.get_staked_dec_df(account_name)
61 if not dec_staked_df.empty:
62 dec_staked_qty = dec_staked_df.amount.sum()
63 token_market = hive.get_market_with_retry('DEC')
64 hive_in_dollar = float(spl.get_prices()['hive'])
66 if token_market:
67 hive_value = float(token_market["highestBid"])
68 dec_staked_value = round(hive_value * hive_in_dollar * dec_staked_qty, 2)
70 return pd.DataFrame({'date': datetime.today().strftime('%Y-%m-%d'),
71 'account_name': account_name,
72 'dec_staked_qty': dec_staked_qty,
73 'dec_staked_value': dec_staked_value}, index=[0])
76def process_land_transactions(transactions):
77 results = pd.DataFrame()
78 if transactions:
79 for transaction in transactions:
80 info = transaction['trx_info']
81 data = json.loads(info['data'])
83 process = True
84 if data['op'] == 'harvest_all':
85 temp = json.loads(info['result'])['result']
86 if temp['success']:
87 result = pd.DataFrame(temp['data']['results'])
88 else:
89 logging.info('Ignore false transaction...: ' + str(data['op']))
90 process = False
91 elif data['op'] in ['harvest_resources', 'mine_sps', 'mine_research']:
92 temp = json.loads(info['result'])['result']
93 if temp['success']:
94 result = pd.DataFrame(temp['data'])
95 else:
96 logging.info('Ignore false transaction...: ' + str(data['op']))
97 process = False
98 elif data['op'] == 'tax_collection':
99 temp = json.loads(info['result'])['result']
100 if temp['success']:
101 result = pd.DataFrame(temp['data'])
102 for token in result.tokens.values[0]:
103 result[token['token'] + '_received_tax'] = token['received']
104 result.drop('tokens', axis=1, inplace=True)
105 else:
106 logging.info('Ignore false transaction...: ' + str(data['op']))
107 process = False
108 else:
109 logging.info('Ignore land operation: ' + str(data['op']))
110 process = False
112 if process:
113 result['trx_id'] = info['id']
114 result['op'] = data['op']
115 result['region_uid'] = data['region_uid']
116 result['auto_buy_grain'] = data['auto_buy_grain']
117 result['created_date'] = info['created_date']
118 result['player'] = info['player']
119 result['created_date'] = info['created_date'] # spl created date
120 result['timestamp'] = transaction['timestamp'] # timestamp hive transaction
122 results = pd.concat([results, result], ignore_index=True)
124 results = results.reindex(sorted(results.columns), axis=1)
125 return results
128def get_land_operations(account_name, from_date):
129 progress_util.update_daily_msg('...retrieve land data for \'' + str(account_name) + '\'')
131 now = datetime.now()
132 land_transactions = hive.get_spl_transactions(account_name, from_date, till_date=now,
133 filter_spl_transactions=['sm_land_operation'])
135 progress_util.update_daily_msg('...processing land data for \'' + str(account_name) + '\'')
137 return process_land_transactions(land_transactions)
140def get_resources_value(account):
141 dec_value = spl.get_prices()['dec']
142 pools = spl.spl_get_pools()
143 total_value = 0
144 if not pools.empty:
145 for resource in pools.token_symbol.tolist():
146 pool = pools.loc[pools.token_symbol == resource].iloc[0]
147 qty = spl.get_owned_resource_sum(account, resource)
148 if qty:
149 value_dec = qty * pool.resource_price * LAND_SWAP_FEE
150 total_value += value_dec * dec_value
152 return pd.DataFrame({'date': [datetime.today().strftime('%Y-%m-%d')],
153 'account_name': [account],
154 'land_resources_value': [total_value]})
157def get_liquidity_pools_info(account):
158 pools = spl.spl_get_pools()
160 date = datetime.today().strftime('%Y-%m-%d')
161 dec_value = spl.get_prices()['dec']
163 data = [] # List to store each row of data before converting to DataFrame
165 if not pools.empty:
166 for resource in pools.token_symbol.tolist():
167 pool = pools.loc[pools.token_symbol == resource].iloc[0]
168 liq = spl.get_liquidity(account, resource)
169 token = 'DEC-' + resource
171 if not liq.empty and not liq.loc[liq.token == token].empty:
172 liq = liq.loc[liq.token == token].iloc[0]
173 my_shares = liq.balance
174 total_shares = float(pool.total_shares)
175 my_pct = (my_shares / total_shares) * 100
176 resource_qty = float(pool.resource_quantity) / 100 * my_pct
177 dec_qty = float(pool.dec_quantity) / 100 * my_pct
179 data.append({
180 'date': date,
181 'account_name': account,
182 'token': token,
183 'my_shares': my_shares,
184 'my_pct': my_pct,
185 'my_resource_quantity': resource_qty,
186 'my_dec_quantity': dec_qty,
187 'value': dec_qty * dec_value * 2,
188 'total_shares': float(pool.total_shares),
189 'resource_quantity': float(pool.resource_quantity),
190 'dec_quantity': float(pool.dec_quantity),
191 'resource_price': float(pool.resource_price),
192 'dec_price': float(pool.dec_price),
193 'dec_price_usd': dec_value,
194 })
196 return pd.DataFrame(data) # Convert list of dictionaries to DataFrame