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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
crate::ix!();
//-------------------------------------------[.cpp/bitcoin/src/qt/bitcoinaddressvalidator.h]
/**
| Base58 entry widget validator, checks
| for valid characters and removes some
| whitespace.
|
*/
#[Q_OBJECT]
pub struct BitcoinAddressEntryValidator {
base: QValidator,
}
/**
| Bitcoin address widget validator,
| checks for a valid bitcoin address.
|
*/
#[Q_OBJECT]
pub struct BitcoinAddressCheckValidator {
base: QValidator,
}
//-------------------------------------------[.cpp/bitcoin/src/qt/bitcoinaddressvalidator.cpp]
/**
| Base58 characters are: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
| This is:
|
| - All numbers except for '0'
|
| - All upper-case letters except for
| 'I' and 'O'
|
| - All lower-case letters except for
| 'l'
|
*/
impl BitcoinAddressEntryValidator {
pub fn new(parent: *mut QObject) -> Self {
todo!();
/*
: q_validator(parent),
*/
}
fn validate_impl(&self,
input: &mut String,
pos: &mut i32) -> QValidatorState {
todo!();
/*
Q_UNUSED(pos);
// Empty address is "intermediate" input
if (input.isEmpty())
return QValidatorIntermediate;
// Correction
for (int idx = 0; idx < input.size();)
{
bool removeChar = false;
QChar ch = input.at(idx);
// Corrections made are very conservative on purpose, to avoid
// users unexpectedly getting away with typos that would normally
// be detected, and thus sending to the wrong address.
switch(ch.unicode())
{
// Qt categorizes these as "Other_Format" not "Separator_Space"
case 0x200B: // ZERO WIDTH SPACE
case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE
removeChar = true;
break;
default:
break;
}
// Remove whitespace
if (ch.isSpace())
removeChar = true;
// To next character
if (removeChar)
input.remove(idx, 1);
else
++idx;
}
// Validation
QValidatorState state = QValidatorAcceptable;
for (int idx = 0; idx < input.size(); ++idx)
{
int ch = input.at(idx).unicode();
if (((ch >= '0' && ch<='9') ||
(ch >= 'a' && ch<='z') ||
(ch >= 'A' && ch<='Z')) &&
ch != 'I' && ch != 'O') // Characters invalid in both Base58 and Bech32
{
// Alphanumeric and not a 'forbidden' character
}
else
{
state = QValidatorInvalid;
}
}
return state;
*/
}
pub fn validate(&self,
input: &mut String,
pos: &mut i32) -> QValidatorState {
todo!();
/*
Q_UNUSED(pos);
// Validate the passed Bitcoin address
if (IsValidDestinationString(input.toStdString())) {
return QValidatorAcceptable;
}
return QValidatorInvalid;
*/
}
}