Files
ark/pkg/client-sdk/wallet/wallet_test.go
Pietralberto Mazza 89df461623 Update client sdk (#207)
* Add bitcoin networks

* Refactor client

* Refactor explorer

* Refactor store

* Refactor wallet

* Refactor sdk client

* Refactor wasm & Update examples

* Move common util funcs to internal/utils

* Move to constants for service types

* Add unit tests

* Parallelize tests

* Lint

* Add job to gh action

* go mod tidy

* Fixes

* Fixes

* Fix compose file

* Fixes

* Fixes after review:
* Drop factory pattern
* Drop password from ark client methods
* Make singlekey wallet manage store and wallet store instead of defining WalletStore as extension of Store
* Move constants to arksdk module
* Drop config and expect directory store and wallet as ark client factory args

* Fix

* Add constants for bitcoin/liquid explorer

* Fix test

* Fix wasm

* Rename client.Client to client.ASPClient

* Rename store.Store to store.ConfigStore

* Rename wallet.Wallet to wallet.WalletService

* Renamings

* Lint

* Fixes

* Move everything to internal/utils & move ComputeVtxoTaprootScript to common

* Go mod tidy
2024-07-30 16:08:23 +02:00

132 lines
3.8 KiB
Go

package wallet_test
import (
"context"
"testing"
"github.com/ark-network/ark-sdk/client"
"github.com/ark-network/ark-sdk/store"
inmemorystore "github.com/ark-network/ark-sdk/store/inmemory"
"github.com/ark-network/ark-sdk/wallet"
liquidwallet "github.com/ark-network/ark-sdk/wallet/singlekey/liquid"
inmemorywalletstore "github.com/ark-network/ark-sdk/wallet/singlekey/store/inmemory"
"github.com/ark-network/ark/common"
"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:8080",
AspPubkey: key.PubKey(),
WalletType: wallet.SingleKeyWallet,
ClientType: client.GrpcClient,
Network: common.LiquidRegTest,
RoundLifetime: 512,
UnilateralExitDelay: 512,
MinRelayFee: 300,
}
tests := []struct {
name string
chain string
args []interface{}
}{
{
name: wallet.SingleKeyWallet,
chain: "liquid",
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 = liquidwallet.NewWalletService(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 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 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)
})
}
}