|
1 | 1 | use std::collections::BTreeMap; |
2 | 2 |
|
3 | 3 | use bdk_wallet::descriptor::DescriptorError; |
4 | | -use bdk_wallet::keyring::KeyRing; |
5 | 4 | use bdk_wallet::keyring::KeyRingError; |
| 5 | +use bdk_wallet::keyring::{ChangeSet, KeyRing}; |
6 | 6 | use bdk_wallet::test_utils::get_test_wpkh_and_change_desc; |
7 | 7 | use bdk_wallet::KeychainKind; |
8 | 8 | use bitcoin::secp256k1::Secp256k1; |
@@ -123,3 +123,98 @@ fn test_duplicate_keychain_and_desc() { |
123 | 123 | let err = keyring.add_descriptor(1, desc).unwrap_err(); |
124 | 124 | assert_eq!(err, KeyRingError::KeychainAlreadyExists(1)); |
125 | 125 | } |
| 126 | + |
| 127 | +#[cfg(feature = "rusqlite")] |
| 128 | +#[test] |
| 129 | +fn test_from_v2() -> anyhow::Result<()> { |
| 130 | + use bdk_chain::{ |
| 131 | + rusqlite::{params, types::Null, Connection}, |
| 132 | + Impl, |
| 133 | + }; |
| 134 | + let mut conn = Connection::open_in_memory()?; |
| 135 | + |
| 136 | + let desc_str = "tr(tprv8ZgxMBicQKsPdWAHbugK2tjtVtRjKGixYVZUdL7xLHMgXZS6BFbFi1UDb1CHT25Z5PU1F9j7wGxwUiRhqz9E3nZRztikGUV6HoRDYcqPhM4/86'/1'/0'/0/*)"; |
| 137 | + |
| 138 | + let change_desc_str = "tr(tprv8ZgxMBicQKsPdWAHbugK2tjtVtRjKGixYVZUdL7xLHMgXZS6BFbFi1UDb1CHT25Z5PU1F9j7wGxwUiRhqz9E3nZRztikGUV6HoRDYcqPhM4/86'/1'/0'/1/*)"; |
| 139 | + |
| 140 | + let descriptor = get_descriptor(desc_str); |
| 141 | + |
| 142 | + let change_descriptor = get_descriptor(change_desc_str); |
| 143 | + |
| 144 | + let network = Network::Regtest; |
| 145 | + |
| 146 | + conn.execute( |
| 147 | + "CREATE TABLE bdk_wallet ( \ |
| 148 | + id INTEGER PRIMARY KEY NOT NULL CHECK (id = 0), \ |
| 149 | + descriptor TEXT, \ |
| 150 | + change_descriptor TEXT, \ |
| 151 | + network TEXT \ |
| 152 | + ) STRICT;", |
| 153 | + [], |
| 154 | + )?; |
| 155 | + |
| 156 | + conn.execute( |
| 157 | + "INSERT INTO bdk_wallet (id, descriptor) VALUES(?1 , ?2) ON CONFLICT(id) DO UPDATE SET descriptor=?2", |
| 158 | + params![0, Impl(descriptor.clone())], |
| 159 | + )?; |
| 160 | + |
| 161 | + conn.execute( |
| 162 | + "INSERT INTO bdk_wallet (id, change_descriptor) VALUES(?1 , ?2) ON CONFLICT(id) DO UPDATE SET change_descriptor=?2", |
| 163 | + params![0, Impl(change_descriptor.clone())], |
| 164 | + )?; |
| 165 | + |
| 166 | + conn.execute( |
| 167 | + "INSERT INTO bdk_wallet (id, network) VALUES(?1 , ?2) ON CONFLICT(id) DO UPDATE SET network=?2", |
| 168 | + params![0, Impl(network)], |
| 169 | + )?; |
| 170 | + |
| 171 | + let keyring_changeset = |
| 172 | + ChangeSet::from_v2(&mut conn, KeychainKind::External, KeychainKind::Internal)?; |
| 173 | + let keyring = KeyRing::from_changeset(keyring_changeset, None, [].into())? |
| 174 | + .expect("changeset should not be empty"); |
| 175 | + let descriptors = keyring.list_keychains(); |
| 176 | + assert_eq!( |
| 177 | + descriptors.get(&KeychainKind::External), |
| 178 | + Some(&descriptor), |
| 179 | + "External keychain must be loaded" |
| 180 | + ); |
| 181 | + assert_eq!( |
| 182 | + descriptors.get(&KeychainKind::Internal), |
| 183 | + Some(&change_descriptor), |
| 184 | + "Internal keychain must be loaded" |
| 185 | + ); |
| 186 | + assert_eq!( |
| 187 | + keyring.network(), |
| 188 | + Network::Regtest, |
| 189 | + "network must be loaded" |
| 190 | + ); |
| 191 | + |
| 192 | + conn.execute( |
| 193 | + "INSERT INTO bdk_wallet (id, change_descriptor) VALUES(?1 , ?2) ON CONFLICT(id) DO UPDATE SET change_descriptor=?2", |
| 194 | + params![0, &Null], |
| 195 | + )?; |
| 196 | + |
| 197 | + let keyring_changeset = |
| 198 | + ChangeSet::from_v2(&mut conn, KeychainKind::External, KeychainKind::External)?; |
| 199 | + let keyring = KeyRing::from_changeset(keyring_changeset, None, [].into())? |
| 200 | + .expect("changeset should not be empty"); |
| 201 | + |
| 202 | + let descriptors = keyring.list_keychains(); |
| 203 | + assert_eq!( |
| 204 | + descriptors.get(&KeychainKind::External), |
| 205 | + Some(&descriptor), |
| 206 | + "External keychain must be loaded" |
| 207 | + ); |
| 208 | + assert_eq!( |
| 209 | + descriptors.get(&KeychainKind::Internal), |
| 210 | + None, |
| 211 | + "Internal keychain must not be loaded" |
| 212 | + ); |
| 213 | + assert_eq!( |
| 214 | + keyring.network(), |
| 215 | + Network::Regtest, |
| 216 | + "network must be loaded " |
| 217 | + ); |
| 218 | + |
| 219 | + Ok(()) |
| 220 | +} |
0 commit comments