1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use crate::{node::OutputsOptions, Client, Result};
use crypto::keys::slip10::Seed;
pub struct GetUnspentAddressBuilder<'a> {
client: &'a Client,
seed: &'a Seed,
account_index: Option<usize>,
initial_address_index: Option<usize>,
}
impl<'a> GetUnspentAddressBuilder<'a> {
pub fn new(client: &'a Client, seed: &'a Seed) -> Self {
Self {
client,
seed,
account_index: None,
initial_address_index: None,
}
}
pub fn with_account_index(mut self, account_index: usize) -> Self {
self.account_index.replace(account_index);
self
}
pub fn with_initial_address_index(mut self, initial_address_index: usize) -> Self {
self.initial_address_index.replace(initial_address_index);
self
}
pub async fn get(self) -> Result<(String, usize)> {
let account_index = self.account_index.unwrap_or(0);
let mut index = self.initial_address_index.unwrap_or(0);
let result = loop {
let addresses = self
.client
.get_addresses(self.seed)
.with_account_index(account_index)
.with_range(index..index + super::ADDRESS_GAP_RANGE)
.finish()
.await?;
let mut address = None;
for a in addresses {
let address_outputs = self
.client
.get_address()
.outputs(
&a,
OutputsOptions {
include_spent: true,
output_type: None,
},
)
.await?;
if address_outputs.is_empty() {
address.replace(a);
break;
} else {
index += 1;
}
}
if let Some(a) = address {
break (a, index);
}
};
Ok(result)
}
}