|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +import logging |
| 4 | +from typing import TYPE_CHECKING, ClassVar, Optional, cast |
| 5 | + |
| 6 | +if TYPE_CHECKING: |
| 7 | + from chia.server.api_protocol import ApiProtocol |
| 8 | + |
| 9 | +# Minimal imports to avoid circular dependencies |
| 10 | +from chia.protocols import farmer_protocol, full_node_protocol, introducer_protocol, timelord_protocol, wallet_protocol |
| 11 | +from chia.protocols.outbound_message import Message |
| 12 | +from chia.protocols.protocol_message_types import ProtocolMessageTypes |
| 13 | +from chia.server.api_protocol import ApiMetadata |
| 14 | +from chia.server.ws_connection import WSChiaConnection |
| 15 | + |
| 16 | + |
| 17 | +class FullNodeApiStub: |
| 18 | + """Lightweight API stub for FullNodeAPI to break circular dependencies.""" |
| 19 | + |
| 20 | + if TYPE_CHECKING: |
| 21 | + _protocol_check: ClassVar[ApiProtocol] = cast("FullNodeApiStub", None) |
| 22 | + |
| 23 | + log: logging.Logger |
| 24 | + metadata: ClassVar[ApiMetadata] = ApiMetadata() |
| 25 | + |
| 26 | + def ready(self) -> bool: |
| 27 | + """Check if the full node is ready.""" |
| 28 | + return True |
| 29 | + |
| 30 | + @metadata.request(peer_required=True, reply_types=[ProtocolMessageTypes.respond_peers]) |
| 31 | + async def request_peers( |
| 32 | + self, _request: full_node_protocol.RequestPeers, peer: WSChiaConnection |
| 33 | + ) -> Optional[Message]: |
| 34 | + """Handle peer request.""" |
| 35 | + return None |
| 36 | + |
| 37 | + @metadata.request(peer_required=True) |
| 38 | + async def respond_peers( |
| 39 | + self, request: full_node_protocol.RespondPeers, peer: WSChiaConnection |
| 40 | + ) -> None: |
| 41 | + """Handle peer response.""" |
| 42 | + |
| 43 | + @metadata.request(peer_required=True) |
| 44 | + async def respond_peers_introducer( |
| 45 | + self, request: introducer_protocol.RespondPeersIntroducer, peer: WSChiaConnection |
| 46 | + ) -> None: |
| 47 | + """Handle introducer peer response.""" |
| 48 | + |
| 49 | + @metadata.request(peer_required=True, execute_task=True) |
| 50 | + async def new_peak(self, request: full_node_protocol.NewPeak, peer: WSChiaConnection) -> None: |
| 51 | + """Handle new peak.""" |
| 52 | + |
| 53 | + @metadata.request(peer_required=True) |
| 54 | + async def new_transaction( |
| 55 | + self, transaction: full_node_protocol.NewTransaction, peer: WSChiaConnection |
| 56 | + ) -> None: |
| 57 | + """Handle new transaction.""" |
| 58 | + |
| 59 | + @metadata.request(reply_types=[ProtocolMessageTypes.respond_transaction]) |
| 60 | + async def request_transaction(self, request: full_node_protocol.RequestTransaction) -> Optional[Message]: |
| 61 | + """Handle transaction request.""" |
| 62 | + return None |
| 63 | + |
| 64 | + @metadata.request(peer_required=True, bytes_required=True) |
| 65 | + async def respond_transaction( |
| 66 | + self, |
| 67 | + response: full_node_protocol.RespondTransaction, |
| 68 | + peer: WSChiaConnection, |
| 69 | + tx_bytes: bytes = b"", |
| 70 | + ) -> None: |
| 71 | + """Handle transaction response.""" |
| 72 | + |
| 73 | + @metadata.request(reply_types=[ProtocolMessageTypes.respond_proof_of_weight]) |
| 74 | + async def request_proof_of_weight(self, request: full_node_protocol.RequestProofOfWeight) -> Optional[Message]: |
| 75 | + """Handle proof of weight request.""" |
| 76 | + return None |
| 77 | + |
| 78 | + @metadata.request() |
| 79 | + async def respond_proof_of_weight(self, request: full_node_protocol.RespondProofOfWeight) -> Optional[Message]: |
| 80 | + """Handle proof of weight response.""" |
| 81 | + return None |
| 82 | + |
| 83 | + @metadata.request(reply_types=[ProtocolMessageTypes.respond_block, ProtocolMessageTypes.reject_block]) |
| 84 | + async def request_block(self, request: full_node_protocol.RequestBlock) -> Optional[Message]: |
| 85 | + """Handle block request.""" |
| 86 | + return None |
| 87 | + |
| 88 | + @metadata.request(reply_types=[ProtocolMessageTypes.respond_blocks, ProtocolMessageTypes.reject_blocks]) |
| 89 | + async def request_blocks(self, request: full_node_protocol.RequestBlocks) -> Optional[Message]: |
| 90 | + """Handle blocks request.""" |
| 91 | + return None |
| 92 | + |
| 93 | + @metadata.request(peer_required=True) |
| 94 | + async def reject_block( |
| 95 | + self, |
| 96 | + reject_block: full_node_protocol.RejectBlock, |
| 97 | + peer: WSChiaConnection, |
| 98 | + ) -> None: |
| 99 | + """Handle block rejection.""" |
| 100 | + |
| 101 | + @metadata.request(peer_required=True) |
| 102 | + async def reject_blocks( |
| 103 | + self, |
| 104 | + reject_blocks_request: full_node_protocol.RejectBlocks, |
| 105 | + peer: WSChiaConnection, |
| 106 | + ) -> None: |
| 107 | + """Handle blocks rejection.""" |
| 108 | + |
| 109 | + @metadata.request(peer_required=True) |
| 110 | + async def respond_blocks( |
| 111 | + self, |
| 112 | + request: full_node_protocol.RespondBlocks, |
| 113 | + peer: WSChiaConnection, |
| 114 | + ) -> None: |
| 115 | + """Handle blocks response.""" |
| 116 | + |
| 117 | + @metadata.request(peer_required=True) |
| 118 | + async def respond_block( |
| 119 | + self, |
| 120 | + request: full_node_protocol.RespondBlock, |
| 121 | + peer: WSChiaConnection, |
| 122 | + ) -> None: |
| 123 | + """Handle block response.""" |
| 124 | + |
| 125 | + @metadata.request() |
| 126 | + async def new_unfinished_block( |
| 127 | + self, new_unfinished_block: full_node_protocol.NewUnfinishedBlock |
| 128 | + ) -> Optional[Message]: |
| 129 | + """Handle new unfinished block.""" |
| 130 | + return None |
| 131 | + |
| 132 | + @metadata.request(reply_types=[ProtocolMessageTypes.respond_unfinished_block]) |
| 133 | + async def request_unfinished_block( |
| 134 | + self, request_unfinished_block: full_node_protocol.RequestUnfinishedBlock |
| 135 | + ) -> Optional[Message]: |
| 136 | + """Handle unfinished block request.""" |
| 137 | + return None |
| 138 | + |
| 139 | + @metadata.request() |
| 140 | + async def new_unfinished_block2( |
| 141 | + self, new_unfinished_block: full_node_protocol.NewUnfinishedBlock2 |
| 142 | + ) -> Optional[Message]: |
| 143 | + """Handle new unfinished block v2.""" |
| 144 | + return None |
| 145 | + |
| 146 | + @metadata.request(reply_types=[ProtocolMessageTypes.respond_unfinished_block]) |
| 147 | + async def request_unfinished_block2( |
| 148 | + self, request_unfinished_block: full_node_protocol.RequestUnfinishedBlock2 |
| 149 | + ) -> Optional[Message]: |
| 150 | + """Handle unfinished block request v2.""" |
| 151 | + return None |
| 152 | + |
| 153 | + @metadata.request(peer_required=True) |
| 154 | + async def respond_unfinished_block( |
| 155 | + self, |
| 156 | + respond_unfinished_block: full_node_protocol.RespondUnfinishedBlock, |
| 157 | + peer: WSChiaConnection, |
| 158 | + ) -> None: |
| 159 | + """Handle unfinished block response.""" |
| 160 | + |
| 161 | + @metadata.request(peer_required=True) |
| 162 | + async def new_signage_point_or_end_of_sub_slot( |
| 163 | + self, new_sp: full_node_protocol.NewSignagePointOrEndOfSubSlot, peer: WSChiaConnection |
| 164 | + ) -> Optional[Message]: |
| 165 | + """Handle new signage point or end of sub slot.""" |
| 166 | + return None |
| 167 | + |
| 168 | + @metadata.request( |
| 169 | + reply_types=[ProtocolMessageTypes.respond_signage_point, ProtocolMessageTypes.respond_end_of_sub_slot] |
| 170 | + ) |
| 171 | + async def request_signage_point_or_end_of_sub_slot( |
| 172 | + self, request: full_node_protocol.RequestSignagePointOrEndOfSubSlot |
| 173 | + ) -> Optional[Message]: |
| 174 | + """Handle signage point or end of sub slot request.""" |
| 175 | + return None |
| 176 | + |
| 177 | + @metadata.request(peer_required=True) |
| 178 | + async def respond_signage_point( |
| 179 | + self, request: full_node_protocol.RespondSignagePoint, peer: WSChiaConnection |
| 180 | + ) -> None: |
| 181 | + """Handle signage point response.""" |
| 182 | + |
| 183 | + @metadata.request(peer_required=True) |
| 184 | + async def respond_end_of_sub_slot( |
| 185 | + self, request: full_node_protocol.RespondEndOfSubSlot, peer: WSChiaConnection |
| 186 | + ) -> Optional[Message]: |
| 187 | + """Handle end of sub slot response.""" |
| 188 | + return None |
| 189 | + |
| 190 | + @metadata.request(peer_required=True) |
| 191 | + async def request_mempool_transactions( |
| 192 | + self, |
| 193 | + request: full_node_protocol.RequestMempoolTransactions, |
| 194 | + peer: WSChiaConnection, |
| 195 | + ) -> None: |
| 196 | + """Handle mempool transactions request.""" |
| 197 | + |
| 198 | + @metadata.request(peer_required=True) |
| 199 | + async def declare_proof_of_space( |
| 200 | + self, request: farmer_protocol.DeclareProofOfSpace, peer: WSChiaConnection |
| 201 | + ) -> None: |
| 202 | + """Handle proof of space declaration.""" |
| 203 | + |
| 204 | + @metadata.request(peer_required=True) |
| 205 | + async def signed_values( |
| 206 | + self, farmer_request: farmer_protocol.SignedValues, peer: WSChiaConnection |
| 207 | + ) -> None: |
| 208 | + """Handle signed values.""" |
| 209 | + |
| 210 | + @metadata.request(peer_required=True) |
| 211 | + async def new_infusion_point_vdf( |
| 212 | + self, request: timelord_protocol.NewInfusionPointVDF, peer: WSChiaConnection |
| 213 | + ) -> None: |
| 214 | + """Handle new infusion point VDF.""" |
| 215 | + |
| 216 | + @metadata.request(peer_required=True) |
| 217 | + async def new_signage_point_vdf( |
| 218 | + self, request: timelord_protocol.NewSignagePointVDF, peer: WSChiaConnection |
| 219 | + ) -> None: |
| 220 | + """Handle new signage point VDF.""" |
| 221 | + |
| 222 | + @metadata.request(peer_required=True) |
| 223 | + async def new_end_of_sub_slot_vdf( |
| 224 | + self, request: timelord_protocol.NewEndOfSubSlotVDF, peer: WSChiaConnection |
| 225 | + ) -> Optional[Message]: |
| 226 | + """Handle new end of sub slot VDF.""" |
| 227 | + return None |
| 228 | + |
| 229 | + @metadata.request() |
| 230 | + async def request_block_header(self, request: wallet_protocol.RequestBlockHeader) -> Optional[Message]: |
| 231 | + """Handle block header request.""" |
| 232 | + return None |
| 233 | + |
| 234 | + @metadata.request() |
| 235 | + async def request_additions(self, request: wallet_protocol.RequestAdditions) -> Optional[Message]: |
| 236 | + """Handle additions request.""" |
| 237 | + return None |
| 238 | + |
| 239 | + @metadata.request() |
| 240 | + async def request_removals(self, request: wallet_protocol.RequestRemovals) -> Optional[Message]: |
| 241 | + """Handle removals request.""" |
| 242 | + return None |
| 243 | + |
| 244 | + @metadata.request() |
| 245 | + async def send_transaction( |
| 246 | + self, request: wallet_protocol.SendTransaction, *, test: bool = False |
| 247 | + ) -> Optional[Message]: |
| 248 | + """Handle send transaction.""" |
| 249 | + return None |
| 250 | + |
| 251 | + @metadata.request() |
| 252 | + async def request_puzzle_solution(self, request: wallet_protocol.RequestPuzzleSolution) -> Optional[Message]: |
| 253 | + """Handle puzzle solution request.""" |
| 254 | + return None |
| 255 | + |
| 256 | + @metadata.request() |
| 257 | + async def request_block_headers(self, request: wallet_protocol.RequestBlockHeaders) -> Optional[Message]: |
| 258 | + """Handle block headers request.""" |
| 259 | + return None |
| 260 | + |
| 261 | + @metadata.request() |
| 262 | + async def request_header_blocks(self, request: wallet_protocol.RequestHeaderBlocks) -> Optional[Message]: |
| 263 | + """Handle header blocks request (deprecated).""" |
| 264 | + return None |
| 265 | + |
| 266 | + @metadata.request(bytes_required=True, execute_task=True) |
| 267 | + async def respond_compact_proof_of_time( |
| 268 | + self, request: timelord_protocol.RespondCompactProofOfTime, request_bytes: bytes = b"" |
| 269 | + ) -> None: |
| 270 | + """Handle compact proof of time response.""" |
| 271 | + |
| 272 | + @metadata.request(peer_required=True, bytes_required=True, execute_task=True) |
| 273 | + async def new_compact_vdf( |
| 274 | + self, request: full_node_protocol.NewCompactVDF, peer: WSChiaConnection, request_bytes: bytes = b"" |
| 275 | + ) -> None: |
| 276 | + """Handle new compact VDF.""" |
| 277 | + |
| 278 | + @metadata.request(peer_required=True, reply_types=[ProtocolMessageTypes.respond_compact_vdf]) |
| 279 | + async def request_compact_vdf(self, request: full_node_protocol.RequestCompactVDF, peer: WSChiaConnection) -> None: |
| 280 | + """Handle compact VDF request.""" |
| 281 | + |
| 282 | + @metadata.request(peer_required=True) |
| 283 | + async def respond_compact_vdf(self, request: full_node_protocol.RespondCompactVDF, peer: WSChiaConnection) -> None: |
| 284 | + """Handle compact VDF response.""" |
| 285 | + |
| 286 | + @metadata.request(peer_required=True) |
| 287 | + async def register_for_ph_updates( |
| 288 | + self, request: wallet_protocol.RegisterForPhUpdates, peer: WSChiaConnection |
| 289 | + ) -> Optional[Message]: |
| 290 | + """Handle puzzle hash updates registration.""" |
| 291 | + return None |
| 292 | + |
| 293 | + @metadata.request(peer_required=True) |
| 294 | + async def register_for_coin_updates( |
| 295 | + self, request: wallet_protocol.RegisterForCoinUpdates, peer: WSChiaConnection |
| 296 | + ) -> Optional[Message]: |
| 297 | + """Handle coin updates registration.""" |
| 298 | + return None |
| 299 | + |
| 300 | + @metadata.request() |
| 301 | + async def request_children(self, request: wallet_protocol.RequestChildren) -> Optional[Message]: |
| 302 | + """Handle children request.""" |
| 303 | + return None |
| 304 | + |
| 305 | + @metadata.request() |
| 306 | + async def request_ses_hashes(self, request: wallet_protocol.RequestSESInfo) -> Message: |
| 307 | + """Handle SES hashes request.""" |
| 308 | + raise NotImplementedError("Stub method should not be called") |
| 309 | + |
| 310 | + @metadata.request(reply_types=[ProtocolMessageTypes.respond_fee_estimates]) |
| 311 | + async def request_fee_estimates(self, request: wallet_protocol.RequestFeeEstimates) -> Message: |
| 312 | + """Handle fee estimates request.""" |
| 313 | + raise NotImplementedError("Stub method should not be called") |
| 314 | + |
| 315 | + @metadata.request( |
| 316 | + peer_required=True, |
| 317 | + reply_types=[ProtocolMessageTypes.respond_remove_puzzle_subscriptions], |
| 318 | + ) |
| 319 | + async def request_remove_puzzle_subscriptions( |
| 320 | + self, request: wallet_protocol.RequestRemovePuzzleSubscriptions, peer: WSChiaConnection |
| 321 | + ) -> Message: |
| 322 | + """Handle remove puzzle subscriptions request.""" |
| 323 | + raise NotImplementedError("Stub method should not be called") |
| 324 | + |
| 325 | + @metadata.request( |
| 326 | + peer_required=True, |
| 327 | + reply_types=[ProtocolMessageTypes.respond_remove_coin_subscriptions], |
| 328 | + ) |
| 329 | + async def request_remove_coin_subscriptions( |
| 330 | + self, request: wallet_protocol.RequestRemoveCoinSubscriptions, peer: WSChiaConnection |
| 331 | + ) -> Message: |
| 332 | + """Handle remove coin subscriptions request.""" |
| 333 | + raise NotImplementedError("Stub method should not be called") |
| 334 | + |
| 335 | + @metadata.request(peer_required=True, reply_types=[ProtocolMessageTypes.respond_puzzle_state]) |
| 336 | + async def request_puzzle_state( |
| 337 | + self, request: wallet_protocol.RequestPuzzleState, peer: WSChiaConnection |
| 338 | + ) -> Message: |
| 339 | + """Handle puzzle state request.""" |
| 340 | + raise NotImplementedError("Stub method should not be called") |
| 341 | + |
| 342 | + @metadata.request(peer_required=True, reply_types=[ProtocolMessageTypes.respond_coin_state]) |
| 343 | + async def request_coin_state(self, request: wallet_protocol.RequestCoinState, peer: WSChiaConnection) -> Message: |
| 344 | + """Handle coin state request.""" |
| 345 | + raise NotImplementedError("Stub method should not be called") |
| 346 | + |
| 347 | + @metadata.request(reply_types=[ProtocolMessageTypes.respond_cost_info]) |
| 348 | + async def request_cost_info(self, _request: wallet_protocol.RequestCostInfo) -> Optional[Message]: |
| 349 | + """Handle cost info request.""" |
| 350 | + return None |
0 commit comments