github.com/0chain/gosdk@v1.17.11/zcncore/ethhdwallet/hdwallet_test.go (about)

     1  package hdwallet
     2  
     3  import (
     4  	"math/big"
     5  	"os"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/ethereum/go-ethereum/accounts"
    10  	"github.com/ethereum/go-ethereum/common"
    11  	"github.com/ethereum/go-ethereum/common/hexutil"
    12  	"github.com/ethereum/go-ethereum/core/types"
    13  	"github.com/ethereum/go-ethereum/crypto"
    14  )
    15  
    16  // TODO: table test
    17  
    18  func TestIssue172(t *testing.T) {
    19  	mnemonic := "sound practice disease erupt basket pumpkin truck file gorilla behave find exchange napkin boy congress address city net prosper crop chair marine chase seven"
    20  
    21  	getWallet := func() *Wallet {
    22  		wallet, err := NewFromMnemonic(mnemonic)
    23  		if err != nil {
    24  			t.Error(err)
    25  		}
    26  		return wallet
    27  	}
    28  
    29  	path, err := ParseDerivationPath("m/44'/60'/0'/0/0")
    30  	if err != nil {
    31  		t.Error(err)
    32  	}
    33  
    34  	// Reset Envars
    35  	os.Setenv(issue179FixEnvar, "")
    36  
    37  	// Derive the old (wrong way)
    38  	account, err := getWallet().Derive(path, false)
    39  	if err != nil {
    40  		t.Error(err)
    41  	}
    42  
    43  	if account.Address.Hex() != "0x3943412CBEEEd4b68d73382b136F36b0CB82F481" {
    44  		t.Error("wrong address")
    45  	}
    46  
    47  	// Set envar to non-zero length to derive correctly
    48  	os.Setenv(issue179FixEnvar, "1")
    49  	account, err = getWallet().Derive(path, false)
    50  	if err != nil {
    51  		t.Error(err)
    52  	}
    53  	if account.Address.Hex() != "0x98e440675eFF3041D20bECb7fE7e81746A431b6d" {
    54  		t.Error("wrong address")
    55  	}
    56  
    57  	// Reset Envars
    58  	os.Setenv(issue179FixEnvar, "")
    59  	wallet := getWallet()
    60  	wallet.SetFixIssue172(true)
    61  	account, err = wallet.Derive(path, false)
    62  	if err != nil {
    63  		t.Error(err)
    64  	}
    65  	if account.Address.Hex() != "0x98e440675eFF3041D20bECb7fE7e81746A431b6d" {
    66  		t.Error("wrong address")
    67  	}
    68  }
    69  
    70  func TestWallet(t *testing.T) {
    71  	mnemonic := "tag volcano eight thank tide danger coast health above argue embrace heavy"
    72  	wallet, err := NewFromMnemonic(mnemonic)
    73  	if err != nil {
    74  		t.Error(err)
    75  	}
    76  	// Check that Wallet implements the accounts.Wallet interface.
    77  	var _ accounts.Wallet = wallet
    78  
    79  	path, err := ParseDerivationPath("m/44'/60'/0'/0/0")
    80  	if err != nil {
    81  		t.Error(err)
    82  	}
    83  
    84  	account, err := wallet.Derive(path, false)
    85  	if err != nil {
    86  		t.Error(err)
    87  	}
    88  
    89  	if account.Address.Hex() != "0xC49926C4124cEe1cbA0Ea94Ea31a6c12318df947" {
    90  		t.Error("wrong address")
    91  	}
    92  
    93  	if len(wallet.Accounts()) != 0 {
    94  		t.Error("expected 0")
    95  	}
    96  
    97  	account, err = wallet.Derive(path, true)
    98  	if err != nil {
    99  		t.Error(err)
   100  	}
   101  
   102  	if len(wallet.Accounts()) != 1 {
   103  		t.Error("expected 1")
   104  	}
   105  
   106  	if !wallet.Contains(account) {
   107  		t.Error("expected to contain account")
   108  	}
   109  
   110  	url := wallet.URL()
   111  	if url.String() != "" {
   112  		t.Error("expected empty url")
   113  	}
   114  
   115  	if err := wallet.Open(""); err != nil {
   116  		t.Error(err)
   117  	}
   118  
   119  	if err := wallet.Close(); err != nil {
   120  		t.Error(err)
   121  	}
   122  
   123  	status, err := wallet.Status()
   124  	if err != nil {
   125  		t.Error(err)
   126  	}
   127  
   128  	if status != "ok" {
   129  		t.Error("expected status ok")
   130  	}
   131  
   132  	accountPath, err := wallet.Path(account)
   133  	if err != nil {
   134  		t.Error(err)
   135  	}
   136  
   137  	if accountPath != `m/44'/60'/0'/0/0` {
   138  		t.Error("wrong hdpath")
   139  	}
   140  
   141  	privateKeyHex, err := wallet.PrivateKeyHex(account)
   142  	if err != nil {
   143  		t.Error(err)
   144  	}
   145  
   146  	if privateKeyHex != "63e21d10fd50155dbba0e7d3f7431a400b84b4c2ac1ee38872f82448fe3ecfb9" {
   147  		t.Error("wrong private key")
   148  	}
   149  
   150  	publicKeyHex, err := wallet.PublicKeyHex(account)
   151  	if err != nil {
   152  		t.Error(err)
   153  	}
   154  
   155  	if publicKeyHex != "6005c86a6718f66221713a77073c41291cc3abbfcd03aa4955e9b2b50dbf7f9b6672dad0d46ade61e382f79888a73ea7899d9419becf1d6c9ec2087c1188fa18" {
   156  		t.Error("wrong public key")
   157  	}
   158  
   159  	addressHex, err := wallet.AddressHex(account)
   160  	if err != nil {
   161  		t.Error(err)
   162  	}
   163  
   164  	if addressHex != "0xC49926C4124cEe1cbA0Ea94Ea31a6c12318df947" {
   165  		t.Error("wrong address")
   166  	}
   167  
   168  	nonce := uint64(0)
   169  	value := big.NewInt(1000000000000000000)
   170  	toAddress := common.HexToAddress("0x0")
   171  	gasLimit := uint64(21000)
   172  	gasPrice := big.NewInt(21000000000)
   173  	data := []byte{}
   174  
   175  	tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, data)
   176  
   177  	signedTx, err := wallet.SignTx(account, tx, nil)
   178  	if err != nil {
   179  		t.Error(err)
   180  	}
   181  
   182  	v, r, s := signedTx.RawSignatureValues()
   183  	if v.Cmp(big.NewInt(0)) != 1 {
   184  		t.Error("expected v value")
   185  	}
   186  	if r.Cmp(big.NewInt(0)) != 1 {
   187  		t.Error("expected r value")
   188  	}
   189  	if s.Cmp(big.NewInt(0)) != 1 {
   190  		t.Error("expected s value")
   191  	}
   192  
   193  	signedTx2, err := wallet.SignTxWithPassphrase(account, "", tx, nil)
   194  	if err != nil {
   195  		t.Error(err)
   196  	}
   197  	if signedTx.Hash() != signedTx2.Hash() {
   198  		t.Error("expected match")
   199  	}
   200  
   201  	signedTx3, err := wallet.SignTxEIP155(account, tx, big.NewInt(42))
   202  	if err != nil {
   203  		t.Error(err)
   204  	}
   205  
   206  	v, r, s = signedTx3.RawSignatureValues()
   207  	if v.Cmp(big.NewInt(0)) != 1 {
   208  		t.Error("expected v value")
   209  	}
   210  	if r.Cmp(big.NewInt(0)) != 1 {
   211  		t.Error("expected r value")
   212  	}
   213  	if s.Cmp(big.NewInt(0)) != 1 {
   214  		t.Error("expected s value")
   215  	}
   216  
   217  	data = []byte("hello")
   218  	hash := crypto.Keccak256Hash(data)
   219  	sig, err := wallet.SignHash(account, hash.Bytes())
   220  	if err != nil {
   221  		t.Error(err)
   222  	}
   223  	if len(sig) == 0 {
   224  		t.Error("expected signature")
   225  	}
   226  
   227  	sig2, err := wallet.SignHashWithPassphrase(account, "", hash.Bytes())
   228  	if err != nil {
   229  		t.Error(err)
   230  	}
   231  	if len(sig2) == 0 {
   232  		t.Error("expected signature")
   233  	}
   234  	if hexutil.Encode(sig) != hexutil.Encode(sig2) {
   235  		t.Error("expected match")
   236  	}
   237  
   238  	mimeType := "text/plain"
   239  	signedData, err := wallet.SignData(account, mimeType, []byte("hello world"))
   240  	if err != nil {
   241  		t.Error(err)
   242  	}
   243  	if len(signedData) == 0 {
   244  		t.Error("Expected signature")
   245  	}
   246  
   247  	signedTextData, err := wallet.SignText(account, []byte("hello world"))
   248  	if err != nil {
   249  		t.Error(err)
   250  	}
   251  	if len(signedTextData) == 0 {
   252  		t.Error("Expected signature")
   253  	}
   254  
   255  	signedData2, err := wallet.SignDataWithPassphrase(account, "", mimeType, []byte("hello world"))
   256  	if err != nil {
   257  		t.Error(err)
   258  	}
   259  	if len(signedData2) == 0 {
   260  		t.Error("Expected signature")
   261  	}
   262  
   263  	signedData3, err := wallet.SignTextWithPassphrase(account, "", []byte("hello world"))
   264  	if err != nil {
   265  		t.Error(err)
   266  	}
   267  	if len(signedData3) == 0 {
   268  		t.Error("Expected signature")
   269  	}
   270  
   271  	err = wallet.Unpin(account)
   272  	if err != nil {
   273  		t.Error(err)
   274  	}
   275  
   276  	if wallet.Contains(account) {
   277  		t.Error("expected to not contain account")
   278  	}
   279  
   280  	// seed test
   281  
   282  	seed, err := NewSeedFromMnemonic(mnemonic)
   283  	if err != nil {
   284  		t.Error(err)
   285  	}
   286  
   287  	wallet, err = NewFromSeed(seed)
   288  	if err != nil {
   289  		t.Error(err)
   290  	}
   291  
   292  	path = MustParseDerivationPath("m/44'/60'/0'/0/0")
   293  	account, err = wallet.Derive(path, false)
   294  	if err != nil {
   295  		t.Error(err)
   296  	}
   297  
   298  	if account.Address.Hex() != "0xC49926C4124cEe1cbA0Ea94Ea31a6c12318df947" {
   299  		t.Error("wrong address")
   300  	}
   301  
   302  	seed, err = NewSeed()
   303  	if err != nil {
   304  		t.Error(err)
   305  	}
   306  
   307  	if len(seed) != 64 {
   308  		t.Error("expected size of 64")
   309  	}
   310  
   311  	seed, err = NewSeedFromMnemonic(mnemonic)
   312  	if err != nil {
   313  		t.Error(err)
   314  	}
   315  
   316  	if len(seed) != 64 {
   317  		t.Error("expected size of 64")
   318  	}
   319  
   320  	mnemonic, err = NewMnemonic(128)
   321  	if err != nil {
   322  		t.Error(err)
   323  	}
   324  
   325  	words := strings.Split(mnemonic, " ")
   326  	if len(words) != 12 {
   327  		t.Error("expected 12 words")
   328  	}
   329  
   330  	entropy, err := NewEntropy(128)
   331  	if err != nil {
   332  		t.Error(err)
   333  	}
   334  
   335  	mnemonic, err = NewMnemonicFromEntropy(entropy)
   336  	if err != nil {
   337  		t.Error(err)
   338  	}
   339  
   340  	words = strings.Split(mnemonic, " ")
   341  	if len(words) != 12 {
   342  		t.Error("expected 12 words")
   343  	}
   344  }