-
Notifications
You must be signed in to change notification settings - Fork 42
Expand file tree
/
Copy pathroutes.py
More file actions
155 lines (124 loc) · 5.05 KB
/
Copy pathroutes.py
File metadata and controls
155 lines (124 loc) · 5.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
from datetime import datetime
import flask
from flask_restx import Resource
from api.app.cache import cache
from common.utils.format_utils import format_to_dict
from indexer.modules.custom.address_index import address_profile_namespace
from indexer.modules.custom.address_index.schemas.api import (
aci_score_response_model,
address_base_info_model,
address_base_info_response_model,
address_developer_info_response_model,
validate_eth_address,
)
from indexer.modules.custom.address_index.utils.helpers import (
get_address_assets,
get_address_base_info,
get_address_developer_info,
get_all_udf_dashboards,
get_all_udf_dashboards_data,
get_contract_deployed_events,
get_contract_deployer_profile,
get_daily_active_address,
get_wallet_address_volumes,
)
from indexer.modules.custom.address_index.utils.score import calculate_aci_score
PAGE_SIZE = 10
MAX_TRANSACTION = 500000
MAX_TRANSACTION_WITH_CONDITION = 10000
MAX_INTERNAL_TRANSACTION = 10000
MAX_TOKEN_TRANSFER = 10000
@address_profile_namespace.route("/v1/aci/<address>/base_info")
class ACIProfiles(Resource):
@validate_eth_address
@address_profile_namespace.marshal_with(address_base_info_response_model)
@cache.cached(timeout=60)
def get(self, address):
profile = get_address_base_info(address) | {"address": address.lower()}
return {"code": 200, "message": "OK", "data": profile}
@address_profile_namespace.route("/v1/aci/<address>/developer_info")
class ACIDeveloperProfiles(Resource):
@validate_eth_address
@address_profile_namespace.marshal_with(address_developer_info_response_model)
@cache.cached(timeout=60)
def get(self, address):
profile = get_address_developer_info(address) | {"address": address.lower()}
if profile.get("first_contract_deployed_block_timestamp"):
delta = datetime.utcnow() - profile["first_contract_deployed_block_timestamp"]
years = delta.days / 365
profile["years_since_first_contract"] = round(years, 1)
else:
profile["years_since_first_contract"] = 0.0
return {"code": 200, "message": "OK", "data": profile}
@address_profile_namespace.route("/v1/aci/<address>/profile")
class ACIProfiles(Resource):
@validate_eth_address
@address_profile_namespace.marshal_with(aci_score_response_model)
@cache.cached(timeout=60)
def get(self, address):
# 1. Check transaction count
# 2. Calculate total gas spent
# 3. Get first transaction timestamp
profile = get_address_base_info(address)
# 4. Calculate TVL
assets = get_address_assets(address)
# 5. Calculate Volume
volumes = get_wallet_address_volumes(address)
score = calculate_aci_score(profile, assets, volumes)
res = {
"score": score,
"base_info": profile,
"assets": assets,
"volumes": volumes,
}
res = format_to_dict(res)
return {"code": 200, "message": "OK", "data": res}
@address_profile_namespace.route("/v1/aci/<address>/assets")
class ACIAssets(Resource):
@validate_eth_address
def get(self, address):
asset = get_address_assets(address)
return {
"code": 200,
"message": "OK",
"data": asset,
}
@address_profile_namespace.route("/v1/aci/<address>/contract_deployer/profile")
class ACIContractDeployerProfile(Resource):
@validate_eth_address
def get(self, address):
return get_contract_deployer_profile(address) or {"deployed_countract_count": 0, "first_deployed_time": None}
@address_profile_namespace.route("/v1/aci/<address>/contract_deployer/events")
class ACIContractDeployerEvents(Resource):
@validate_eth_address
def get(self, address):
page_index = int(flask.request.args.get("page", 1))
page_size = int(flask.request.args.get("size", PAGE_SIZE))
limit = page_size
offset = (page_index - 1) * page_size
return (get_contract_deployed_events(address, limit=limit, offset=offset) or {"data": [], "total": 0}) | {
"size": page_size,
"page": page_index,
}
@address_profile_namespace.route("/v1/aci/<address>/volumes")
class ACIVolumes(Resource):
@validate_eth_address
@cache.cached(timeout=360, query_string=True)
def get(self, address):
address_bytes = bytes.fromhex(address[2:])
@address_profile_namespace.route("/v1/aci/udf_dashboards")
class UDFDashboards(Resource):
# @cache.cached(timeout=360, query_string=True)
def get(self):
return get_all_udf_dashboards()
@address_profile_namespace.route("/v1/aci/udf_dashboards_data")
class UDFDashboards(Resource):
@cache.cached(timeout=10, query_string=True)
def get(self):
return get_all_udf_dashboards_data()
@address_profile_namespace.route("/v1/aci/daily_active_address")
class DailyAddress(Resource):
@cache.cached(timeout=10, query_string=True)
def get(self):
time_range = flask.request.args.get("time_range", "7d")
return get_daily_active_address(time_range)