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 }