receive_keysend_test.go raw

   1  package transactions
   2  
   3  import (
   4  	"context"
   5  	"encoding/hex"
   6  	"encoding/json"
   7  	"strconv"
   8  	"testing"
   9  
  10  	"github.com/stretchr/testify/assert"
  11  	"github.com/stretchr/testify/require"
  12  
  13  	"github.com/getAlby/hub/events"
  14  	"github.com/getAlby/hub/lnclient"
  15  	"github.com/getAlby/hub/tests"
  16  )
  17  
  18  func TestReceiveKeysend_ValidBoostagram(t *testing.T) {
  19  	ctx := context.TODO()
  20  
  21  	svc, err := tests.CreateTestService(t)
  22  	require.NoError(t, err)
  23  	defer svc.Remove()
  24  
  25  	transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
  26  
  27  	tlv := []lnclient.TLVRecord{
  28  		{
  29  			Type:  7629169,
  30  			Value: hex.EncodeToString([]byte("{\"app_name\": \"Castamatic\"}")),
  31  		},
  32  	}
  33  	tx := lnclient.Transaction{
  34  		Type:         "incoming",
  35  		Description:  "mock invoice 1",
  36  		Preimage:     "9f59b18f80a77c2930deb8be5ff1143eacdd1891c63c23d61bc9f99c64e57325",
  37  		PaymentHash:  "ae4277b7be3ca1420cafd24c143866190f52b996856b0e4164763f936e61ea1b",
  38  		AmountMsat:   1000,
  39  		FeesPaidMsat: 50,
  40  		SettledAt:    &tests.MockTimeUnix,
  41  		Metadata: map[string]interface{}{
  42  			"tlv_records": tlv,
  43  		},
  44  	}
  45  
  46  	event := events.Event{
  47  		Event:      "nwc_lnclient_payment_received",
  48  		Properties: &tx,
  49  	}
  50  	transactionsService.ConsumeEvent(ctx, &event, map[string]interface{}{})
  51  
  52  	transaction, err := transactionsService.LookupTransaction(ctx, tx.PaymentHash, nil, svc.LNClient, nil)
  53  	require.NoError(t, err)
  54  	var txBoostagram Boostagram
  55  	err = json.Unmarshal(transaction.Boostagram, &txBoostagram)
  56  	require.NoError(t, err)
  57  	assert.Equal(t, "Castamatic", txBoostagram.AppName)
  58  }
  59  func TestReceiveKeysend_InvalidBoostagram(t *testing.T) {
  60  	ctx := context.TODO()
  61  
  62  	svc, err := tests.CreateTestService(t)
  63  	require.NoError(t, err)
  64  	defer svc.Remove()
  65  
  66  	transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
  67  
  68  	tlv := []lnclient.TLVRecord{
  69  		{
  70  			Type:  7629169,
  71  			Value: hex.EncodeToString([]byte("asdf")),
  72  		},
  73  	}
  74  	tx := lnclient.Transaction{
  75  		Type:         "incoming",
  76  		Description:  "mock invoice 1",
  77  		Preimage:     "9f59b18f80a77c2930deb8be5ff1143eacdd1891c63c23d61bc9f99c64e57325",
  78  		PaymentHash:  "ae4277b7be3ca1420cafd24c143866190f52b996856b0e4164763f936e61ea1b",
  79  		AmountMsat:   1000,
  80  		FeesPaidMsat: 50,
  81  		SettledAt:    &tests.MockTimeUnix,
  82  		Metadata: map[string]interface{}{
  83  			"tlv_records": tlv,
  84  		},
  85  	}
  86  
  87  	event := events.Event{
  88  		Event:      "nwc_lnclient_payment_received",
  89  		Properties: &tx,
  90  	}
  91  	transactionsService.ConsumeEvent(ctx, &event, map[string]interface{}{})
  92  
  93  	transaction, err := transactionsService.LookupTransaction(ctx, tx.PaymentHash, nil, svc.LNClient, nil)
  94  	require.NoError(t, err)
  95  	assert.Nil(t, transaction.Boostagram)
  96  }
  97  
  98  func TestReceiveKeysendWithCustomKey(t *testing.T) {
  99  	ctx := context.TODO()
 100  
 101  	svc, err := tests.CreateTestService(t)
 102  	require.NoError(t, err)
 103  	defer svc.Remove()
 104  
 105  	transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
 106  	app, _, err := tests.CreateApp(svc)
 107  	assert.NoError(t, err)
 108  
 109  	// just to have another app in this test
 110  	_, _, err = tests.CreateApp(svc)
 111  
 112  	assert.NoError(t, err)
 113  
 114  	tlv := []lnclient.TLVRecord{
 115  		{
 116  			Type:  696969,
 117  			Value: hex.EncodeToString([]byte(strconv.FormatUint(uint64(app.ID), 10))),
 118  		},
 119  	}
 120  	tx := lnclient.Transaction{
 121  		Type:         "incoming",
 122  		Description:  "mock invoice 1",
 123  		Preimage:     "9f59b18f80a77c2930deb8be5ff1143eacdd1891c63c23d61bc9f99c64e57325",
 124  		PaymentHash:  "ae4277b7be3ca1420cafd24c143866190f52b996856b0e4164763f936e61ea1b",
 125  		AmountMsat:   1000,
 126  		FeesPaidMsat: 50,
 127  		SettledAt:    &tests.MockTimeUnix,
 128  		Metadata: map[string]interface{}{
 129  			"tlv_records": tlv,
 130  		},
 131  	}
 132  
 133  	event := events.Event{
 134  		Event:      "nwc_lnclient_payment_received",
 135  		Properties: &tx,
 136  	}
 137  	transactionsService.ConsumeEvent(ctx, &event, map[string]interface{}{})
 138  
 139  	transaction, err := transactionsService.LookupTransaction(ctx, tx.PaymentHash, nil, svc.LNClient, nil)
 140  	require.NoError(t, err)
 141  	assert.Equal(t, app.ID, *transaction.AppId)
 142  	assert.Equal(t, uint(1), app.ID)
 143  }
 144  
 145  func TestReceiveKeysend(t *testing.T) {
 146  	ctx := context.TODO()
 147  
 148  	svc, err := tests.CreateTestService(t)
 149  	require.NoError(t, err)
 150  	defer svc.Remove()
 151  
 152  	transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
 153  	_, _, err = tests.CreateApp(svc)
 154  	assert.NoError(t, err)
 155  
 156  	tx := tests.MockLNClientTransaction
 157  	event := events.Event{
 158  		Event:      "nwc_lnclient_payment_received",
 159  		Properties: tx,
 160  	}
 161  	transactionsService.ConsumeEvent(ctx, &event, map[string]interface{}{})
 162  
 163  	transaction, err := transactionsService.LookupTransaction(ctx, tx.PaymentHash, nil, svc.LNClient, nil)
 164  	assert.NoError(t, err)
 165  	assert.Nil(t, transaction.AppId)
 166  }
 167