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 }