Skip to content

Commit 77f10cd

Browse files
authored
packages: Additional tests around shielded keys (#1129)
* feat: additional tests around shielded keys * feat: add test for shielded from mnemonic seed
1 parent 6bd1e33 commit 77f10cd

File tree

5 files changed

+84
-10
lines changed

5 files changed

+84
-10
lines changed

packages/crypto/lib/src/crypto/bip39.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,24 @@ mod tests {
114114
assert_eq!(seed.vec.len(), 64);
115115
}
116116

117+
#[wasm_bindgen_test]
118+
fn can_restore_seed_from_phrase() {
119+
let phrase = "caught pig embody hip goose like become worry face oval manual flame \
120+
pizza steel viable proud eternal speed chapter sunny boat because view bullet";
121+
let seed_bytes = vec![
122+
178, 64, 160, 168, 33, 68, 84, 63, 0, 137, 121, 29, 66, 47, 123, 36, 64, 38, 160, 236,
123+
93, 38, 53, 157, 169, 119, 42, 153, 188, 80, 209, 149, 51, 92, 251, 168, 150, 220, 70,
124+
78, 230, 16, 152, 160, 85, 248, 115, 82, 183, 126, 96, 112, 58, 238, 230, 63, 89, 239,
125+
0, 250, 163, 169, 166, 174,
126+
];
127+
let mnemonic = Mnemonic::from_phrase(phrase.into()).unwrap();
128+
let seed = mnemonic
129+
.to_seed(None)
130+
.expect("Should return seed from mnemonic phrase");
131+
132+
assert_eq!(seed.vec, seed_bytes);
133+
}
134+
117135
#[wasm_bindgen_test]
118136
fn invalid_phrase_should_panic() {
119137
let bad_phrase = "caught pig embody hip goose like become";

packages/crypto/lib/src/crypto/zip32.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ impl ShieldedHDWallet {
8686
#[cfg(test)]
8787
mod tests {
8888
use super::*;
89+
use crate::crypto::bip39;
8990
use masp_primitives::sapling::PaymentAddress;
9091
use wasm_bindgen_test::*;
9192

@@ -109,7 +110,7 @@ mod tests {
109110
}
110111

111112
#[wasm_bindgen_test]
112-
fn can_derive_child_to_serialized() {
113+
fn can_derive_shielded_key_to_serialized() {
113114
let seed = JsValue::from(js_sys::Uint8Array::new_with_length(64));
114115
let shielded_wallet =
115116
ShieldedHDWallet::new(seed).expect("Instantiating ShieldedHDWallet should not fail");
@@ -134,4 +135,36 @@ mod tests {
134135
assert_eq!(xsk.expsk.to_bytes().len(), KEY_SIZE);
135136
assert_eq!(xfvk.fvk.to_bytes().len(), KEY_SIZE);
136137
}
138+
139+
#[wasm_bindgen_test]
140+
fn can_restore_shielded_keys_from_mnemonic() {
141+
let phrase = "great sphere inmate december menu warrior adjust glass flat heavy act mail";
142+
let mnemonic = bip39::Mnemonic::from_phrase(phrase.into()).unwrap();
143+
let seed = mnemonic
144+
.to_seed(None)
145+
.expect("Should return seed from mnemonic phrase");
146+
147+
let shielded_wallet = ShieldedHDWallet::new(JsValue::from(seed))
148+
.expect("Instantiating ShieldedHDWallet should not fail");
149+
150+
let shielded_account = shielded_wallet
151+
.derive(vec![32, 877, 0], None)
152+
.expect("Deriving from ExtendedKeys should not fail");
153+
154+
let payment_address = PaymentAddress::try_from_slice(&shielded_account.payment_address())
155+
.expect("should instantiate from serialized bytes");
156+
let xfvk = ExtendedFullViewingKey::try_from_slice(&shielded_account.xfvk())
157+
.expect("should instantiate from serialized bytes");
158+
159+
assert_eq!(payment_address.to_string(), "0a918bd974d1abddcc2e15eddec2557abae385ed59fb3089ed4aff418819a63bf4a7890591ff107a2b7569");
160+
assert_eq!(
161+
xfvk.fvk.to_string(),
162+
format!(
163+
"{}{}{}",
164+
"9f89bdaf176f8528f43303ae793ce128af3436902a39ebbe46509f6fef11eb",
165+
"585270060da4c12f1a52b63c7c6906dddcabb0ecd00735e11b0d7cbee277342dd89a10e9c7",
166+
"e69bca34b50a3c8525bbee96347a7cadfd6c32d3af5b92ad1ecf07da"
167+
)
168+
);
169+
}
137170
}

packages/sdk/src/tests/data.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ export const CHAIN_ID = "localnet.a905b497170d585eb67fd";
77
export const MNEMONIC_1 =
88
"liar bird install win wool venue observe maid flock clap bullet myth illness trip bread fresh polar smart use lunar tired embody come deer";
99

10+
export const MNEMONIC_2 =
11+
"resist mystery settle ask saddle great kite tragic leaf improve ticket admit analyst tomorrow tobacco aim desk melt wheel despair patch ketchup calm winner";
12+
1013
export const ACCOUNT_1 = {
1114
address: "tnam1qz4sdx5jlh909j44uz46pf29ty0ztftfzc98s8dx",
1215
publicKey:
@@ -21,7 +24,7 @@ export const ACCOUNT_2 = {
2124
"tpknam1qrxzmeyka3v43jnrhep9stnj3jhtgzq96ku3u6lk8hy8xqmjqgjtw8qu274",
2225
};
2326

24-
export const SHIELDED_ACCOUNT = {
27+
export const SHIELDED_ACCOUNT_1 = {
2528
paymentAddress:
2629
"znam1t5y7e7n6l9n3wfdq8j973lu9n8s086et6snmcmvu3lues59d5qlg085u25grflkr87ktwuhvd4y",
2730
spendingKey:
@@ -30,6 +33,15 @@ export const SHIELDED_ACCOUNT = {
3033
"zvknam1qdjyja2zqqqqpqpxsekqx3tg8qz727cyqqhujj7c74xglmzk5lk0e2gej2s2e6c4vgxlamnryqz6ytms0wflzthg264m4qxucgsxf8en6unm9l33sc3qs9duecssuxah0hw267uu7nr9qym763v8qup2t3upxungmc0cqggvsy092ahrtpm7zv34sj8dy72zwpzwjja69pw6lacdd655j0zaxdjk6ej387njquecyqm2hzv3kps76wrv2y5xk634kkcc05tdrvwyhhqukwe9z",
3134
};
3235

36+
export const SHIELDED_ACCOUNT_2 = {
37+
paymentAddress:
38+
"znam1u5nehkhgys5hdxzx6un9j2lfyx2e9fpzluaq7pedhkzxn9dm2wtfs8kywh45wc96yh63grkpw54",
39+
spendingKey:
40+
"zsknam1q0yp502jqqqqpqpf0vcvm20gadwfl2xt4gaqc5nwrdvl2ky3upvwja6uryucvmw5r7jxu2tuujuapqa5ud9cvuh9x4lkgy7sn7xlzm2kapqjl6y8zq4qwkl3vaye5z5gwe4yrmy5nh0a5zrlj8we947n2c4kmqm0t47gldgz8r58w2kwuee0edafdqmvvgtalpqyvanhzcvmglcufmu6g3jhr3kjayfhdfjefnsr8yhd3ah6xwpslgzy5s3xnhehzrsr2lqq0wfzacgrptw09",
41+
viewingKey:
42+
"zvknam1q0yp502jqqqqpqpf0vcvm20gadwfl2xt4gaqc5nwrdvl2ky3upvwja6uryucvmw5r7p9ddjvw86ma4qy57vzcqqqwa5efmvj2cnhgqgnktuffgz7zscd3fx776pul3f4df5ve3tef0htzwm7wv702t432m6fv9q2kepazvf78r58w2kwuee0edafdqmvvgtalpqyvanhzcvmglcufmu6g3jhr3kjayfhdfjefnsr8yhd3ah6xwpslgzy5s3xnhehzrsr2lqq0wfzacgx2s96s",
43+
};
44+
3345
export const SIG_VALID = {
3446
publicKey:
3547
"tpknam1qptrn64myunqr4847yq4cn0uwek5ecwc7eeexjfc5npmd5kmg6ex563n5as",

packages/sdk/src/tests/keys.test.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import {
22
ACCOUNT_1 as account1,
33
MNEMONIC_1 as mnemonic1,
4-
SHIELDED_ACCOUNT as shieldedAccount,
4+
MNEMONIC_2 as mnemonic2,
5+
SHIELDED_ACCOUNT_1 as shieldedAccount1,
6+
SHIELDED_ACCOUNT_2 as shieldedAccount2,
57
} from "./data";
68
import { initSdk } from "./initSdk";
79

@@ -20,13 +22,24 @@ describe("Keys", () => {
2022
it("should derive shielded keys from seed", () => {
2123
const { keys, mnemonic } = initSdk();
2224
const seed = mnemonic.toSeed(mnemonic1);
25+
const seed2 = mnemonic.toSeed(mnemonic2);
2326

2427
const { address, viewingKey, spendingKey } =
2528
keys.deriveShieldedFromSeed(seed);
2629

27-
expect(address).toBe(shieldedAccount.paymentAddress);
28-
expect(viewingKey).toBe(shieldedAccount.viewingKey);
29-
expect(spendingKey).toBe(shieldedAccount.spendingKey);
30+
expect(address).toBe(shieldedAccount1.paymentAddress);
31+
expect(viewingKey).toBe(shieldedAccount1.viewingKey);
32+
expect(spendingKey).toBe(shieldedAccount1.spendingKey);
33+
34+
const {
35+
address: address2,
36+
viewingKey: viewingKey2,
37+
spendingKey: spendingKey2,
38+
} = keys.deriveShieldedFromSeed(seed2);
39+
40+
expect(address2).toBe(shieldedAccount2.paymentAddress);
41+
expect(viewingKey2).toBe(shieldedAccount2.viewingKey);
42+
expect(spendingKey2).toBe(shieldedAccount2.spendingKey);
3043
});
3144

3245
it("should derive keys from seed", () => {

packages/sdk/src/utils.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ export const makeBip44Path = (
3131
/**
3232
* Return a properly formatted Sapling path
3333
* @param coinType - SLIP-044 Coin designation
34-
* @param account - numbered from index
35-
in sequentially increasing manner. Defined as in BIP 44
34+
* @param account - numbered from index in sequentially increasing manner. Defined as in BIP 44
3635
* @returns Sapling path
3736
*/
3837
export const makeSaplingPath = (coinType: number, account: number): string => {
@@ -42,8 +41,7 @@ export const makeSaplingPath = (coinType: number, account: number): string => {
4241
/**
4342
* Return a properly formatted Sapling path array
4443
* @param coinType - SLIP-044 Coin designation
45-
* @param account - numbered from index
46-
in sequentially increasing manner. Defined as in BIP 44
44+
* @param account - numbered from index in sequentially increasing manner. Defined as in BIP 44
4745
* @returns Sapling path array
4846
*/
4947
export const makeSaplingPathArray = (

0 commit comments

Comments
 (0)