#! /bin/sh -e # Wherever we are, we want to be in daemon/test dir. cd `git rev-parse --show-toplevel`/daemon/test . scripts/vars.sh . scripts/helpers.sh parse_cmdline 3 "$@" setup_lightning 3 start_lightningd 3 fund_lightningd # We connect 1->2->3 lcli1 connect localhost $PORT2 $FUND_INPUT_TX & check_tx_spend $CLI generate 1 P2SHADDR2=`$LCLI2 newaddr | sed -n 's/{ "address" : "\(.*\)" }/\1/p'` TXID2=`$CLI sendtoaddress $P2SHADDR2 0.01` FUND_INPUT_TX2=`$CLI getrawtransaction $TXID2` $CLI generate 1 lcli2 connect localhost $PORT3 $FUND_INPUT_TX2 & check_tx_spend $CLI generate 1 DO_RECONNECT=$RECONNECT # Make sure all in STATE_NORMAL. check_peerstate lcli1 STATE_NORMAL check_peerstate lcli3 STATE_NORMAL # More than enough to cover commit fees. HTLC_AMOUNT=100000000 # Tell node 1 about the 2->3 route. # Add to config in case we are restaring. echo "add-route=$ID2/$ID3/546000/10/36/36" >> $DIR1/config lcli1 dev-add-route $ID2 $ID3 546000 10 36 36 RHASH=`lcli3 invoice $HTLC_AMOUNT RHASH | sed 's/.*"\([0-9a-f]*\)".*/\1/'` BAD_RHASH=`echo $RHASH | tr '0-9a-f' 'a-f0-9'` # Get route. ROUTE=`lcli1 getroute $ID3 $HTLC_AMOUNT 1` ROUTE=`echo $ROUTE | sed 's/^{ "route" : \(.*\) }$/\1/'` # Try wrong hash. if lcli1 sendpay "$ROUTE" $BAD_RHASH; then echo Paid with wrong hash? >&2 exit 1 fi # Try underpaying. PAID=`echo "$ROUTE" | sed -n 's/.*"msatoshi" : \([0-9]*\),.*/\1/p'` UNDERPAY=`echo "$ROUTE" | sed "s/: $PAID,/: $(($PAID - 1)),/"` if lcli1 sendpay "$UNDERPAY" $RHASH; then echo Paid with too little? >&2 exit 1 fi # If restarting, make sure node3 remembers incoming payment. if [ "$RECONNECT" = restart ]; then $LCLI3 -- dev-restart $LIGHTNINGD3 >/dev/null 2>&1 || true if ! check "$LCLI3 getpeers 2>/dev/null | tr -s '\012\011\" ' ' ' | fgrep -q 'connected : true'"; then echo "Failed to reconnect!">&2 exit 1 fi fi [ "`lcli3 listinvoice RHASH | tr -s '\012\011\" ' ' '`" = "[ { label : RHASH , rhash : $RHASH , msatoshi : $HTLC_AMOUNT, complete : false } ] " ] # Pay correctly. lcli1 sendpay "$ROUTE" $RHASH # Node 3 should end up with that amount (minus 1/2 tx fee) # Note that it is delayed a little, since node2 fulfils as soon as fulfill # starts. check lcli3 "getpeers | $FGREP \"\\\"our_amount\\\" : $(($HTLC_AMOUNT - $NO_HTLCS_FEE / 2))\"" # If restarting, make sure node3 remembers completed payment. if [ "$RECONNECT" = restart ]; then echo RESTARTING NODE3 $LCLI3 -- dev-restart $LIGHTNINGD3 >/dev/null 2>&1 || true sleep 5 $LCLI2 -- dev-restart $LIGHTNINGD2 >/dev/null 2>&1 || true if ! check "$LCLI3 getpeers 2>/dev/null | tr -s '\012\011\" ' ' ' | fgrep -q 'connected : true'"; then echo "Failed to reconnect!">&2 exit 1 fi fi [ "`lcli3 listinvoice RHASH | tr -s '\012\011\" ' ' '`" = "[ { label : RHASH , rhash : $RHASH , msatoshi : $HTLC_AMOUNT, complete : true } ] " ] [ "`lcli3 waitanyinvoice | tr -s '\012\011\" ' ' '`" = "{ label : RHASH , rhash : $RHASH , msatoshi : $HTLC_AMOUNT } " ] # Can't pay twice (try from node2) ROUTE2=`lcli2 getroute $ID3 $HTLC_AMOUNT 1` ROUTE2=`echo $ROUTE2 | sed 's/^{ "route" : \(.*\) }$/\1/'` if lcli2 sendpay "$ROUTE2" $RHASH; then echo "Paying twice worked?" >&2 exit 1 fi lcli3 close $ID2 check_peerstate lcli3 STATE_MUTUAL_CLOSING # Re-send should be a noop (doesn't matter that node3 is down!) lcli1 sendpay "$ROUTE" $RHASH # Re-send to different id or amount should complain. SHORTROUTE=`echo "$ROUTE" | sed 's/, { "id" : .* }//' | sed 's/"msatoshi" : [0-9]*,/"msatoshi" : '$HTLC_AMOUNT,/` lcli1 sendpay "$SHORTROUTE" $RHASH | $FGREP "already succeeded to $ID3" lcli1 sendpay "$UNDERPAY" $RHASH | $FGREP "already succeeded with amount $HTLC_AMOUNT" # Now node2 should fail to route. if lcli1 sendpay "$ROUTE" $BAD_RHASH | $FGREP "failed: error code 404 node $ID2 reason Unknown peer"; then : ; else echo "Pay to node3 didn't give 404" >&2 exit 1 fi # Now node1 should fail to route (route deleted) if lcli1 getroute $ID3 $HTLC_AMOUNT 1 | $FGREP "no route found"; then : ; else echo "Pay to node3 didn't fail instantly second time" >&2 exit 1 fi lcli1 close $ID2 check_peerstate lcli1 STATE_MUTUAL_CLOSING # Make sure both txs broadcast. check '[ `$CLI getrawmempool | egrep -c "[a-f0-9]{32}"` = 2 ]' # Bury them in "forever" blocks. $CLI generate 10 check_no_peers lcli1 check_no_peers lcli2 check_no_peers lcli3 lcli1 stop lcli2 stop lcli3 stop all_ok