-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtransaction.py
85 lines (72 loc) · 2.26 KB
/
transaction.py
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
from typing import List, Optional
from pydantic import AliasChoices, BaseModel, Field, field_validator
from sentinel.utils.models import scientific_notation_to_int
class Block(BaseModel):
"""
EVM Based Transaction Block
"""
hash: str
number: int
timestamp: int
parent_hash: str
nonce: str
sha3_uncles: str
logs_bloom: str
transactions_root: str
state_root: str
receipts_root: str
miner: str
difficulty: int
total_difficulty: Optional[int] = None
size: int
extra_data: str
gas_limit: int
gas_used: int
base_fee_per_gas: Optional[int] = None
transaction_count: int
@field_validator("total_difficulty", mode="before")
def validate_total_difficulty(cls, value):
return scientific_notation_to_int(value)
class LogEntry(BaseModel):
"""
Log Entry
"""
index: int
address: str
data: str
topics: List[str] = Field(default_factory=list)
class Transaction(BaseModel):
"""
EVM based Transaction
"""
hash: str
nonce: int
block: Block
transaction_index: int
from_address: Optional[str] = None
to_address: Optional[str] = None
value: int
gas: int
gas_price: int
gas_used: int = Field(validation_alias=AliasChoices("receipt_gas_used", "gas_used"))
effective_gas_price: Optional[int] = Field(
validation_alias=AliasChoices("receipt_effective_gas_price", "effective_gas_price"), default=None
)
max_fee_per_gas: Optional[int] = None
max_priority_fee_per_gas: Optional[int] = None
cumulative_gas_used: int = Field(
validation_alias=AliasChoices("receipt_cumulative_gas_used", "cumulative_gas_used")
)
input: str
contract_address: Optional[str] = Field(
validation_alias=AliasChoices("receipt_contract_address", "contract_address"), default=None
)
root: Optional[str] = Field(validation_alias=AliasChoices("receipt_root", "root"))
status: int = Field(validation_alias=AliasChoices("receipt_status", "status"))
transaction_type: Optional[int] = None
logs: List[LogEntry]
attack_probablity: float = 0.0
# TODO remove outdated fields after tests fix
# type: Optional[str] = None
# item_id: Optional[str] = None
# item_timestamp: Optional[str] = None