ethereum.fork_criteria
Fork Criteria ^^^^^^^^^^^^^
.. contents:: Table of Contents :backlinks: none :local:
Introduction
Classes for specifying criteria for Mainnet forks.
1""" 2Fork Criteria 3^^^^^^^^^^^^^ 4 5.. contents:: Table of Contents 6 :backlinks: none 7 :local: 8 9Introduction 10------------ 11 12Classes for specifying criteria for Mainnet forks. 13""" 14 15import functools 16from abc import ABC, abstractmethod 17from typing import Final, Tuple 18 19 20@functools.total_ordering 21class ForkCriteria(ABC): 22 """ 23 Type that represents the condition required for a fork to occur. 24 """ 25 26 BLOCK_NUMBER: Final[int] = 0 27 TIMESTAMP: Final[int] = 1 28 UNSCHEDULED: Final[int] = 2 29 30 _internal: Tuple[int, int] 31 32 def __eq__(self, other: object) -> bool: 33 """ 34 Equality for fork criteria. 35 """ 36 if isinstance(other, ForkCriteria): 37 return self._internal == other._internal 38 return NotImplemented 39 40 def __lt__(self, other: object) -> bool: 41 """ 42 Ordering for fork criteria. Block number forks are before timestamp 43 forks and scheduled forks are before unscheduled forks. 44 """ 45 if isinstance(other, ForkCriteria): 46 return self._internal < other._internal 47 return NotImplemented 48 49 def __hash__(self) -> int: 50 """ 51 `ForkCriteria` is hashable, so it can be stored in dictionaries. 52 """ 53 return hash(self._internal) 54 55 @abstractmethod 56 def check(self, block_number: int, timestamp: int) -> bool: 57 """ 58 Check whether fork criteria have been met. 59 """ 60 ... 61 62 @abstractmethod 63 def __repr__(self) -> str: 64 """ 65 String representation of this object. 66 """ 67 raise NotImplementedError() 68 69 70class ByBlockNumber(ForkCriteria): 71 """ 72 Forks that occur when a specific block number has been reached. 73 """ 74 75 block_number: int 76 77 def __init__(self, block_number: int): 78 self._internal = (ForkCriteria.BLOCK_NUMBER, block_number) 79 self.block_number = block_number 80 81 def check(self, block_number: int, timestamp: int) -> bool: 82 """ 83 Check whether the block number has been reached. 84 """ 85 return block_number >= self.block_number 86 87 def __repr__(self) -> str: 88 """ 89 String representation of this object. 90 """ 91 return f"ByBlockNumber({self.block_number})" 92 93 94class ByTimestamp(ForkCriteria): 95 """ 96 Forks that occur when a specific timestamp has been reached. 97 """ 98 99 timestamp: int 100 101 def __init__(self, timestamp: int): 102 self._internal = (ForkCriteria.TIMESTAMP, timestamp) 103 self.timestamp = timestamp 104 105 def check(self, block_number: int, timestamp: int) -> bool: 106 """ 107 Check whether the timestamp has been reached. 108 """ 109 return timestamp >= self.timestamp 110 111 def __repr__(self) -> str: 112 """ 113 String representation of this object. 114 """ 115 return f"ByTimestamp({self.timestamp})" 116 117 118class Unscheduled(ForkCriteria): 119 """ 120 Forks that have not been scheduled. 121 """ 122 123 def __init__(self) -> None: 124 self._internal = (ForkCriteria.UNSCHEDULED, 0) 125 126 def check(self, block_number: int, timestamp: int) -> bool: 127 """ 128 Unscheduled forks never occur. 129 """ 130 return False 131 132 def __repr__(self) -> str: 133 """ 134 String representation of this object. 135 """ 136 return "Unscheduled()"
@functools.total_ordering
class
ForkCriteria21@functools.total_ordering 22class ForkCriteria(ABC): 23 """ 24 Type that represents the condition required for a fork to occur. 25 """ 26 27 BLOCK_NUMBER: Final[int] = 0 28 TIMESTAMP: Final[int] = 1 29 UNSCHEDULED: Final[int] = 2 30 31 _internal: Tuple[int, int] 32 33 def __eq__(self, other: object) -> bool: 34 """ 35 Equality for fork criteria. 36 """ 37 if isinstance(other, ForkCriteria): 38 return self._internal == other._internal 39 return NotImplemented 40 41 def __lt__(self, other: object) -> bool: 42 """ 43 Ordering for fork criteria. Block number forks are before timestamp 44 forks and scheduled forks are before unscheduled forks. 45 """ 46 if isinstance(other, ForkCriteria): 47 return self._internal < other._internal 48 return NotImplemented 49 50 def __hash__(self) -> int: 51 """ 52 `ForkCriteria` is hashable, so it can be stored in dictionaries. 53 """ 54 return hash(self._internal) 55 56 @abstractmethod 57 def check(self, block_number: int, timestamp: int) -> bool: 58 """ 59 Check whether fork criteria have been met. 60 """ 61 ... 62 63 @abstractmethod 64 def __repr__(self) -> str: 65 """ 66 String representation of this object. 67 """ 68 raise NotImplementedError()
Type that represents the condition required for a fork to occur.
71class ByBlockNumber(ForkCriteria): 72 """ 73 Forks that occur when a specific block number has been reached. 74 """ 75 76 block_number: int 77 78 def __init__(self, block_number: int): 79 self._internal = (ForkCriteria.BLOCK_NUMBER, block_number) 80 self.block_number = block_number 81 82 def check(self, block_number: int, timestamp: int) -> bool: 83 """ 84 Check whether the block number has been reached. 85 """ 86 return block_number >= self.block_number 87 88 def __repr__(self) -> str: 89 """ 90 String representation of this object. 91 """ 92 return f"ByBlockNumber({self.block_number})"
Forks that occur when a specific block number has been reached.
95class ByTimestamp(ForkCriteria): 96 """ 97 Forks that occur when a specific timestamp has been reached. 98 """ 99 100 timestamp: int 101 102 def __init__(self, timestamp: int): 103 self._internal = (ForkCriteria.TIMESTAMP, timestamp) 104 self.timestamp = timestamp 105 106 def check(self, block_number: int, timestamp: int) -> bool: 107 """ 108 Check whether the timestamp has been reached. 109 """ 110 return timestamp >= self.timestamp 111 112 def __repr__(self) -> str: 113 """ 114 String representation of this object. 115 """ 116 return f"ByTimestamp({self.timestamp})"
Forks that occur when a specific timestamp has been reached.
119class Unscheduled(ForkCriteria): 120 """ 121 Forks that have not been scheduled. 122 """ 123 124 def __init__(self) -> None: 125 self._internal = (ForkCriteria.UNSCHEDULED, 0) 126 127 def check(self, block_number: int, timestamp: int) -> bool: 128 """ 129 Unscheduled forks never occur. 130 """ 131 return False 132 133 def __repr__(self) -> str: 134 """ 135 String representation of this object. 136 """ 137 return "Unscheduled()"
Forks that have not been scheduled.