@@ -1277,11 +1277,10 @@ def __init__(self, config, sm, keypair):
1277
1277
self .private_key = keypair .privkey
1278
1278
self .nostr_private_key = to_nip19 ('nsec' , keypair .privkey .hex ())
1279
1279
self .nostr_pubkey = keypair .pubkey .hex ()[2 :]
1280
- self .dm_replies = defaultdict (asyncio .Future ) # type: Dict[bytes , asyncio.Future]
1280
+ self .dm_replies = defaultdict (asyncio .Future ) # type: Dict[str , asyncio.Future]
1281
1281
ssl_context = ssl .create_default_context (purpose = ssl .Purpose .SERVER_AUTH , cafile = ca_path )
1282
1282
self .relay_manager = aionostr .Manager (self .relays , private_key = self .nostr_private_key , log = self .logger , ssl_context = ssl_context )
1283
1283
self .taskgroup = OldTaskGroup ()
1284
- self .server_relays = None
1285
1284
1286
1285
def __enter__ (self ):
1287
1286
asyncio .run_coroutine_threadsafe (self .main_loop (), self .network .asyncio_loop )
@@ -1329,7 +1328,11 @@ async def stop(self):
1329
1328
1330
1329
@property
1331
1330
def relays (self ):
1332
- return self .network .config .NOSTR_RELAYS .split (',' )
1331
+ our_relays = self .config .NOSTR_RELAYS .split (',' ) if self .config .NOSTR_RELAYS else []
1332
+ if self .sm .is_server :
1333
+ return our_relays
1334
+ last_swapserver_relays = self .config .LAST_SWAPSERVER_RELAYS .split (',' ) if self .config .LAST_SWAPSERVER_RELAYS else []
1335
+ return list (set (our_relays + last_swapserver_relays ))
1333
1336
1334
1337
def get_offer (self , pubkey ):
1335
1338
offer = self ._offers .get (pubkey )
@@ -1377,7 +1380,7 @@ async def publish_offer(self, sm):
1377
1380
private_key = self .nostr_private_key )
1378
1381
self .logger .info (f"published offer { event_id } " )
1379
1382
1380
- async def send_direct_message (self , pubkey : str , relays , content : str ) -> str :
1383
+ async def send_direct_message (self , pubkey : str , content : str ) -> str :
1381
1384
event_id = await aionostr ._add_event (
1382
1385
self .relay_manager ,
1383
1386
kind = self .NOSTR_DM ,
@@ -1388,10 +1391,13 @@ async def send_direct_message(self, pubkey: str, relays, content: str) -> str:
1388
1391
1389
1392
@log_exceptions
1390
1393
async def send_request_to_server (self , method : str , request_data : dict ) -> dict :
1394
+ # this ensures that we are also connected to the server relays when we
1395
+ # just selected it (no previous get_pairs call)
1396
+ self .logger .debug (f"sending request to server. Triggering relay update: { self .relays } " )
1397
+ await self .relay_manager .update_relays (self .relays )
1391
1398
request_data ['method' ] = method
1392
- request_data ['relays' ] = self .config .NOSTR_RELAYS
1393
1399
server_pubkey = self .config .SWAPSERVER_NPUB
1394
- event_id = await self .send_direct_message (server_pubkey , self . server_relays , json .dumps (request_data ))
1400
+ event_id = await self .send_direct_message (server_pubkey , json .dumps (request_data ))
1395
1401
response = await self .dm_replies [event_id ]
1396
1402
return response
1397
1403
@@ -1402,13 +1408,15 @@ async def receive_offers(self):
1402
1408
"limit" :10 ,
1403
1409
"#d" : [f"electrum-swapserver-{ self .NOSTR_EVENT_VERSION } " ],
1404
1410
"#r" : [f"net:{ constants .net .NET_NAME } " ],
1405
- "since" : int (time .time ()) - self .OFFER_UPDATE_INTERVAL_SEC
1411
+ "since" : int (time .time ()) - 60 * 60 ,
1412
+ "until" : int (time .time ()) + 60 * 60 ,
1406
1413
}
1407
1414
async for event in self .relay_manager .get_events (query , single_event = False , only_stored = False ):
1408
1415
try :
1409
1416
content = json .loads (event .content )
1410
1417
tags = {k : v for k , v in event .tags }
1411
1418
except Exception as e :
1419
+ self .logger .debug (f"failed to parse event: { e } " )
1412
1420
continue
1413
1421
if tags .get ('d' ) != f"electrum-swapserver-{ self .NOSTR_EVENT_VERSION } " :
1414
1422
continue
@@ -1417,8 +1425,9 @@ async def receive_offers(self):
1417
1425
# check if this is the most recent event for this pubkey
1418
1426
pubkey = event .pubkey
1419
1427
ts = self ._offers .get (pubkey , {}).get ('timestamp' , 0 )
1420
- if event .created_at <= ts :
1421
- #print('skipping old event', pubkey[0:10], event.id)
1428
+ if (event .created_at <= ts
1429
+ or event .created_at > time .time () + 60 * 60
1430
+ or event .created_at < time .time () - 60 * 60 ):
1422
1431
continue
1423
1432
try :
1424
1433
pow_bits = get_nostr_ann_pow_amount (
@@ -1433,9 +1442,10 @@ async def receive_offers(self):
1433
1442
content ['pow_bits' ] = pow_bits
1434
1443
content ['pubkey' ] = pubkey
1435
1444
content ['timestamp' ] = event .created_at
1436
- self ._offers [pubkey ] = content
1437
1445
# mirror event to other relays
1438
1446
server_relays = content ['relays' ].split (',' ) if 'relays' in content else []
1447
+ content ['relays' ] = ',' .join (server_relays [:10 ]) # limit to 10 relays
1448
+ self ._offers [pubkey ] = content
1439
1449
await self .taskgroup .spawn (self .rebroadcast_event (event , server_relays ))
1440
1450
1441
1451
async def get_pairs (self ):
@@ -1446,7 +1456,8 @@ async def get_pairs(self):
1446
1456
"authors" : [self .config .SWAPSERVER_NPUB ],
1447
1457
"#d" : [f"electrum-swapserver-{ self .NOSTR_EVENT_VERSION } " ],
1448
1458
"#r" : [f"net:{ constants .net .NET_NAME } " ],
1449
- "since" : int (time .time ()) - self .OFFER_UPDATE_INTERVAL_SEC ,
1459
+ "since" : int (time .time ()) - 60 * 60 ,
1460
+ "until" : int (time .time ()) + 60 * 60 ,
1450
1461
"limit" : 1
1451
1462
}
1452
1463
async for event in self .relay_manager .get_events (query , single_event = True , only_stored = False ):
@@ -1459,14 +1470,18 @@ async def get_pairs(self):
1459
1470
continue
1460
1471
if tags .get ('r' ) != f"net:{ constants .net .NET_NAME } " :
1461
1472
continue
1462
- # check if this is the most recent event for this pubkey
1463
- pubkey = event .pubkey
1464
- content ['pubkey' ] = pubkey
1473
+ if (event .created_at > time .time () + 60 * 60
1474
+ or event .created_at < time .time () - 60 * 60 ):
1475
+ continue
1476
+ content ['pubkey' ] = event .pubkey
1465
1477
content ['timestamp' ] = event .created_at
1466
1478
self .logger .info (f'received offer from { age (event .created_at )} ' )
1467
1479
pairs = self ._parse_offer (content )
1480
+ server_relays = content ['relays' ].split (',' )[:10 ] if 'relays' in content else []
1481
+ if server_relays :
1482
+ self .config .LAST_SWAPSERVER_RELAYS = ',' .join (server_relays )
1483
+ await self .relay_manager .update_relays (self .relays )
1468
1484
self .sm .update_pairs (pairs )
1469
- self .server_relays = content ['relays' ].split (',' )
1470
1485
1471
1486
async def rebroadcast_event (self , event : Event , server_relays : Sequence [str ]):
1472
1487
"""If the relays of the origin server are different from our relays we rebroadcast the
@@ -1509,8 +1524,7 @@ async def handle_request(self, request):
1509
1524
method = request .pop ('method' )
1510
1525
event_id = request .pop ('event_id' )
1511
1526
event_pubkey = request .pop ('event_pubkey' )
1512
- self .logger .info (f'handle_request: id={ event_id } { method } { request } ' )
1513
- relays = request .pop ('relays' ).split (',' )
1527
+ print (f'handle_request: id={ event_id } { method } { request } ' )
1514
1528
if method == 'addswapinvoice' :
1515
1529
r = self .sm .server_add_swap_invoice (request )
1516
1530
elif method == 'createswap' :
@@ -1521,4 +1535,4 @@ async def handle_request(self, request):
1521
1535
raise Exception (method )
1522
1536
r ['reply_to' ] = event_id
1523
1537
self .logger .info (f'sending response id={ event_id } ' )
1524
- await self .send_direct_message (event_pubkey , relays , json .dumps (r ))
1538
+ await self .send_direct_message (event_pubkey , json .dumps (r ))
0 commit comments