Skip to content

Commit 383bca0

Browse files
committed
Merge branch 'cardano-sim-tests'
2 parents 295b6a6 + daa9562 commit 383bca0

File tree

3 files changed

+218
-0
lines changed

3 files changed

+218
-0
lines changed

tests/simulator_tests.rs

+2
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ async fn test_btc(bitbox: &PairedBitBox) {
198198
)
199199
.unwrap();
200200
}
201+
202+
subtests::test_cardano::test(bitbox).await;
201203
}
202204

203205
#[tokio::test]

tests/subtests/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
pub type PairedBitBox = bitbox_api::PairedBitBox<bitbox_api::runtime::TokioRuntime>;
22

33
pub mod test_btc_psbt;
4+
pub mod test_cardano;
45

56
/// BIP32 xprv from BIP39 mnemonic used by the simulator:
67
/// boring mistake dish oyster truth pigeon viable emerge sort crash wire portion cannon couple enact box walk height pull today solid off enable tide

tests/subtests/test_cardano.rs

+215
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
use super::PairedBitBox;
2+
3+
use bitbox_api::pb;
4+
5+
pub async fn test(bitbox: &PairedBitBox) {
6+
assert!(bitbox.cardano_supported());
7+
8+
// cardano_xpubs
9+
{
10+
let xpubs = bitbox
11+
.cardano_xpubs(&[
12+
"m/1852'/1815'/0'".try_into().unwrap(),
13+
"m/1852'/1815'/1'".try_into().unwrap(),
14+
])
15+
.await
16+
.unwrap();
17+
assert_eq!(xpubs.len(), 2);
18+
assert_eq!(
19+
hex::encode(&xpubs[0]),
20+
"9fc9550e8379cb97c2d2557d89574207c6cf4d4ff62b37e377f2b3b3c284935b677f0fe5a4a6928c7b982c0c149f140c26c0930b73c2fe16feddfa21625e0316",
21+
);
22+
assert_eq!(
23+
hex::encode(&xpubs[1]),
24+
"7ffd0bd7d54f1648ac59a357d3eb27b878c2f7c09739d3b7c7e6662d496dea16f10ef525258833d37db047cd530bf373ebcb283495aa4c768424a2af37cee661",
25+
);
26+
}
27+
// cardano_address
28+
{
29+
let address = bitbox
30+
.cardano_address(
31+
pb::CardanoNetwork::CardanoMainnet,
32+
&bitbox_api::cardano::make_script_config_pkh_skh(
33+
&"m/1852'/1815'/0'/0/0".try_into().unwrap(),
34+
&"m/1852'/1815'/0'/2/0".try_into().unwrap(),
35+
),
36+
false,
37+
)
38+
.await
39+
.unwrap();
40+
assert_eq!(
41+
address,
42+
"addr1qxz808eh7aw8cwjhlxlzu4p3ct299qrzjlnp7pwvh7nc9hg0342h3nhc8vnf6c93wnxgqv3xztkfq7cnjegcqz30vg7s3sx0l4",
43+
);
44+
}
45+
46+
let change_config = bitbox_api::cardano::make_script_config_pkh_skh(
47+
&"m/1852'/1815'/0'/1/0".try_into().unwrap(),
48+
&"m/1852'/1815'/0'/2/0".try_into().unwrap(),
49+
);
50+
let change_address = bitbox
51+
.cardano_address(pb::CardanoNetwork::CardanoMainnet, &change_config, false)
52+
.await
53+
.unwrap();
54+
let keypath_input: bitbox_api::Keypath = "m/1852'/1815'/0'/0/0".try_into().unwrap();
55+
56+
// Sign a transaction with tokens
57+
{
58+
let transaction = pb::CardanoSignTransactionRequest {
59+
network: pb::CardanoNetwork::CardanoMainnet as i32,
60+
inputs: vec![
61+
pb::cardano_sign_transaction_request::Input {
62+
keypath: keypath_input.to_vec(),
63+
prev_out_hash: hex::decode("59864ee73ca5d91098a32b3ce9811bac1996dcbaefa6b6247dcaafb5779c2538").unwrap(),
64+
prev_out_index: 0,
65+
},
66+
],
67+
outputs: vec![
68+
pb::cardano_sign_transaction_request::Output {
69+
encoded_address: "addr1q9qfllpxg2vu4lq6rnpel4pvpp5xnv3kvvgtxk6k6wp4ff89xrhu8jnu3p33vnctc9eklee5dtykzyag5penc6dcmakqsqqgpt".to_string(),
70+
value: 1000000,
71+
asset_groups: vec![
72+
// Asset policy ids and asset names from:
73+
// https://github.com/cardano-foundation/CIPs/blob/a2ef32d8a2b485fed7f6ffde2781dd58869ff511/CIP-0014/README.md#test-vectors
74+
pb::cardano_sign_transaction_request::AssetGroup {
75+
policy_id: hex::decode("1e349c9bdea19fd6c147626a5260bc44b71635f398b67c59881df209").unwrap(),
76+
tokens: vec![
77+
pb::cardano_sign_transaction_request::asset_group::Token {
78+
asset_name: hex::decode("504154415445").unwrap(),
79+
value: 1,
80+
},
81+
pb::cardano_sign_transaction_request::asset_group::Token {
82+
asset_name: hex::decode("7eae28af2208be856f7a119668ae52a49b73725e326dc16579dcc373").unwrap(),
83+
value: 3,
84+
},
85+
],
86+
},
87+
],
88+
..Default::default()
89+
},
90+
pb::cardano_sign_transaction_request::Output {
91+
encoded_address: change_address.clone(),
92+
value: 4829501,
93+
script_config: Some(change_config.clone()),
94+
..Default::default()
95+
},
96+
],
97+
fee: 170499,
98+
ttl: 41115811,
99+
certificates: vec![],
100+
withdrawals: vec![],
101+
validity_interval_start: 41110811,
102+
allow_zero_ttl: false,
103+
};
104+
105+
let witness = bitbox.cardano_sign_transaction(transaction).await.unwrap();
106+
assert_eq!(witness.shelley_witnesses.len(), 1);
107+
assert_eq!(
108+
hex::encode(&witness.shelley_witnesses[0].public_key),
109+
"6b5d4134cfc66281827d51cb0196f1a951ce168c19ba1314233f43d39d91e2bc",
110+
);
111+
}
112+
// Delegating to a staking pool...
113+
{
114+
let transaction = pb::CardanoSignTransactionRequest {
115+
network: pb::CardanoNetwork::CardanoMainnet as i32,
116+
inputs: vec![pb::cardano_sign_transaction_request::Input {
117+
keypath: keypath_input.to_vec(),
118+
prev_out_hash: hex::decode(
119+
"59864ee73ca5d91098a32b3ce9811bac1996dcbaefa6b6247dcaafb5779c2538",
120+
)
121+
.unwrap(),
122+
prev_out_index: 0,
123+
}],
124+
outputs: vec![pb::cardano_sign_transaction_request::Output {
125+
encoded_address: change_address.clone(),
126+
value: 2741512,
127+
script_config: Some(change_config.clone()),
128+
..Default::default()
129+
}],
130+
fee: 191681,
131+
ttl: 41539125,
132+
certificates: vec![
133+
pb::cardano_sign_transaction_request::Certificate {
134+
cert: Some(
135+
pb::cardano_sign_transaction_request::certificate::Cert::StakeRegistration(
136+
pb::Keypath {
137+
keypath: vec![2147485500, 2147485463, 2147483648, 2, 0],
138+
},
139+
),
140+
),
141+
},
142+
pb::cardano_sign_transaction_request::Certificate {
143+
cert: Some(
144+
pb::cardano_sign_transaction_request::certificate::Cert::StakeDelegation(
145+
pb::cardano_sign_transaction_request::certificate::StakeDelegation {
146+
keypath: vec![2147485500, 2147485463, 2147483648, 2, 0],
147+
pool_keyhash: hex::decode(
148+
"abababababababababababababababababababababababababababab",
149+
)
150+
.unwrap(),
151+
},
152+
),
153+
),
154+
},
155+
],
156+
withdrawals: vec![],
157+
validity_interval_start: 41110811,
158+
allow_zero_ttl: false,
159+
};
160+
161+
let witness = bitbox.cardano_sign_transaction(transaction).await.unwrap();
162+
assert_eq!(witness.shelley_witnesses.len(), 2);
163+
assert_eq!(
164+
hex::encode(&witness.shelley_witnesses[0].public_key),
165+
"6b5d4134cfc66281827d51cb0196f1a951ce168c19ba1314233f43d39d91e2bc",
166+
);
167+
assert_eq!(
168+
hex::encode(&witness.shelley_witnesses[1].public_key),
169+
"ed0d6426efcae3b02b963db0997845ba43ed53c131aa2f0faa01976ddcdb3751",
170+
);
171+
}
172+
// Withdrawing staking rewards...
173+
{
174+
let transaction = pb::CardanoSignTransactionRequest {
175+
network: pb::CardanoNetwork::CardanoMainnet as i32,
176+
inputs: vec![pb::cardano_sign_transaction_request::Input {
177+
keypath: keypath_input.to_vec(),
178+
prev_out_hash: hex::decode(
179+
"59864ee73ca5d91098a32b3ce9811bac1996dcbaefa6b6247dcaafb5779c2538",
180+
)
181+
.unwrap(),
182+
prev_out_index: 0,
183+
}],
184+
outputs: vec![pb::cardano_sign_transaction_request::Output {
185+
encoded_address: change_address.clone(),
186+
value: 4817591,
187+
script_config: Some(change_config.clone()),
188+
..Default::default()
189+
}],
190+
fee: 175157,
191+
ttl: 41788708,
192+
certificates: vec![],
193+
withdrawals: vec![pb::cardano_sign_transaction_request::Withdrawal {
194+
keypath: {
195+
let kp: bitbox_api::Keypath = "m/1852'/1815'/0'/2/0".try_into().unwrap();
196+
kp.to_vec()
197+
},
198+
value: 1234567,
199+
}],
200+
validity_interval_start: 0,
201+
allow_zero_ttl: false,
202+
};
203+
204+
let witness = bitbox.cardano_sign_transaction(transaction).await.unwrap();
205+
assert_eq!(witness.shelley_witnesses.len(), 2);
206+
assert_eq!(
207+
hex::encode(&witness.shelley_witnesses[0].public_key),
208+
"6b5d4134cfc66281827d51cb0196f1a951ce168c19ba1314233f43d39d91e2bc",
209+
);
210+
assert_eq!(
211+
hex::encode(&witness.shelley_witnesses[1].public_key),
212+
"ed0d6426efcae3b02b963db0997845ba43ed53c131aa2f0faa01976ddcdb3751",
213+
);
214+
}
215+
}

0 commit comments

Comments
 (0)