github.com/MetalBlockchain/metalgo@v1.11.9/utils/crypto/ledger/ledger_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package ledger
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/MetalBlockchain/metalgo/utils/crypto/secp256k1"
    12  	"github.com/MetalBlockchain/metalgo/utils/formatting/address"
    13  	"github.com/MetalBlockchain/metalgo/utils/hashing"
    14  )
    15  
    16  const (
    17  	chainAlias = "P"
    18  	hrp        = "fuji"
    19  )
    20  
    21  // TestLedger will be skipped if a ledger is not connected.
    22  func TestLedger(t *testing.T) {
    23  	require := require.New(t)
    24  
    25  	// Initialize Ledger
    26  	device, err := New()
    27  	if err != nil {
    28  		t.Skip("ledger not detected")
    29  	}
    30  
    31  	// Get version
    32  	version, err := device.Version()
    33  	require.NoError(err)
    34  	t.Logf("version: %s\n", version)
    35  
    36  	// Get Fuji Address
    37  	addr, err := device.Address(hrp, 0)
    38  	require.NoError(err)
    39  	paddr, err := address.Format(chainAlias, hrp, addr[:])
    40  	require.NoError(err)
    41  	t.Logf("address: %s shortID: %s\n", paddr, addr)
    42  
    43  	// Get Extended Addresses
    44  	addresses, err := device.Addresses([]uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
    45  	require.NoError(err)
    46  	for i, taddr := range addresses {
    47  		paddr, err := address.Format(chainAlias, hrp, taddr[:])
    48  		require.NoError(err)
    49  		t.Logf("address(%d): %s shortID: %s\n", i, paddr, taddr)
    50  
    51  		// Ensure first derived address matches directly requested address
    52  		if i == 0 {
    53  			require.Equal(addr, taddr, "address mismatch at index 0")
    54  		}
    55  	}
    56  
    57  	// Sign Hash
    58  	rawHash := hashing.ComputeHash256([]byte{0x1, 0x2, 0x3, 0x4})
    59  	indices := []uint32{1, 3}
    60  	sigs, err := device.SignHash(rawHash, indices)
    61  	require.NoError(err)
    62  	require.Len(sigs, 2)
    63  
    64  	for i, addrIndex := range indices {
    65  		sig := sigs[i]
    66  
    67  		pk, err := secp256k1.RecoverPublicKeyFromHash(rawHash, sig)
    68  		require.NoError(err)
    69  		require.Equal(addresses[addrIndex], pk.Address())
    70  	}
    71  
    72  	// Disconnect
    73  	require.NoError(device.Disconnect())
    74  }