feat: do not require unlock password to recover encrypted scb (#768)

* feat: do not require unlock password to recover encrypted scb

* fix: use seed as key to encrypt static channel backup

* chore: move encrypted channel backup derivation to alby oauth service

* chore: add extra test

* chore: reduce duplicated code

* fix: change key derivation paths

* chore: simplify backup page copy for connected alby accounts

* chore: improve copy

* fix: initialize keys before starting ln backend

* chore: improve test assertions
This commit is contained in:
Roland 2024-11-01 13:26:10 +07:00 committed by GitHub
parent 731d248129
commit 7ec4746bc5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
34 changed files with 421 additions and 186 deletions

View file

@ -17,6 +17,7 @@ import (
decodepay "github.com/nbd-wtf/ln-decodepay"
"github.com/sirupsen/logrus"
"github.com/tyler-smith/go-bip32"
"golang.org/x/oauth2"
"gorm.io/gorm"
@ -723,12 +724,49 @@ func (svc *albyOAuthService) ConsumeEvent(ctx context.Context, event *events.Eve
}
}
type channelsBackup struct {
Description string `json:"description"`
Data string `json:"data"`
}
func (svc *albyOAuthService) createEncryptedChannelBackup(event *events.StaticChannelsBackupEvent) (*channelsBackup, error) {
eventData := bytes.NewBuffer([]byte{})
err := json.NewEncoder(eventData).Encode(event)
if err != nil {
return nil, fmt.Errorf("failed to encode channels backup data: %w", err)
}
path := []uint32{bip32.FirstHardenedChild}
backupKey, err := svc.keys.DeriveKey(path)
if err != nil {
logger.Logger.WithError(err).Error("Failed to generate channels backup key")
return nil, err
}
encrypted, err := config.AesGcmEncryptWithKey(eventData.String(), backupKey.Key)
if err != nil {
return nil, fmt.Errorf("failed to encrypt channels backup data: %w", err)
}
backup := &channelsBackup{
Description: "channels_v2",
Data: encrypted,
}
return backup, nil
}
func (svc *albyOAuthService) backupChannels(ctx context.Context, event *events.Event) error {
bkpEvent, ok := event.Properties.(*events.StaticChannelsBackupEvent)
if !ok {
return fmt.Errorf("invalid nwc_backup_channels event properties, could not cast to the expected type: %+v", event.Properties)
}
backup, err := svc.createEncryptedChannelBackup(bkpEvent)
if err != nil {
return fmt.Errorf("failed to encrypt channel backup: %w", err)
}
token, err := svc.fetchUserToken(ctx)
if err != nil {
return fmt.Errorf("failed to fetch user token: %w", err)
@ -736,33 +774,8 @@ func (svc *albyOAuthService) backupChannels(ctx context.Context, event *events.E
client := svc.oauthConf.Client(ctx, token)
type channelsBackup struct {
Description string `json:"description"`
Data string `json:"data"`
}
eventData := bytes.NewBuffer([]byte{})
err = json.NewEncoder(eventData).Encode(bkpEvent)
if err != nil {
return fmt.Errorf("failed to encode channels backup data: %w", err)
}
// use the encrypted mnemonic as the password to encrypt the backup data
encryptedMnemonic, err := svc.cfg.Get("Mnemonic", "")
if err != nil {
return fmt.Errorf("failed to fetch encryption key: %w", err)
}
encrypted, err := config.AesGcmEncrypt(eventData.String(), encryptedMnemonic)
if err != nil {
return fmt.Errorf("failed to encrypt channels backup data: %w", err)
}
body := bytes.NewBuffer([]byte{})
err = json.NewEncoder(body).Encode(&channelsBackup{
Description: "channels",
Data: encrypted,
})
err = json.NewEncoder(body).Encode(backup)
if err != nil {
return fmt.Errorf("failed to encode channels backup request payload: %w", err)
}

View file

@ -0,0 +1,75 @@
package alby
import (
"testing"
"github.com/getAlby/hub/config"
"github.com/getAlby/hub/events"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/tyler-smith/go-bip32"
"github.com/tyler-smith/go-bip39"
)
func TestExistingEncryptedBackup(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
require.NoError(t, err)
mnemonic := "limit reward expect search tissue call visa fit thank cream brave jump"
unlockPassword := "123"
svc.Cfg.SetUpdate("Mnemonic", mnemonic, unlockPassword)
err = svc.Keys.Init(svc.Cfg, unlockPassword)
assert.NoError(t, err)
encryptedBackup := "3fd21f9a393d8345ddbdd449-ba05c3dbafdfb7eea574373b7763d0c81c599b2cd1735e59a1c5571379498f4da8fe834c3403824ab02b61005abc1f563c638f425c65420e82941efe94794555c8b145a0603733ee115277f860011e6a17fd8c22f1d73a096ff7275582aac19b430940b40a2559c7ff59a063305290ef7c9ba46f9de17b0ddbac9030b0"
masterKey, err := bip32.NewMasterKey(bip39.NewSeed(mnemonic, ""))
assert.NoError(t, err)
appKey, err := masterKey.NewChildKey(bip32.FirstHardenedChild + 128029 /* 🐝 */)
assert.NoError(t, err)
encryptedChannelsBackupKey, err := appKey.NewChildKey(bip32.FirstHardenedChild)
assert.NoError(t, err)
decrypted, err := config.AesGcmDecryptWithKey(encryptedBackup, encryptedChannelsBackupKey.Key)
assert.NoError(t, err)
assert.Equal(t, "{\"node_id\":\"037e702144c4fa485d42f0f69864e943605823763866cf4bf619d2d2cf2eda420b\",\"channels\":[],\"monitors\":[]}\n", decrypted)
}
func TestEncryptedBackup(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
require.NoError(t, err)
mnemonic := "limit reward expect search tissue call visa fit thank cream brave jump"
unlockPassword := "123"
svc.Cfg.SetUpdate("Mnemonic", mnemonic, unlockPassword)
err = svc.Keys.Init(svc.Cfg, unlockPassword)
assert.NoError(t, err)
albyOAuthSvc := NewAlbyOAuthService(svc.DB, svc.Cfg, svc.Keys, svc.EventPublisher)
encryptedBackup, err := albyOAuthSvc.createEncryptedChannelBackup(&events.StaticChannelsBackupEvent{
NodeID: "037e702144c4fa485d42f0f69864e943605823763866cf4bf619d2d2cf2eda420b",
Channels: []events.ChannelBackup{},
Monitors: []events.EncodedChannelMonitorBackup{},
})
assert.NoError(t, err)
assert.Equal(t, "channels_v2", encryptedBackup.Description)
masterKey, err := bip32.NewMasterKey(bip39.NewSeed(mnemonic, ""))
assert.NoError(t, err)
appKey, err := masterKey.NewChildKey(bip32.FirstHardenedChild + 128029 /* 🐝 */)
assert.NoError(t, err)
encryptedChannelsBackupKey, err := appKey.NewChildKey(bip32.FirstHardenedChild)
assert.NoError(t, err)
decrypted, err := config.AesGcmDecryptWithKey(encryptedBackup.Data, encryptedChannelsBackupKey.Key)
assert.NoError(t, err)
assert.Equal(t, "{\"node_id\":\"037e702144c4fa485d42f0f69864e943605823763866cf4bf619d2d2cf2eda420b\",\"channels\":[],\"monitors\":[]}\n", decrypted)
}

View file

@ -5,6 +5,7 @@ import (
"crypto/cipher"
"crypto/rand"
"encoding/hex"
"fmt"
"strings"
"golang.org/x/crypto/argon2"
@ -23,14 +24,40 @@ func DeriveKey(password string, salt []byte) ([]byte, []byte, error) {
return key, salt, nil
}
func AesGcmEncrypt(plaintext string, password string) (string, error) {
func AesGcmEncryptWithPassword(plaintext string, password string) (string, error) {
secretKey, salt, err := DeriveKey(password, nil)
if err != nil {
return "", err
}
ciphertext, err := AesGcmEncryptWithKey(plaintext, secretKey)
if err != nil {
return "", err
}
return hex.EncodeToString(salt) + "-" + ciphertext, nil
}
func AesGcmDecryptWithPassword(ciphertext string, password string) (string, error) {
arr := strings.Split(ciphertext, "-")
salt, _ := hex.DecodeString(arr[0])
secretKey, _, err := DeriveKey(password, salt)
if err != nil {
return "", err
}
return AesGcmDecryptWithKey(arr[1]+"-"+arr[2], secretKey)
}
func AesGcmEncryptWithKey(plaintext string, key []byte) (string, error) {
// require a 32 bytes key (256 bits)
if len(key) != 32 {
return "", fmt.Errorf("key must be at least 32 bytes, got %d", len(key))
}
plaintextBytes := []byte(plaintext)
aes, err := aes.NewCipher([]byte(secretKey))
aes, err := aes.NewCipher(key)
if err != nil {
return "", err
}
@ -48,20 +75,20 @@ func AesGcmEncrypt(plaintext string, password string) (string, error) {
ciphertext := aesgcm.Seal(nil, nonce, plaintextBytes, nil)
return hex.EncodeToString(salt) + "-" + hex.EncodeToString(nonce) + "-" + hex.EncodeToString(ciphertext), nil
return hex.EncodeToString(nonce) + "-" + hex.EncodeToString(ciphertext), nil
}
func AesGcmDecrypt(ciphertext string, password string) (string, error) {
arr := strings.Split(ciphertext, "-")
salt, _ := hex.DecodeString(arr[0])
nonce, _ := hex.DecodeString(arr[1])
data, _ := hex.DecodeString(arr[2])
secretKey, _, err := DeriveKey(password, salt)
if err != nil {
return "", err
func AesGcmDecryptWithKey(ciphertext string, key []byte) (string, error) {
// require a 32 bytes key (256 bits)
if len(key) != 32 {
return "", fmt.Errorf("key must be at least 32 bytes, got %d", len(key))
}
aes, err := aes.NewCipher([]byte(secretKey))
arr := strings.Split(ciphertext, "-")
nonce, _ := hex.DecodeString(arr[0])
data, _ := hex.DecodeString(arr[1])
aes, err := aes.NewCipher([]byte(key))
if err != nil {
return "", err
}

49
config/aesgcm_test.go Normal file
View file

@ -0,0 +1,49 @@
package config
import (
"encoding/hex"
"testing"
"github.com/stretchr/testify/assert"
"github.com/tyler-smith/go-bip32"
"github.com/tyler-smith/go-bip39"
)
func TestDecryptExistingCiphertextWithPassword(t *testing.T) {
value, err := AesGcmDecryptWithPassword("323f41394d3175b72454ccae9c0081f94df5fb4c2fb0b9283a87e5aafba81839-c335b9eeea75c28a6f823354-5055b90dadbdd01c52fbdbb7efb80609e4410357481651e89ceb1501c8e1dea1f33a8e3322a1cef4f641773667423bca5154dfeccac390cfcd719b36965adc3e6ae56fd5d6c82819596e9ef4ff07193ae345eb291fa412a1ce6066864b", "123")
assert.NoError(t, err)
assert.Equal(t, "connect maximum march lava ignore resist visa kind kiwi kidney develop animal", value)
}
func TestEncryptDecryptWithPassword(t *testing.T) {
mnemonic := "connect maximum march lava ignore resist visa kind kiwi kidney develop animal"
encrypted, err := AesGcmEncryptWithPassword(mnemonic, "123")
assert.NoError(t, err)
value, err := AesGcmDecryptWithPassword(encrypted, "123")
assert.NoError(t, err)
assert.Equal(t, mnemonic, value)
}
func TestDecryptExistingCiphertextWithKey(t *testing.T) {
mnemonic := "connect maximum march lava ignore resist visa kind kiwi kidney develop animal"
masterKey, err := bip32.NewMasterKey(bip39.NewSeed(mnemonic, ""))
assert.NoError(t, err)
value, err := AesGcmDecryptWithKey("22ad485dea4f49696594c7c4-afe35ce65fc5a45249bf1b9078472fb28395fc88c30a79c76c7d8d37cf", masterKey.Key)
assert.NoError(t, err)
assert.Equal(t, "Hello, world!", value)
}
func TestEncryptDecryptWithKey(t *testing.T) {
plaintext := "Hello, world!"
mnemonic := "connect maximum march lava ignore resist visa kind kiwi kidney develop animal"
masterKey, err := bip32.NewMasterKey(bip39.NewSeed(mnemonic, ""))
assert.NoError(t, err)
assert.Equal(t, "409e902eafba273b21dff921f0eb4bec6cbb0b657fdce8d245ca78d2920f8b73", hex.EncodeToString(masterKey.Key))
encrypted, err := AesGcmEncryptWithKey(plaintext, masterKey.Key)
assert.NoError(t, err)
value, err := AesGcmDecryptWithKey(encrypted, masterKey.Key)
assert.NoError(t, err)
assert.Equal(t, plaintext, value)
}

View file

@ -154,7 +154,7 @@ func (cfg *config) get(key string, encryptionKey string, gormDB *gorm.DB) (strin
value := userConfig.Value
if userConfig.Value != "" && encryptionKey != "" && userConfig.Encrypted {
decrypted, err := AesGcmDecrypt(value, encryptionKey)
decrypted, err := AesGcmDecryptWithPassword(value, encryptionKey)
if err != nil {
return "", err
}
@ -165,7 +165,7 @@ func (cfg *config) get(key string, encryptionKey string, gormDB *gorm.DB) (strin
func (cfg *config) set(key string, value string, clauses clause.OnConflict, encryptionKey string, gormDB *gorm.DB) error {
if encryptionKey != "" {
encrypted, err := AesGcmEncrypt(value, encryptionKey)
encrypted, err := AesGcmEncryptWithPassword(value, encryptionKey)
if err != nil {
return fmt.Errorf("failed to encrypt: %v", err)
}

View file

@ -135,19 +135,15 @@ export function BackupMnemonic() {
<b>backs up your wallet savings balance</b>.&nbsp;
{info?.albyAccountConnected && (
<>
You also need to make sure you do not forget your{" "}
<b>unlock password</b> as this will be used to recover funds
from channels. Encrypted channel backups are saved
automatically to your Alby Account.
Channel backups are saved automatically to your Alby
Account, encrypted with your recovery phrase.
</>
)}
{!info?.albyAccountConnected && (
<>
Make sure to also backup your <b>data directory</b> as this
is required to recover funds on your channels. You can also
connect your Alby Account for automatic encrypted backups
(you still need your seed and unlock password to decrypt
those).
connect your Alby Account for automatic encrypted backups.
</>
)}
</span>
@ -166,14 +162,9 @@ export function BackupMnemonic() {
</div>
<span>
If you lose access to your hub and do not have your{" "}
<b>recovery phrase</b>&nbsp;
{info?.albyAccountConnected && (
<>
or your <b>unlock password</b>
</>
)}
<b>recovery phrase</b>
{!info?.albyAccountConnected && (
<>or do not backup your data directory</>
<>&nbsp;or do not backup your data directory</>
)}
, you will lose access to your funds.
</span>
@ -201,7 +192,7 @@ export function BackupMnemonic() {
secure place
</Label>
</div>
{backedUp && (
{backedUp && !info?.albyAccountConnected && (
<div className="flex mt-5">
<Checkbox
id="backup2"
@ -210,12 +201,8 @@ export function BackupMnemonic() {
/>
<Label htmlFor="backup2" className="ml-2">
I understand the <b>recovery phrase</b> AND{" "}
{info?.albyAccountConnected ? (
<b>unlock password</b>
) : (
<b>a backup of my hub data directory</b>
)}{" "}
is required to recover funds from my lightning channels.{" "}
<b>a backup of my hub data directory</b> is required to
recover funds from my lightning channels.{" "}
</Label>
</div>
)}

3
go.mod
View file

@ -31,6 +31,8 @@ require (
github.com/BurntSushi/toml v1.2.1 // indirect
github.com/DataDog/datadog-go/v5 v5.3.0 // indirect
github.com/DataDog/gostackparse v0.7.0 // indirect
github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
@ -237,6 +239,7 @@ require (
github.com/labstack/echo-jwt/v4 v4.2.0
github.com/lightningnetwork/lnd v0.18.2-beta
github.com/sirupsen/logrus v1.9.3
github.com/tyler-smith/go-bip32 v1.0.0
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
gorm.io/datatypes v1.2.4
)

10
go.sum
View file

@ -25,6 +25,10 @@ github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/
github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM=
github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE=
github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg=
github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc=
github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw=
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc=
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U=
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
@ -106,6 +110,7 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
@ -601,6 +606,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@ -634,6 +640,8 @@ github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQ
github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE=
github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk=
github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE=
github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE=
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
@ -720,6 +728,7 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@ -947,6 +956,7 @@ gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM=
modernc.org/cc/v4 v4.20.0 h1:45Or8mQfbUqJOG9WaxvlFYOAQO0lQ5RvqBcFCXngjxk=
modernc.org/cc/v4 v4.20.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
modernc.org/ccgo/v4 v4.16.0 h1:ofwORa6vx2FMm0916/CkZjpFPSR70VwTjUCe2Eg5BnA=

View file

@ -7,6 +7,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/constants"
"github.com/getAlby/hub/db"
@ -26,7 +27,7 @@ func TestHandleGetBalanceEvent(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47GetBalanceJson), nip47Request)
@ -58,7 +59,7 @@ func TestHandleGetBalanceEvent_IsolatedApp_NoTransactions(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47GetBalanceJson), nip47Request)
@ -91,7 +92,7 @@ func TestHandleGetBalanceEvent_IsolatedApp_Transactions(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47GetBalanceJson), nip47Request)

View file

@ -8,6 +8,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/constants"
"github.com/getAlby/hub/db"
@ -27,7 +28,7 @@ func TestHandleGetBudgetEvent_NoRenewal(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47GetBudgetJson), nip47Request)
@ -72,7 +73,7 @@ func TestHandleGetBudgetEvent_NoneUsed(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47GetBudgetJson), nip47Request)
@ -119,7 +120,7 @@ func TestHandleGetBudgetEvent_HalfUsed(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47GetBudgetJson), nip47Request)
@ -173,7 +174,7 @@ func TestHandleGetBudgetEvent_NoBudget(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47GetBudgetJson), nip47Request)
@ -220,7 +221,7 @@ func TestHandleGetBudgetEvent_NoPayInvoicePermission(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47GetBudgetJson), nip47Request)

View file

@ -7,6 +7,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/constants"
"github.com/getAlby/hub/db"
@ -26,7 +27,7 @@ func TestHandleGetInfoEvent_NoPermission(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -75,7 +76,7 @@ func TestHandleGetInfoEvent_WithPermission(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -123,7 +124,7 @@ func TestHandleGetInfoEvent_WithNotifications(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)

View file

@ -8,6 +8,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/constants"
"github.com/getAlby/hub/db"
@ -34,7 +35,7 @@ func TestHandleListTransactionsEvent(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47ListTransactionsJson), nip47Request)

View file

@ -8,6 +8,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/db"
"github.com/getAlby/hub/nip47/models"
@ -29,7 +30,7 @@ func TestHandleLookupInvoiceEvent(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47LookupInvoiceJson), nip47Request)

View file

@ -7,6 +7,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/db"
"github.com/getAlby/hub/nip47/models"
@ -42,7 +43,7 @@ func TestHandleMakeInvoiceEvent(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47Request := &models.Request{}
err = json.Unmarshal([]byte(nip47MakeInvoiceJson), nip47Request)

View file

@ -10,6 +10,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/constants"
"github.com/getAlby/hub/db"
@ -57,7 +58,7 @@ func TestHandleMultiPayInvoiceEvent_Success(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
var preimages = []string{"123preimage", "123preimage2"}
@ -135,7 +136,7 @@ func TestHandleMultiPayInvoiceEvent_OneMalformedInvoice(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -197,7 +198,7 @@ func TestHandleMultiPayInvoiceEvent_IsolatedApp_OneBudgetExceeded(t *testing.T)
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -279,7 +280,7 @@ func TestHandleMultiPayInvoiceEvent_LNClient_OnePaymentFailed(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
svc.LNClient.(*tests.MockLn).PayInvoiceResponses = []*lnclient.PayInvoiceResponse{{
Preimage: "123preimage",
}, nil}

View file

@ -8,6 +8,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/constants"
"github.com/getAlby/hub/db"
@ -72,7 +73,7 @@ func TestHandleMultiPayKeysendEvent_Success(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -123,7 +124,7 @@ func TestHandleMultiPayKeysendEvent_OneBudgetExceeded(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)

View file

@ -7,6 +7,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/constants"
"github.com/getAlby/hub/db"
@ -38,7 +39,7 @@ func TestHandlePayInvoiceEvent(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -77,7 +78,7 @@ func TestHandlePayInvoiceEvent_MalformedInvoice(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)

View file

@ -7,6 +7,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/getAlby/hub/constants"
"github.com/getAlby/hub/db"
@ -49,7 +50,7 @@ func TestHandlePayKeysendEvent(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -90,7 +91,7 @@ func TestHandlePayKeysendEvent_WithPreimage(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)

View file

@ -14,6 +14,7 @@ import (
"github.com/nbd-wtf/go-nostr"
"github.com/nbd-wtf/go-nostr/nip04"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TODO: test HandleEvent
@ -23,7 +24,7 @@ import (
func TestCreateResponse(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
reqPrivateKey := nostr.GeneratePrivateKey()
reqPubkey, err := nostr.GetPublicKey(reqPrivateKey)
@ -75,7 +76,7 @@ func TestCreateResponse(t *testing.T) {
func TestHandleResponse_WithPermission(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47svc := NewNip47Service(svc.DB, svc.Cfg, svc.Keys, svc.EventPublisher)
reqPrivateKey := nostr.GeneratePrivateKey()
@ -148,7 +149,7 @@ func TestHandleResponse_WithPermission(t *testing.T) {
func TestHandleResponse_DuplicateRequest(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47svc := NewNip47Service(svc.DB, svc.Cfg, svc.Keys, svc.EventPublisher)
reqPrivateKey := nostr.GeneratePrivateKey()
@ -204,7 +205,7 @@ func TestHandleResponse_DuplicateRequest(t *testing.T) {
func TestHandleResponse_NoPermission(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47svc := NewNip47Service(svc.DB, svc.Cfg, svc.Keys, svc.EventPublisher)
reqPrivateKey := nostr.GeneratePrivateKey()
@ -260,7 +261,7 @@ func TestHandleResponse_NoPermission(t *testing.T) {
func TestHandleResponse_NoApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47svc := NewNip47Service(svc.DB, svc.Cfg, svc.Keys, svc.EventPublisher)
reqPrivateKey := nostr.GeneratePrivateKey()
@ -320,7 +321,7 @@ func TestHandleResponse_NoApp(t *testing.T) {
func TestHandleResponse_IncorrectPubkey(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
nip47svc := NewNip47Service(svc.DB, svc.Cfg, svc.Keys, svc.EventPublisher)
reqPrivateKey := nostr.GeneratePrivateKey()

View file

@ -15,6 +15,7 @@ import (
"github.com/getAlby/hub/transactions"
"github.com/nbd-wtf/go-nostr/nip04"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type mockConsumer struct {
@ -35,7 +36,7 @@ func TestSendNotification_PaymentReceived(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, ss, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -115,7 +116,7 @@ func TestSendNotification_PaymentSent(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, ss, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -194,7 +195,7 @@ func TestSendNotificationNoPermission(t *testing.T) {
ctx := context.TODO()
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
_, _, err = tests.CreateApp(svc)
assert.NoError(t, err)

View file

@ -9,12 +9,13 @@ import (
"github.com/getAlby/hub/nip47/models"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestHasPermission_NoPermission(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -29,7 +30,7 @@ func TestHasPermission_NoPermission(t *testing.T) {
func TestHasPermission_Expired(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -58,7 +59,7 @@ func TestHasPermission_Expired(t *testing.T) {
/*func TestHasPermission_Exceeded(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -86,7 +87,7 @@ func TestHasPermission_Expired(t *testing.T) {
func TestHasPermission_OK(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -117,7 +118,7 @@ func TestRequestMethodToScope_GetBudget(t *testing.T) {
assert.NoError(t, err)
scope, err := RequestMethodToScope(models.GET_BUDGET_METHOD)
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, "", scope)
}
@ -146,7 +147,7 @@ func TestRequestMethodsToScopes_GetInfo(t *testing.T) {
func TestGetPermittedMethods_AlwaysGranted(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -159,7 +160,7 @@ func TestGetPermittedMethods_AlwaysGranted(t *testing.T) {
func TestGetPermittedMethods_PayInvoiceScopeGivesAllPaymentMethods(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)

View file

@ -1,22 +1,29 @@
package keys
import (
"errors"
"github.com/getAlby/hub/config"
"github.com/getAlby/hub/logger"
"github.com/nbd-wtf/go-nostr"
"github.com/tyler-smith/go-bip32"
"github.com/tyler-smith/go-bip39"
)
type Keys interface {
Init(cfg config.Config, encryptionKey string) error
// Wallet Service Nostr pubkey
// Wallet Service Nostr pubkey (DEPRECATED)
GetNostrPublicKey() string
// Wallet Service Nostr secret key
// Wallet Service Nostr secret key (DEPRECATED)
GetNostrSecretKey() string
// Derives a child BIP-32 key from the app key (derived from the mnemonic)
DeriveKey(path []uint32) (*bip32.Key, error)
}
type keys struct {
nostrSecretKey string
nostrPublicKey string
appKey *bip32.Key
}
func NewKeys() *keys {
@ -41,6 +48,29 @@ func (keys *keys) Init(cfg config.Config, encryptionKey string) error {
}
keys.nostrSecretKey = nostrSecretKey
keys.nostrPublicKey = nostrPublicKey
mnemonic, err := cfg.Get("Mnemonic", encryptionKey)
if err != nil {
logger.Logger.WithError(err).Error("Failed to decrypt mnemonic")
return err
}
if mnemonic != "" {
masterKey, err := bip32.NewMasterKey(bip39.NewSeed(mnemonic, ""))
if err != nil {
logger.Logger.WithError(err).Error("Failed to create seed from mnemonic")
return err
}
albyHubIndex := uint32(bip32.FirstHardenedChild + 128029 /* 🐝 */)
appKey, err := masterKey.NewChildKey(albyHubIndex)
if err != nil {
logger.Logger.WithError(err).Error("Failed to create seed from mnemonic")
return err
}
keys.appKey = appKey
}
return nil
}
@ -51,3 +81,19 @@ func (keys *keys) GetNostrPublicKey() string {
func (keys *keys) GetNostrSecretKey() string {
return keys.nostrSecretKey
}
func (keys *keys) DeriveKey(path []uint32) (*bip32.Key, error) {
if keys.appKey == nil {
return nil, errors.New("app key not set")
}
key := keys.appKey
for _, index := range path {
var err error
key, err = key.NewChildKey(index)
if err != nil {
return nil, err
}
}
return key, nil
}

View file

@ -24,16 +24,10 @@ import (
"github.com/getAlby/hub/logger"
)
func (svc *service) startNostr(ctx context.Context, encryptionKey string) error {
func (svc *service) startNostr(ctx context.Context) error {
relayUrl := svc.cfg.GetRelayUrl()
err := svc.keys.Init(svc.cfg, encryptionKey)
if err != nil {
logger.Logger.WithError(err).Error("Failed to init nostr keys")
return err
}
npub, err := nip19.EncodePublicKey(svc.keys.GetNostrPublicKey())
if err != nil {
logger.Logger.WithError(err).Error("Error converting nostr privkey to pubkey")
@ -130,7 +124,14 @@ func (svc *service) StartApp(encryptionKey string) error {
ctx, cancelFn := context.WithCancel(svc.ctx)
err := svc.launchLNBackend(ctx, encryptionKey)
err := svc.keys.Init(svc.cfg, encryptionKey)
if err != nil {
logger.Logger.WithError(err).Error("Failed to init nostr keys")
cancelFn()
return err
}
err = svc.launchLNBackend(ctx, encryptionKey)
if err != nil {
logger.Logger.Errorf("Failed to launch LN backend: %v", err)
svc.eventPublisher.Publish(&events.Event{
@ -140,7 +141,7 @@ func (svc *service) StartApp(encryptionKey string) error {
return err
}
err = svc.startNostr(ctx, encryptionKey)
err = svc.startNostr(ctx)
if err != nil {
cancelFn()
return err

View file

@ -9,6 +9,7 @@ import (
"github.com/getAlby/hub/db"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSendPaymentSync_App_NoPermission(t *testing.T) {
@ -16,7 +17,7 @@ func TestSendPaymentSync_App_NoPermission(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -37,7 +38,7 @@ func TestSendPaymentSync_App_WithPermission(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -70,7 +71,7 @@ func TestSendPaymentSync_App_BudgetExceeded(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -110,7 +111,7 @@ func TestSendPaymentSync_App_BudgetExceeded_SettledPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -149,7 +150,7 @@ func TestSendPaymentSync_App_BudgetExceeded_UnsettledPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -189,7 +190,7 @@ func TestSendPaymentSync_App_BudgetNotExceeded_FailedPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)

View file

@ -10,12 +10,13 @@ import (
"github.com/getAlby/hub/lnclient"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestCheckUnsettledTransaction(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
dbTransaction := db.Transaction{
State: constants.TRANSACTION_STATE_PENDING,
@ -41,7 +42,7 @@ func TestCheckUnsettledTransaction(t *testing.T) {
svc.LNClient.(*tests.MockLn).SupportedNotificationTypes = &[]string{}
transactionsService.checkUnsettledTransaction(context.TODO(), &dbTransaction, svc.LNClient)
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, constants.TRANSACTION_STATE_SETTLED, dbTransaction.State)
assert.Equal(t, 1, len(mockEventConsumer.GetConsumeEvents()))
assert.Equal(t, "nwc_payment_sent", mockEventConsumer.GetConsumeEvents()[0].Event)
@ -52,7 +53,7 @@ func TestCheckUnsettledTransaction(t *testing.T) {
func TestCheckUnsettledTransactions(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
dbTransaction := db.Transaction{
State: constants.TRANSACTION_STATE_PENDING,
@ -87,7 +88,7 @@ func TestCheckUnsettledTransactions(t *testing.T) {
svc.DB.Find(&dbTransaction, db.Transaction{
ID: dbTransaction.ID,
})
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, constants.TRANSACTION_STATE_SETTLED, dbTransaction.State)
assert.Equal(t, 1, len(mockEventConsumer.GetConsumeEvents()))
assert.Equal(t, "nwc_payment_sent", mockEventConsumer.GetConsumeEvents()[0].Event)

View file

@ -8,6 +8,7 @@ import (
"github.com/getAlby/hub/db"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSendPaymentSync_IsolatedApp_NoBalance(t *testing.T) {
@ -15,7 +16,7 @@ func TestSendPaymentSync_IsolatedApp_NoBalance(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -47,7 +48,7 @@ func TestSendPaymentSync_IsolatedApp_BalanceInsufficient(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -95,7 +96,7 @@ func TestSendPaymentSync_IsolatedApp_BalanceSufficient(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -137,7 +138,7 @@ func TestSendPaymentSync_IsolatedApp_BalanceInsufficient_OutstandingPayment(t *t
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -183,7 +184,7 @@ func TestSendPaymentSync_IsolatedApp_BalanceInsufficient_SettledPayment(t *testi
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -229,7 +230,7 @@ func TestSendPaymentSync_IsolatedApp_BalanceSufficient_UnrelatedPayment(t *testi
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -277,7 +278,7 @@ func TestSendPaymentSync_IsolatedApp_BalanceSufficient_FailedPayment(t *testing.
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)

View file

@ -13,6 +13,7 @@ import (
"github.com/getAlby/hub/lnclient"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSendKeysend(t *testing.T) {
@ -20,7 +21,7 @@ func TestSendKeysend(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockEventConsumer := tests.NewMockEventConsumer()
svc.EventPublisher.RegisterSubscriber(mockEventConsumer)
@ -52,7 +53,7 @@ func TestSendKeysend_CustomPreimage(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
customPreimage := "018465013e2337234a7e5530a21c4a8cf70d84231f4a8ff0b1e2cce3cb2bd03b"
transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
@ -78,7 +79,7 @@ func TestSendKeysend_App_NoPermission(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -100,7 +101,7 @@ func TestSendKeysend_App_WithPermission(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -142,7 +143,7 @@ func TestSendKeysend_App_BudgetExceeded(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -180,7 +181,7 @@ func TestSendKeysend_App_BudgetNotExceeded(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -223,7 +224,7 @@ func TestSendKeysend_App_BalanceExceeded(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -261,7 +262,7 @@ func TestSendKeysend_App_BalanceSufficient(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)
@ -312,7 +313,7 @@ func TestSendKeysend_TLVs(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
transaction, err := transactionsService.SendKeysend(ctx, uint64(1000), "fake destination", []lnclient.TLVRecord{
@ -360,7 +361,7 @@ func TestSendKeysend_IsolatedAppToNoApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// setup for self payment
svc.LNClient.(*tests.MockLn).Pubkey = "02a5056398235568fc049a5d563f1adf666041d590b268167e4fa145fbf71aa578"
@ -425,7 +426,7 @@ func TestSendKeysend_IsolatedAppToIsolatedApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// setup for self payment
svc.LNClient.(*tests.MockLn).Pubkey = "02a5056398235568fc049a5d563f1adf666041d590b268167e4fa145fbf71aa578"

View file

@ -9,6 +9,7 @@ import (
"github.com/getAlby/hub/db"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestListTransactions_Paid(t *testing.T) {
@ -16,7 +17,7 @@ func TestListTransactions_Paid(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -60,7 +61,7 @@ func TestListTransactions_UnpaidIncoming(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -127,7 +128,7 @@ func TestListTransactions_UnpaidOutgoing(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -194,7 +195,7 @@ func TestListTransactions_Unpaid(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -255,7 +256,7 @@ func TestListTransactions_Limit(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -291,7 +292,7 @@ func TestListTransactions_Offset(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -347,7 +348,7 @@ func TestListTransactions_FromUntil(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -397,7 +398,7 @@ func TestListTransactions_FromUntilUnpaidOutgoing(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -459,7 +460,7 @@ func TestListTransactions_FromUntilUnpaidIncoming(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{

View file

@ -8,6 +8,7 @@ import (
"github.com/getAlby/hub/db"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestLookupTransaction_IncomingPayment(t *testing.T) {
@ -15,7 +16,7 @@ func TestLookupTransaction_IncomingPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -42,7 +43,7 @@ func TestLookupTransaction_OutgoingPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{

View file

@ -11,6 +11,7 @@ import (
"github.com/getAlby/hub/db"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestMakeInvoice_NoApp(t *testing.T) {
@ -18,7 +19,7 @@ func TestMakeInvoice_NoApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
txMetadata := make(map[string]interface{})
txMetadata["randomkey"] = strings.Repeat("a", constants.INVOICE_METADATA_MAX_LENGTH-16) // json encoding adds 16 characters - {"randomkey":""}
@ -42,7 +43,7 @@ func TestMakeInvoice_MetadataTooLarge(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
metadata := make(map[string]interface{})
metadata["randomkey"] = strings.Repeat("a", constants.INVOICE_METADATA_MAX_LENGTH-15) // json encoding adds 16 characters
@ -60,7 +61,7 @@ func TestMakeInvoice_App(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
app, _, err := tests.CreateApp(svc)
assert.NoError(t, err)

View file

@ -11,6 +11,7 @@ import (
"github.com/getAlby/hub/lnclient"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestNotifications_ReceivedKnownPayment(t *testing.T) {
@ -18,7 +19,7 @@ func TestNotifications_ReceivedKnownPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
mockPreimage := tests.MockLNClientTransaction.Preimage
svc.DB.Create(&db.Transaction{
@ -54,7 +55,7 @@ func TestNotifications_ReceivedUnknownPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
@ -81,7 +82,7 @@ func TestNotifications_ReceivedKeysend(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
@ -147,7 +148,7 @@ func TestNotifications_SentKnownPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
svc.DB.Create(&db.Transaction{
State: constants.TRANSACTION_STATE_PENDING,
@ -183,7 +184,7 @@ func TestNotifications_SentUnknownPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
@ -207,7 +208,7 @@ func TestNotifications_FailedKnownPayment(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
svc.DB.Create(&db.Transaction{
State: constants.TRANSACTION_STATE_PENDING,

View file

@ -11,6 +11,7 @@ import (
"github.com/getAlby/hub/lnclient"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/gorm"
)
@ -19,7 +20,7 @@ func TestSendPaymentSync_NoApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
transaction, err := transactionsService.SendPaymentSync(ctx, tests.MockLNClientTransaction.Invoice, svc.LNClient, nil, nil)
@ -36,7 +37,7 @@ func TestSendPaymentSync_Duplicate(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
svc.DB.Create(&db.Transaction{
State: constants.TRANSACTION_STATE_SETTLED,
@ -56,7 +57,7 @@ func TestSendPaymentSync_Duplicate(t *testing.T) {
func TestMarkSettled_Sent(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
dbTransaction := db.Transaction{
State: constants.TRANSACTION_STATE_PENDING,
@ -74,7 +75,7 @@ func TestMarkSettled_Sent(t *testing.T) {
return err
})
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, constants.TRANSACTION_STATE_SETTLED, dbTransaction.State)
assert.Equal(t, 1, len(mockEventConsumer.GetConsumeEvents()))
assert.Equal(t, "nwc_payment_sent", mockEventConsumer.GetConsumeEvents()[0].Event)
@ -85,7 +86,7 @@ func TestMarkSettled_Sent(t *testing.T) {
func TestMarkSettled_Received(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
dbTransaction := db.Transaction{
State: constants.TRANSACTION_STATE_PENDING,
@ -103,7 +104,7 @@ func TestMarkSettled_Received(t *testing.T) {
return err
})
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, constants.TRANSACTION_STATE_SETTLED, dbTransaction.State)
assert.Equal(t, 1, len(mockEventConsumer.GetConsumeEvents()))
assert.Equal(t, "nwc_payment_received", mockEventConsumer.GetConsumeEvents()[0].Event)
@ -114,7 +115,7 @@ func TestMarkSettled_Received(t *testing.T) {
func TestDoNotMarkSettledTwice(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
settledAt := time.Now().Add(time.Duration(-1) * time.Minute)
dbTransaction := db.Transaction{
@ -134,14 +135,14 @@ func TestDoNotMarkSettledTwice(t *testing.T) {
return err
})
assert.Nil(t, err)
assert.NoError(t, err)
assert.Zero(t, len(mockEventConsumer.GetConsumeEvents()))
}
func TestMarkFailed(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
dbTransaction := db.Transaction{
State: constants.TRANSACTION_STATE_PENDING,
@ -158,7 +159,7 @@ func TestMarkFailed(t *testing.T) {
return transactionsService.markPaymentFailed(tx, &dbTransaction, "some routing error")
})
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, constants.TRANSACTION_STATE_FAILED, dbTransaction.State)
assert.Equal(t, 1, len(mockEventConsumer.GetConsumeEvents()))
assert.Equal(t, "nwc_payment_failed", mockEventConsumer.GetConsumeEvents()[0].Event)
@ -170,7 +171,7 @@ func TestMarkFailed(t *testing.T) {
func TestDoNotMarkFailedTwice(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
updatedAt := time.Now().Add(time.Duration(-1) * time.Minute)
dbTransaction := db.Transaction{
@ -189,7 +190,7 @@ func TestDoNotMarkFailedTwice(t *testing.T) {
return transactionsService.markPaymentFailed(tx, &dbTransaction, "some routing error")
})
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, updatedAt, dbTransaction.UpdatedAt)
assert.Zero(t, len(mockEventConsumer.GetConsumeEvents()))
}
@ -199,7 +200,7 @@ func TestSendPaymentSync_FailedRemovesFeeReserve(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
svc.LNClient.(*tests.MockLn).PayInvoiceErrors = append(svc.LNClient.(*tests.MockLn).PayInvoiceErrors, errors.New("Some error"))
svc.LNClient.(*tests.MockLn).PayInvoiceResponses = append(svc.LNClient.(*tests.MockLn).PayInvoiceResponses, nil)
@ -215,7 +216,7 @@ func TestSendPaymentSync_FailedRemovesFeeReserve(t *testing.T) {
transactionType := constants.TRANSACTION_TYPE_OUTGOING
transaction, err = transactionsService.LookupTransaction(ctx, tests.MockLNClientTransaction.PaymentHash, &transactionType, svc.LNClient, nil)
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, uint64(123000), transaction.AmountMsat)
assert.Equal(t, constants.TRANSACTION_STATE_FAILED, transaction.State)
@ -231,7 +232,7 @@ func TestSendPaymentSync_PendingHasFeeReserve(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// timeout will leave the payment as pending
svc.LNClient.(*tests.MockLn).PayInvoiceErrors = append(svc.LNClient.(*tests.MockLn).PayInvoiceErrors, lnclient.NewTimeoutError())
@ -245,7 +246,7 @@ func TestSendPaymentSync_PendingHasFeeReserve(t *testing.T) {
transactionType := constants.TRANSACTION_TYPE_OUTGOING
transaction, err = transactionsService.LookupTransaction(ctx, tests.MockLNClientTransaction.PaymentHash, &transactionType, svc.LNClient, nil)
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, uint64(123000), transaction.AmountMsat)
assert.Equal(t, constants.TRANSACTION_STATE_PENDING, transaction.State)

View file

@ -10,6 +10,7 @@ import (
"github.com/getAlby/hub/lnclient"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestReceiveKeysendWithCustomKey(t *testing.T) {
@ -17,7 +18,7 @@ func TestReceiveKeysendWithCustomKey(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
app, _, err := tests.CreateApp(svc)
@ -64,7 +65,7 @@ func TestReceiveKeysend(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
_, _, err = tests.CreateApp(svc)

View file

@ -9,6 +9,7 @@ import (
"github.com/getAlby/hub/db/queries"
"github.com/getAlby/hub/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSendPaymentSync_SelfPayment_NoAppToNoApp(t *testing.T) {
@ -16,7 +17,7 @@ func TestSendPaymentSync_SelfPayment_NoAppToNoApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// pubkey matches mock invoice = self payment
svc.LNClient.(*tests.MockLn).Pubkey = "02a5056398235568fc049a5d563f1adf666041d590b268167e4fa145fbf71aa578"
@ -58,7 +59,7 @@ func TestSendPaymentSync_SelfPayment_NoAppToIsolatedApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// pubkey matches mock invoice = self payment
svc.LNClient.(*tests.MockLn).Pubkey = "02a5056398235568fc049a5d563f1adf666041d590b268167e4fa145fbf71aa578"
@ -113,7 +114,7 @@ func TestSendPaymentSync_SelfPayment_NoAppToApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// pubkey matches mock invoice = self payment
svc.LNClient.(*tests.MockLn).Pubkey = "02a5056398235568fc049a5d563f1adf666041d590b268167e4fa145fbf71aa578"
@ -164,7 +165,7 @@ func TestSendPaymentSync_SelfPayment_IsolatedAppToNoApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// pubkey matches mock invoice = self payment
svc.LNClient.(*tests.MockLn).Pubkey = "02a5056398235568fc049a5d563f1adf666041d590b268167e4fa145fbf71aa578"
@ -236,7 +237,7 @@ func TestSendPaymentSync_SelfPayment_IsolatedAppToApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// pubkey matches mock invoice = self payment
svc.LNClient.(*tests.MockLn).Pubkey = "02a5056398235568fc049a5d563f1adf666041d590b268167e4fa145fbf71aa578"
@ -312,7 +313,7 @@ func TestSendPaymentSync_SelfPayment_IsolatedAppToIsolatedApp(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// pubkey matches mock invoice = self payment
svc.LNClient.(*tests.MockLn).Pubkey = "02a5056398235568fc049a5d563f1adf666041d590b268167e4fa145fbf71aa578"
@ -405,7 +406,7 @@ func TestSendPaymentSync_SelfPayment_IsolatedAppToSelf(t *testing.T) {
defer tests.RemoveTestService()
svc, err := tests.CreateTestService()
assert.NoError(t, err)
require.NoError(t, err)
// pubkey matches mock invoice = self payment
svc.LNClient.(*tests.MockLn).Pubkey = "02a5056398235568fc049a5d563f1adf666041d590b268167e4fa145fbf71aa578"