@@ -278,20 +278,23 @@ def parse(self, text: str):
278278 # no address, no bolt11 and no silent payment address, invalid
279279 self .set_state (PaymentIdentifierState .INVALID )
280280 return
281- elif self .bip21 .get ('address' ) == DummyAddress . SILENT_PAYMENT :
281+ elif DummyAddress . is_dummy_address ( self .bip21 .get ('address' )) :
282282 self .set_state (PaymentIdentifierState .INVALID )
283- return # user manually entered DummyAddress.SILENT_PAYMENT
283+ return # user manually entered DummyAddress
284284 self .set_state (PaymentIdentifierState .AVAILABLE )
285285 elif self .parse_output (text )[0 ]:
286- scriptpubkey , is_address = self .parse_output (text )
287- if bitcoin .script_to_address (scriptpubkey ) == DummyAddress . SILENT_PAYMENT :
288- sp_address = self . parse_address ( text )
289- if sp_address == DummyAddress . SILENT_PAYMENT :
286+ scriptpubkey , is_address , sp_addr = self .parse_output (text )
287+ addr = bitcoin .script_to_address (scriptpubkey ) if is_address else None
288+ if addr == DummyAddress . SILENT_PAYMENT :
289+ if sp_addr is None :
290290 self .set_state (PaymentIdentifierState .INVALID ) # user manually entered DummyAddress.SILENT_PAYMENT
291291 return
292- self .sp_address = sp_address
292+ self .sp_address = sp_addr
293293 self ._type = PaymentIdentifierType .SILENT_PAYMENT
294294 else :
295+ if DummyAddress .is_dummy_address (addr ):
296+ self .set_state (PaymentIdentifierState .INVALID ) # user manually entered dummy lighting address
297+ return
295298 self ._type = PaymentIdentifierType .SPK
296299 self .spk = scriptpubkey
297300 self .spk_is_address = is_address
@@ -500,7 +503,7 @@ def get_onchain_outputs(self, amount, allow_silent_payment=True):
500503 else :
501504 address = sp_address # use silent payment address
502505
503- scriptpubkey , is_address = self .parse_output (address )
506+ scriptpubkey , is_address , _ = self .parse_output (address )
504507 assert is_address # unlikely, but make sure it is an address, not a script
505508 output = PartialTxOutput (scriptpubkey = scriptpubkey , value = amount )
506509 if output .address == DummyAddress .SILENT_PAYMENT :
@@ -543,30 +546,34 @@ def parse_address_and_amount(self, line: str) -> PartialTxOutput:
543546 x , y = line .split (',' )
544547 except ValueError :
545548 raise Exception ("expected two comma-separated values: (address, amount)" ) from None
546- scriptpubkey , is_address = self .parse_output (x )
549+ scriptpubkey , is_address , sp_addr = self .parse_output (x )
547550 if not scriptpubkey :
548551 raise Exception ('Invalid address' )
549552 amount = self .parse_amount (y )
550553 output = PartialTxOutput (scriptpubkey = scriptpubkey , value = amount )
551554 if output .address == DummyAddress .SILENT_PAYMENT :
552- output .sp_addr = SilentPaymentAddress (self .parse_address (x )) # maybe parsing again isn't needed
555+ output .sp_addr = SilentPaymentAddress (sp_addr ) # raises if user entered manually silent-dummy-addr -> invalid
556+ elif DummyAddress .is_dummy_address (output .address ):
557+ raise Exception ('user manually entered dummy address' )
553558 return output
554559
555- def parse_output (self , x : str ) -> Tuple [Optional [bytes ], bool ]:
560+ def parse_output (self , x : str ) -> Tuple [Optional [bytes ], bool , Optional [ str ] ]:
556561 try :
557562 address = self .parse_address (x )
563+ sp_addr = None
558564 if is_silent_payment_address (address ):
565+ sp_addr = address
559566 address = DummyAddress .SILENT_PAYMENT
560- return bitcoin .address_to_script (address ), True
567+ return bitcoin .address_to_script (address ), True , sp_addr
561568 except Exception as e :
562569 pass
563570 try :
564571 m = re .match ('^' + RE_SCRIPT_FN + '$' , x )
565572 script = self .parse_script (str (m .group (1 )))
566- return script , False
573+ return script , False , None
567574 except Exception as e :
568575 pass
569- return None , False
576+ return None , False , None
570577
571578 def parse_script (self , x : str ) -> bytes :
572579 script = bytearray ()
0 commit comments