Skip to content

Commit 397ac4e

Browse files
committed
ledger: add_address returns a new Ledger with the new address pushed into it.
1 parent 1527884 commit 397ac4e

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

src/client/rpc_api.rs

+15-2
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@ impl RpcApi for Client {
145145
.as_unchecked()
146146
.to_owned();
147147

148+
self.ledger.set(
149+
self.ledger
150+
.take()
151+
.add_address(address.clone().assume_checked()),
152+
);
153+
148154
Ok(address)
149155
}
150156

@@ -283,7 +289,7 @@ mod tests {
283289
}
284290

285291
#[test]
286-
fn generate_new_address() {
292+
fn get_new_address() {
287293
let rpc = Client::new("", bitcoincore_rpc::Auth::None).unwrap();
288294

289295
let address = rpc.get_new_address(None, None).unwrap();
@@ -292,17 +298,24 @@ mod tests {
292298
assert!(!address.is_valid_for_network(Network::Testnet));
293299
assert!(!address.is_valid_for_network(Network::Signet));
294300
assert!(!address.is_valid_for_network(Network::Bitcoin));
301+
unsafe { assert_eq!(*(*rpc.ledger.as_ptr()).addresses[0].as_unchecked(), address) };
295302

296303
const ADDRESS_COUNT: usize = 100;
297304
let mut prev = address;
298-
for _ in 0..ADDRESS_COUNT {
305+
for i in 0..ADDRESS_COUNT {
299306
let curr = rpc.get_new_address(None, None).unwrap();
300307

301308
assert_ne!(prev, curr);
302309
assert!(curr.is_valid_for_network(Network::Regtest));
303310
assert!(!curr.is_valid_for_network(Network::Testnet));
304311
assert!(!curr.is_valid_for_network(Network::Signet));
305312
assert!(!curr.is_valid_for_network(Network::Bitcoin));
313+
unsafe {
314+
assert_eq!(
315+
*(*rpc.ledger.as_ptr()).addresses[i + 1].as_unchecked(),
316+
curr
317+
)
318+
};
306319

307320
prev = curr;
308321
}

src/ledger/mod.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
use bitcoin::{Address, TxOut};
66

77
/// Mock Bitcoin ledger structure.
8+
#[derive(Clone)]
89
pub struct Ledger {
910
/// User's addresses.
10-
addresses: Vec<Address>,
11+
pub addresses: Vec<Address>,
1112
/// User's unspent transaction outputs.
12-
utxos: Vec<TxOut>,
13+
pub utxos: Vec<TxOut>,
1314
}
1415

1516
impl Ledger {
@@ -26,8 +27,12 @@ impl Ledger {
2627
}
2728

2829
/// Adds a new address for user.
29-
pub fn add_address(&mut self, address: Address) {
30-
self.addresses.push(address);
30+
pub fn add_address(&self, address: Address) -> Self {
31+
let mut ledger = self.clone().to_owned();
32+
33+
ledger.addresses.push(address);
34+
35+
ledger
3136
}
3237
}
3338

@@ -56,6 +61,7 @@ mod tests {
5661
let mut ledger = Ledger::new();
5762

5863
assert_eq!(ledger.utxos.len(), 0);
64+
assert_eq!(ledger.addresses.len(), 0);
5965

6066
// Generate a random address.
6167
let secp = Secp256k1::new();
@@ -66,7 +72,8 @@ mod tests {
6672
])
6773
.unwrap();
6874
let address = Address::p2tr(&secp, xonly_public_key, None, Network::Regtest);
69-
ledger.add_address(address);
75+
ledger = ledger.add_address(address);
76+
assert_eq!(ledger.addresses.len(), 1);
7077

7178
// Insert a dummy UTXO.
7279
let utxo = TxOut {

0 commit comments

Comments
 (0)