Coverage for src / utils / land_util.py: 0%

126 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-03-01 10:28 +0000

1import json 

2import logging 

3from datetime import datetime 

4 

5import pandas as pd 

6 

7from src.api import spl, hive 

8from src.static.static_values_enum import LAND_SWAP_FEE 

9from src.utils import progress_util 

10 

11 

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] == "")] 

19 

20 

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 

46 

47 deeds_total += listing_price 

48 

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]) 

54 

55 

56def get_staked_dec_value(account_name): 

57 dec_staked_value = 0 

58 dec_staked_qty = 0 

59 

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']) 

65 

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) 

69 

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]) 

74 

75 

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']) 

82 

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 

111 

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 

121 

122 results = pd.concat([results, result], ignore_index=True) 

123 

124 results = results.reindex(sorted(results.columns), axis=1) 

125 return results 

126 

127 

128def get_land_operations(account_name, from_date): 

129 progress_util.update_daily_msg('...retrieve land data for \'' + str(account_name) + '\'') 

130 

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']) 

134 

135 progress_util.update_daily_msg('...processing land data for \'' + str(account_name) + '\'') 

136 

137 return process_land_transactions(land_transactions) 

138 

139 

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 

151 

152 return pd.DataFrame({'date': [datetime.today().strftime('%Y-%m-%d')], 

153 'account_name': [account], 

154 'land_resources_value': [total_value]}) 

155 

156 

157def get_liquidity_pools_info(account): 

158 pools = spl.spl_get_pools() 

159 

160 date = datetime.today().strftime('%Y-%m-%d') 

161 dec_value = spl.get_prices()['dec'] 

162 

163 data = [] # List to store each row of data before converting to DataFrame 

164 

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 

170 

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 

178 

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 }) 

195 

196 return pd.DataFrame(data) # Convert list of dictionaries to DataFrame