MCPcopy Create free account
hub / github.com/ElementsProject/lightning / closing_negotiation_step

Function closing_negotiation_step

tests/test_closing.py:367–442  ·  view source on GitHub ↗
(node_factory, bitcoind, chainparams, opts)

Source from the content-addressed store, hash-verified

365
366
367def closing_negotiation_step(node_factory, bitcoind, chainparams, opts):
368 def feerate_for(target, minimum=0, maximum=10000000):
369 """Binary search to find feerate"""
370 assert minimum != maximum
371 mid = (minimum + maximum) // 2
372 mid_fee = closing_fee(mid, 1)
373 if mid_fee > target:
374 return feerate_for(target, minimum, mid)
375 elif mid_fee < target:
376 return feerate_for(target, mid, maximum)
377 else:
378 return mid
379
380 orate = feerate_for(21000) # closing fee negotiation starts at 21000
381 prate = feerate_for(20000) # closing fee negotiation starts at 20000
382 opener, peer = node_factory.line_graph(2, opts=[{'feerates': (orate, orate, orate, orate),
383 'dev-force-features': "-23"},
384 {'feerates': (prate, prate, prate, prate),
385 'dev-force-features': "-23"}])
386
387 opener_id = opener.info['id']
388 peer_id = peer.info['id']
389
390 assert bitcoind.rpc.getmempoolinfo()['size'] == 0
391
392 if opts['close_initiated_by'] == 'opener':
393 opener.rpc.close(peer_id=peer_id, fee_negotiation_step=opts['fee_negotiation_step'])
394 else:
395 assert opts['close_initiated_by'] == 'peer'
396 peer.rpc.close(peer_id=opener_id, fee_negotiation_step=opts['fee_negotiation_step'])
397
398 # Get the proclaimed closing fee from the two nodes' statuses
399
400 status_agreed_regex = re.compile("agreed on a closing fee of ([0-9]+) satoshi")
401
402 # [fee_from_opener_status, fee_from_peer_status]
403 fees_from_status: List[Optional[int], Optional[int]] = [None, None]
404
405 def get_fee_from_status(node, peer_id, i):
406 channel = only_one(node.rpc.listpeerchannels(peer_id)['channels'])
407 status = channel['status'][0]
408
409 m = status_agreed_regex.search(status)
410 if not m:
411 return False
412
413 fees_from_status[i] = int(m.group(1))
414 return True
415
416 wait_for(lambda: get_fee_from_status(opener, peer_id, 0))
417 wait_for(lambda: get_fee_from_status(peer, opener_id, 1))
418
419 assert opts['expected_close_fee'] == fees_from_status[0]
420 assert opts['expected_close_fee'] == fees_from_status[1]
421
422 # Get the closing transaction from the bitcoind mempool and get its fee
423
424 mempool = None

Calls 6

wait_forFunction · 0.90
feerate_forFunction · 0.85
get_fee_from_statusFunction · 0.85
line_graphMethod · 0.80
compileMethod · 0.80
closeMethod · 0.45

Tested by

no test coverage detected