Files
ark/pkg/client-sdk/wallet/wallet_test.go
Louis Singer 4da76ec88b New boarding protocol (#279)
* [domain] add reverse boarding inputs in Payment struct

* [tx-builder] support reverse boarding script

* [wallet] add GetTransaction

* [api-spec][application] add reverse boarding support in covenantless

* [config] add reverse boarding config

* [api-spec] add ReverseBoardingAddress RPC

* [domain][application] support empty forfeits txs in EndFinalization events

* [tx-builder] optional connector output in round tx

* [btc-embedded] fix getTx and taproot finalizer

* whitelist ReverseBoardingAddress RPC

* [test] add reverse boarding integration test

* [client] support reverse boarding

* [sdk] support reverse boarding

* [e2e] add sleep time after faucet

* [test] run using bitcoin-core RPC

* [tx-builder] fix GetSweepInput

* [application][tx-builder] support reverse onboarding in covenant

* [cli] support reverse onboarding in covenant CLI

* [test] rework integration tests

* [sdk] remove onchain wallet, replace by onboarding address

* remove old onboarding protocols

* [sdk] Fix RegisterPayment

* [e2e] add more funds to covenant ASP

* [e2e] add sleeping time

* several fixes

* descriptor boarding

* remove boarding delay from info

* [sdk] implement descriptor boarding

* go mod tidy

* fixes and revert error msgs

* move descriptor pkg to common

* add replace in go.mod

* [sdk] fix unit tests

* rename DescriptorInput --> BoardingInput

* genrest in SDK

* remove boarding input from domain

* remove all "reverse boarding"

* rename "onboarding" ==> "boarding"

* remove outdate payment unit test

* use tmpfs docker volument for compose testing files

* several fixes
2024-09-04 19:21:26 +02:00

150 lines
4.6 KiB
Go

package wallet_test
import (
"context"
"strings"
"testing"
"github.com/ark-network/ark/common"
"github.com/ark-network/ark/pkg/client-sdk/client"
"github.com/ark-network/ark/pkg/client-sdk/store"
inmemorystore "github.com/ark-network/ark/pkg/client-sdk/store/inmemory"
"github.com/ark-network/ark/pkg/client-sdk/wallet"
singlekeywallet "github.com/ark-network/ark/pkg/client-sdk/wallet/singlekey"
inmemorywalletstore "github.com/ark-network/ark/pkg/client-sdk/wallet/singlekey/store/inmemory"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/stretchr/testify/require"
)
func TestWallet(t *testing.T) {
ctx := context.Background()
key, _ := btcec.NewPrivateKey()
password := "password"
testStoreData := store.StoreData{
AspUrl: "localhost:7070",
AspPubkey: key.PubKey(),
WalletType: wallet.SingleKeyWallet,
ClientType: client.GrpcClient,
Network: common.LiquidRegTest,
RoundLifetime: 512,
UnilateralExitDelay: 512,
MinRelayFee: 300,
BoardingDescriptorTemplate: "tr(0250929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,{ and(pk(873079a0091c9b16abd1f8c508320b07f0d50144d09ccd792ce9c915dac60465), pk(USER)), and(older(604672), pk(USER)) })",
}
tests := []struct {
name string
chain string
args []interface{}
}{
{
name: "liquid" + wallet.SingleKeyWallet,
chain: "liquid",
args: []interface{}{common.LiquidRegTest},
},
{
name: "bitcoin" + wallet.SingleKeyWallet,
chain: "bitcoin",
args: []interface{}{common.LiquidRegTest},
},
}
for i := range tests {
tt := tests[i]
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
store, err := inmemorystore.NewConfigStore()
require.NoError(t, err)
require.NotNil(t, store)
err = store.AddData(ctx, testStoreData)
require.NoError(t, err)
walletStore, err := inmemorywalletstore.NewWalletStore()
require.NoError(t, err)
require.NotNil(t, walletStore)
var walletSvc wallet.WalletService
if tt.chain == "liquid" {
walletSvc, err = singlekeywallet.NewLiquidWallet(store, walletStore)
} else {
walletSvc, err = singlekeywallet.NewBitcoinWallet(store, walletStore)
}
require.NoError(t, err)
require.NotNil(t, walletSvc)
key, err := walletSvc.Create(ctx, password, "")
require.NoError(t, err)
require.NotEmpty(t, key)
offchainAddr, onchainAddr, err := walletSvc.NewAddress(ctx, false)
require.NoError(t, err)
require.NotEmpty(t, offchainAddr)
require.NotEmpty(t, onchainAddr)
offchainAddrs, onchainAddrs, redemptionAddrs, err := walletSvc.GetAddresses(ctx)
require.NoError(t, err)
require.Len(t, offchainAddrs, 1)
require.Len(t, onchainAddrs, 1)
require.Len(t, redemptionAddrs, 1)
offchainAddr, onchainAddr, err = walletSvc.NewAddress(ctx, true)
require.NoError(t, err)
require.NotEmpty(t, offchainAddr)
require.NotEmpty(t, onchainAddr)
expectedNumOfAddresses := 2
if strings.Contains(tt.name, wallet.SingleKeyWallet) {
expectedNumOfAddresses = 1
}
offchainAddrs, onchainAddrs, redemptionAddrs, err = walletSvc.GetAddresses(ctx)
require.NoError(t, err)
require.Len(t, offchainAddrs, expectedNumOfAddresses)
require.Len(t, onchainAddrs, expectedNumOfAddresses)
require.Len(t, redemptionAddrs, expectedNumOfAddresses)
num := 3
offchainAddrs, onchainAddrs, err = walletSvc.NewAddresses(ctx, false, num)
require.NoError(t, err)
require.Len(t, offchainAddrs, num)
require.Len(t, onchainAddrs, num)
expectedNumOfAddresses += num
if strings.Contains(tt.name, wallet.SingleKeyWallet) {
expectedNumOfAddresses = 1
}
offchainAddrs, onchainAddrs, redemptionAddrs, err = walletSvc.GetAddresses(ctx)
require.NoError(t, err)
require.Len(t, offchainAddrs, expectedNumOfAddresses)
require.Len(t, onchainAddrs, expectedNumOfAddresses)
require.Len(t, redemptionAddrs, expectedNumOfAddresses)
// Check no password is required to unlock if wallet is already unlocked.
alreadyUnlocked, err := walletSvc.Unlock(ctx, password)
require.NoError(t, err)
require.False(t, alreadyUnlocked)
alreadyUnlocked, err = walletSvc.Unlock(ctx, "")
require.NoError(t, err)
require.True(t, alreadyUnlocked)
// Check no password is required to lock if wallet is already locked.
err = walletSvc.Lock(ctx, password)
require.NoError(t, err)
err = walletSvc.Lock(ctx, "")
require.NoError(t, err)
locked := walletSvc.IsLocked()
require.True(t, locked)
_, err = walletSvc.Unlock(ctx, password)
require.NoError(t, err)
locked = walletSvc.IsLocked()
require.False(t, locked)
})
}
}