77import jwt
88from mythx_models import request as reqmodels
99from mythx_models import response as respmodels
10- from mythx_models .request .base import BaseRequest
11- from mythx_models .response .base import BaseResponse
12-
10+ from pythx .types import RESPONSE_MODELS , REQUEST_MODELS
1311from pythx .api .handler import APIHandler
1412from pythx .middleware import (
1513 AnalysisCacheMiddleware ,
@@ -52,7 +50,7 @@ def __init__(
5250 refresh_token : str = None ,
5351 handler : APIHandler = None ,
5452 no_cache : bool = False ,
55- middlewares : List [Type [ BaseMiddleware ] ] = None ,
53+ middlewares : List [BaseMiddleware ] = None ,
5654 api_url : str = None ,
5755 ):
5856 """Instantiate a new MythX API client.
@@ -101,11 +99,11 @@ class unless a custom instance has already been provided.
10199
102100 def _assemble_send_parse (
103101 self ,
104- req_obj : Type [ BaseRequest ] ,
105- resp_model : Type [BaseResponse ],
102+ req_obj : REQUEST_MODELS ,
103+ resp_model : Type [RESPONSE_MODELS ],
106104 assert_authentication : bool = True ,
107105 include_auth_header : bool = True ,
108- ) -> Type [ BaseResponse ] :
106+ ) -> RESPONSE_MODELS :
109107 """Assemble the request, send it, parse and return the response.
110108
111109 This method takes a request model instance and:
@@ -189,13 +187,13 @@ def login(self) -> respmodels.AuthLoginResponse:
189187 :return: :code:`AuthLoginResponse`
190188 """
191189 req = reqmodels .AuthLoginRequest (username = self .username , password = self .password )
192- resp_model = self ._assemble_send_parse (
190+ resp_model : respmodels . AuthLoginResponse = self ._assemble_send_parse (
193191 req ,
194192 respmodels .AuthLoginResponse ,
195193 assert_authentication = False ,
196194 include_auth_header = False ,
197195 )
198- self .api_key = resp_model .api_key
196+ self .api_key = resp_model .access_token
199197 self .refresh_token = resp_model .refresh_token
200198 return resp_model
201199
@@ -204,7 +202,7 @@ def logout(self) -> respmodels.AuthLogoutResponse:
204202
205203 :return: :code:`AuthLogoutResponse`
206204 """
207- req = reqmodels .AuthLogoutRequest ()
205+ req = reqmodels .AuthLogoutRequest (** { "global" : True } )
208206 resp_model = self ._assemble_send_parse (req , respmodels .AuthLogoutResponse )
209207 self .api_key = None
210208 self .refresh_token = None
@@ -218,7 +216,7 @@ def refresh(self) -> respmodels.AuthRefreshResponse:
218216 req = reqmodels .AuthRefreshRequest (
219217 access_token = self .api_key , refresh_token = self .refresh_token
220218 )
221- resp_model = self ._assemble_send_parse (
219+ resp_model : respmodels . AuthRefreshResponse = self ._assemble_send_parse (
222220 req ,
223221 respmodels .AuthRefreshResponse ,
224222 assert_authentication = False ,
@@ -228,6 +226,76 @@ def refresh(self) -> respmodels.AuthRefreshResponse:
228226 self .refresh_token = resp_model .refresh_token
229227 return resp_model
230228
229+ def project_list (
230+ self , offset : int = None , limit : int = None , name : str = ""
231+ ) -> respmodels .ProjectListResponse :
232+ """List the existing projects on the platform
233+
234+ :param offset: The number of projects to skip (optional)
235+ :param limit: The number of projects to return (optional)
236+ :param name: The name to filter projects by (optional)
237+ :return:
238+ """
239+ req = reqmodels .ProjectListRequest (
240+ offset = offset ,
241+ limit = limit ,
242+ name = name ,
243+ )
244+ return self ._assemble_send_parse (req , respmodels .ProjectListResponse )
245+
246+ def project_status (self , project_id : str = "" ) -> respmodels .ProjectStatusResponse :
247+ """Get detailed information for a project.
248+
249+ :param project_id: The project's ID
250+ :return: :code:`ProjectStatusResponse`
251+ """
252+ req = reqmodels .ProjectStatusRequest (project_id = project_id )
253+ return self ._assemble_send_parse (req , respmodels .ProjectStatusResponse )
254+
255+ def delete_project (
256+ self , project_id : str = ""
257+ ) -> respmodels .ProjectDeletionResponse :
258+ """Delete an existing project.
259+
260+ :param project_id: The project's ID
261+ :return: :code:`ProjectDeletionResponse`
262+ """
263+ req = reqmodels .ProjectDeleteRequest (project_id = project_id )
264+ return self ._assemble_send_parse (req , respmodels .ProjectDeletionResponse )
265+
266+ def create_project (
267+ self , name : str = "" , description : str = "" , groups : List [str ] = None
268+ ) -> respmodels .ProjectCreationResponse :
269+ """Create a new project.
270+
271+ :param name: The project name
272+ :param description: The project description
273+ :param groups: List of group IDs belonging to the project (optional)
274+ :return: :code:`ProjectCreationResponse`
275+ """
276+ req = reqmodels .ProjectCreationRequest (
277+ name = name , description = description , groups = groups or []
278+ )
279+ return self ._assemble_send_parse (req , respmodels .ProjectCreationResponse )
280+
281+ def update_project (
282+ self , project_id : str = "" , name : str = "" , description : str = ""
283+ ) -> respmodels .ProjectUpdateResponse :
284+ """Update an existing project.
285+
286+ A new name, a new description, or both should be given.
287+
288+ :param project_id: The ID of the project to update
289+ :param name: The new project name (optional)
290+ :param description: The new project description (optional)
291+ :return: :code:`ProjectUpdateResponse`
292+ """
293+
294+ req = reqmodels .ProjectUpdateRequest (
295+ project_id = project_id , name = name , description = description
296+ )
297+ return self ._assemble_send_parse (req , respmodels .ProjectUpdateResponse )
298+
231299 def group_list (
232300 self ,
233301 offset : int = None ,
@@ -288,13 +356,13 @@ def analysis_list(
288356
289357 def analyze (
290358 self ,
291- contract_name : str = None ,
292359 bytecode : str = None ,
360+ main_source : str = None ,
361+ sources : Dict [str , Dict [str , str ]] = None ,
362+ contract_name : str = None ,
293363 source_map : str = None ,
294364 deployed_bytecode : str = None ,
295365 deployed_source_map : str = None ,
296- main_source : str = None ,
297- sources : Dict [str , Dict [str , str ]] = None ,
298366 source_list : List [str ] = None ,
299367 solc_version : str = None ,
300368 analysis_mode : str = "quick" ,
@@ -330,7 +398,6 @@ def analyze(
330398 solc_version = solc_version ,
331399 analysis_mode = analysis_mode ,
332400 )
333- # req.validate()
334401 return self ._assemble_send_parse (req , respmodels .AnalysisSubmissionResponse )
335402
336403 def group_status (self , group_id : str ) -> respmodels .GroupStatusResponse :
@@ -342,14 +409,13 @@ def group_status(self, group_id: str) -> respmodels.GroupStatusResponse:
342409 req = reqmodels .GroupStatusRequest (group_id = group_id )
343410 return self ._assemble_send_parse (req , respmodels .GroupStatusResponse )
344411
345- def status (self , uuid : str ) -> respmodels .AnalysisStatusResponse :
412+ def analysis_status (self , uuid : str ) -> respmodels .AnalysisStatusResponse :
346413 """Get the status of an analysis job based on its UUID.
347414
348415 :param uuid: The job's UUID
349416 :return: :code:`AnalysisStatusResponse`
350417 """
351- # TODO: rename to analysis_status
352- req = reqmodels .AnalysisStatusRequest (uuid )
418+ req = reqmodels .AnalysisStatusRequest (uuid = uuid )
353419 return self ._assemble_send_parse (req , respmodels .AnalysisStatusResponse )
354420
355421 def analysis_ready (self , uuid : str ) -> bool :
@@ -359,10 +425,10 @@ def analysis_ready(self, uuid: str) -> bool:
359425 :param uuid: The analysis job UUID
360426 :return: bool indicating whether the analysis has finished
361427 """
362- resp = self .status (uuid )
428+ resp = self .analysis_status (uuid )
363429 return (
364- resp .analysis . status == respmodels .AnalysisStatus .FINISHED
365- or resp .analysis . status == respmodels .AnalysisStatus .ERROR
430+ resp .status == respmodels .AnalysisStatus .FINISHED
431+ or resp .status == respmodels .AnalysisStatus .ERROR
366432 )
367433
368434 def report (self , uuid : str ) -> respmodels .DetectedIssuesResponse :
@@ -372,7 +438,7 @@ def report(self, uuid: str) -> respmodels.DetectedIssuesResponse:
372438 :param uuid: The analysis job UUID
373439 :return: :code:`DetectedIssuesResponse`
374440 """
375- req = reqmodels .DetectedIssuesRequest (uuid )
441+ req = reqmodels .DetectedIssuesRequest (uuid = uuid )
376442 return self ._assemble_send_parse (req , respmodels .DetectedIssuesResponse )
377443
378444 def request_by_uuid (self , uuid : str ) -> respmodels .AnalysisInputResponse :
@@ -381,7 +447,7 @@ def request_by_uuid(self, uuid: str) -> respmodels.AnalysisInputResponse:
381447 :param uuid: The analysis job UUID
382448 :return: :code:`AnalysisInputResponse`
383449 """
384- req = reqmodels .AnalysisInputRequest (uuid )
450+ req = reqmodels .AnalysisInputRequest (uuid = uuid )
385451 return self ._assemble_send_parse (req , respmodels .AnalysisInputResponse )
386452
387453 def create_group (self , group_name : str = "" ) -> respmodels .GroupCreationResponse :
@@ -404,20 +470,6 @@ def seal_group(self, group_id: str) -> respmodels.GroupOperationResponse:
404470 req = reqmodels .GroupOperationRequest (group_id = group_id , type_ = "seal_group" )
405471 return self ._assemble_send_parse (req , respmodels .GroupOperationResponse )
406472
407- def openapi (self , mode : str = "yaml" ) -> respmodels .OASResponse :
408- """Return the OpenAPI specification either in HTML or YAML.
409-
410- :param mode: "yaml" or "html"
411- :return: :code:`OASResponse`
412- """
413- req = reqmodels .OASRequest (mode = mode )
414- return self ._assemble_send_parse (
415- req ,
416- respmodels .OASResponse ,
417- assert_authentication = False ,
418- include_auth_header = False ,
419- )
420-
421473 def version (self ) -> respmodels .VersionResponse :
422474 """Call the APIs version endpoint to get its backend version numbers.
423475
0 commit comments