github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/libkb/cryptocurrency_test.go (about)

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package libkb
     5  
     6  import (
     7  	"encoding/hex"
     8  	"testing"
     9  )
    10  
    11  func doBase58Test(t *testing.T, startingHex, expectedBase58 string) {
    12  	startingBytes, err := hex.DecodeString(startingHex)
    13  	if err != nil {
    14  		t.Fatalf("Not valid hex: '%s'", startingHex)
    15  	}
    16  	base58 := Base58.EncodeToString(startingBytes)
    17  	if base58 != expectedBase58 {
    18  		t.Fatalf("'%s' was converted to '%s' instead of '%s'", startingHex, base58, expectedBase58)
    19  	}
    20  	backToBytes, err := Base58.DecodeString(base58)
    21  	if err != nil {
    22  		t.Fatalf("Not valid base58: '%s'", base58)
    23  	}
    24  	backToHex := hex.EncodeToString(backToBytes)
    25  	if backToHex != startingHex {
    26  		t.Fatalf("'%s' round tripped to '%s'", startingHex, backToHex)
    27  	}
    28  }
    29  
    30  func TestBase58(t *testing.T) {
    31  	doBase58Test(t, "", "")
    32  	doBase58Test(t, "00", "1")
    33  	doBase58Test(t, "0000", "11")
    34  	doBase58Test(t, "01", "2")
    35  	doBase58Test(t, "00ff00", "1LQX")
    36  }
    37  
    38  var testVectors = []struct {
    39  	address    string
    40  	wantedType CryptocurrencyType
    41  }{
    42  	{"zcCk6rKzynC4tT1Rmg325A5Xw81Ck3S6nD6mtPWCXaMtyFczkyU4kYjEhrcz2QKfF5T2siWGyJNxWo43XWT3qk5YpPhFGj2", CryptocurrencyTypeZCashShielded},
    43  	{"zcCk6rKzynC4tT1Rmg325A5Xw81Ck3S6nD6mtPWCXaMtyFczkyU4kYjEhrcz2QKfF5T2siWGyJNxWo43XWT3qk5YpPhFGj2x", CryptocurrencyTypeNone},
    44  	{"zcCk6rKzynC4tT1Rmg325A5Xw81Ck3S6nD6mtPWCXaMtyFczkyU4kYjEhrcz2QKfF5T2siWGyJNxWo43XWT3qk5YpPhFGj3", CryptocurrencyTypeNone},
    45  	{"t1c3Ebc6FBbWuirNrjJ6HbS4KHLb6Dbh5xL", CryptocurrencyTypeZCashTransparentP2PKH},
    46  	{"t1c3Ebc6FBbWuirNrjJ6HbS4KHLb6Dbh5xLx", CryptocurrencyTypeNone},
    47  	{"t1c3Ebc6FBbWuirNrjJ6HbS4KHLb6Dbh5xx", CryptocurrencyTypeNone},
    48  	{"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy", CryptocurrencyTypeBTCMultiSig},
    49  	{"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLyx", CryptocurrencyTypeNone},
    50  	{"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLx", CryptocurrencyTypeNone},
    51  	{"zs165czn4y5jfa552kux7yl3y5l8ge4cl6af45y9dh3yzfnkgd68vajyjdlkht54ve958qx693jjak", CryptocurrencyTypeZCashSapling},
    52  	{"zs1x2q4pej08shm9pd5fx8jvl97f8f7t8sej8lsgp08jsczxsucr5gkff0yasc0gc43dtv3wczerv5", CryptocurrencyTypeZCashSapling},
    53  	{"zs1fw4tgx9gccv2f8af6ugu727slx7pq0nc46yflcuqyluruxtcmg20hxh3r4d9ec9yejj6gfrf2hc", CryptocurrencyTypeZCashSapling},
    54  	{"ZS1FW4TGX9GCCV2F8AF6UGU727SLX7PQ0NC46YFLCUQYLURUXTCMG20HXH3R4D9EC9YEJJ6GFRF2HC", CryptocurrencyTypeZCashSapling},
    55  	{"zs1fw4tgx9gccv2f8af6ugu727slx7pq0nc46yflcuqyluruxtcmg20hxh3r4d9ec9yejj6gfrf2hd", CryptocurrencyTypeNone},
    56  	{"bc1qcerjvfmt8qr8xlp6pv4htjhwlj2wgdjnayc3cc", CryptocurrencyTypeBTCSegwit},
    57  }
    58  
    59  func TestCryptocurrencyParseAndCheck(t *testing.T) {
    60  	for i, v := range testVectors {
    61  		typ, _, err := CryptocurrencyParseAndCheck(v.address)
    62  		if typ != v.wantedType {
    63  			t.Fatalf("Address %s (%d): got wrong CryptocurrencyTyp: %d != %d (%v)", v.address, i, typ, v.wantedType, err)
    64  		}
    65  	}
    66  }
    67  
    68  func TestAddressValidation(t *testing.T) {
    69  	btcTestAddrs := []struct {
    70  		address string
    71  		valid   bool
    72  	}{
    73  		{"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy", true},
    74  		{"4J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy", false}, // changed first digit
    75  		{"bc1qcerjvfmt8qr8xlp6pv4htjhwlj2wgdjnayc3cc", true},
    76  		{"bc1qcerjvfmt8qr8xlp6pv4htjhwlj2wgdjnaycccc", false}, // bad checksum
    77  		{"bc11cerjvfmt8qr8xlp6pv4htjhwlj2wgdjnayc3cc", false},
    78  		{"bc20cerjvfmt8qr8xlp6pv4htjhwlj2wgdjnayc3cc", false},
    79  		{"bc1q7k78aepp3epmlzvxwvvhc4up849efeg7r5j0xk", true},
    80  		{"BC1QCERJVFMT8QR8XLP6PV4HTJHWLJ2WGDJNAYC3CC", true}, // uppercase is accepted
    81  		{"bc1qc7slrfxkknqcq2jevvvkdgvrt8080852dfjewde450xdlk4ugp7szw5tk9", true},
    82  	}
    83  	for _, testAddr := range btcTestAddrs {
    84  		_, _, err := BtcAddrCheck(testAddr.address, nil)
    85  		if testAddr.valid && err != nil {
    86  			t.Fatalf("Failed to validate a good address %s.", testAddr.address)
    87  		}
    88  		if !testAddr.valid && err == nil {
    89  			t.Fatalf("Failed to catch a bad address %s.", testAddr.address)
    90  		}
    91  	}
    92  }