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
mod chains;
mod forward_request;
mod project;
mod trustblock_contracts;

pub use chains::Chains;
pub use forward_request::ForwardRequest;

pub use trustblock_contracts::TrustblockForwarder;

pub use project::Project;

use clap::ValueEnum;
use ethers::abi::Address;

use ethers::types::Bytes;

use serde::{ Deserialize, Serialize };

use strum::EnumIter;

use validator::Validate;

use std::convert::From;

#[derive(Clone, Copy, Debug, Deserialize, EnumIter, ValueEnum, Hash, Eq, PartialEq, Serialize)]
pub enum Tag {
    #[serde(rename = "TOKEN")]
    Token,
    #[serde(rename = "FINANCE")]
    Finance,
    #[serde(rename = "COLLECTIBLES")]
    Collectibles,
    #[serde(rename = "GAMING")]
    Gaming,
    #[serde(rename = "GOVERNANCE")]
    Governance,
    #[serde(rename = "SOCIAL")]
    Social,
    #[serde(rename = "OTHER")]
    Other,
}

#[derive(Clone, Copy, Debug, Deserialize, EnumIter, ValueEnum, Hash, Eq, PartialEq, Serialize)]
pub enum Status {
    #[serde(rename = "FIXED")]
    Fixed,
    #[serde(rename = "NOT_APPLICABLE")]
    NotApplicable,
    #[serde(rename = "RISK_ACCEPTED")]
    RiskAccepted,
}

#[derive(Clone, Copy, Debug, Deserialize, EnumIter, ValueEnum, Hash, Eq, PartialEq, Serialize)]
pub enum SeverityType {
    #[serde(rename = "LOW")]
    Low,
    #[serde(rename = "MEDIUM")]
    Medium,
    #[serde(rename = "HIGH")]
    High,
    #[serde(rename = "CRITICAL")]
    Critical,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebhookRequest {
    pub request: ForwardRequest,
    #[serde(rename = "domainSeparator")]
    pub domain_separator: Bytes,
    #[serde(rename = "requestTypeHash")]
    pub request_type_hash: Bytes,
    #[serde(rename = "suffixData")]
    pub suffix_data: Bytes,
    pub signature: Bytes,
    pub chain: String,
}

#[derive(Debug, Clone, Validate, Serialize, Deserialize)]
pub struct Contact {
    #[validate(email)]
    pub email: Option<String>,
}

#[derive(Debug, Clone, Serialize, Validate, Deserialize)]
pub struct Audit {
    #[serde(skip_deserializing)]
    pub chains: Vec<Chains>,
    pub issues: Vec<Issue>,
    pub tags: Vec<Tag>,
    pub contracts: Vec<AuditContract>,
    pub description: Description,
    pub name: String,
    #[serde(rename = "reportHash", skip_deserializing)]
    pub report_hash: String,
    #[validate(url)]
    #[serde(rename = "reportFileUrl", skip_deserializing)]
    pub report_file_url: String,
    #[serde(rename = "projectId", skip_deserializing)]
    pub project_id: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditContract {
    pub chain: Chains,
    #[serde(rename = "evmAddress")]
    pub evm_address: Address,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct The0 {}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Description {
    pub summary: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Issue {
    pub status: Status,
    pub severity: SeverityType,
    pub name: String,
    pub description: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ReportFile {
    #[serde(rename = "0")]
    pub the_0: The0,
}

#[derive(Debug, Clone, Validate, Serialize, Deserialize)]
pub struct Links {
    #[validate(url)]
    pub twitter: Option<String>,
    #[validate(url)]
    pub github: Option<String>,
    #[validate(url)]
    pub website: Option<String>,
}