@@ -42,17 +42,20 @@ bool HaveKeys(const std::vector<valtype>& pubkeys, const CKeyStore& keystore)
42
42
return true ;
43
43
}
44
44
45
+ void Update (isminetype& val, isminetype update)
46
+ {
47
+ if (val == ISMINE_NO) val = update;
48
+ if (val == ISMINE_WATCH_ONLY && update == ISMINE_SPENDABLE) val = update;
49
+ }
50
+
45
51
isminetype IsMineInner (const CKeyStore& keystore, const CScript& scriptPubKey, bool & isInvalid, IsMineSigVersion sigversion)
46
52
{
53
+ isminetype ret = ISMINE_NO;
47
54
isInvalid = false ;
48
55
49
56
std::vector<valtype> vSolutions;
50
57
txnouttype whichType;
51
- if (!Solver (scriptPubKey, whichType, vSolutions)) {
52
- if (keystore.HaveWatchOnly (scriptPubKey)) {
53
- return ISMINE_WATCH_ONLY;
54
- }
55
- }
58
+ Solver (scriptPubKey, whichType, vSolutions);
56
59
57
60
CKeyID keyID;
58
61
switch (whichType)
@@ -67,8 +70,9 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
67
70
isInvalid = true ;
68
71
return ISMINE_NO;
69
72
}
70
- if (keystore.HaveKey (keyID))
71
- return ISMINE_SPENDABLE;
73
+ if (keystore.HaveKey (keyID)) {
74
+ Update (ret, ISMINE_SPENDABLE);
75
+ }
72
76
break ;
73
77
case TX_WITNESS_V0_KEYHASH:
74
78
{
@@ -78,10 +82,7 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
78
82
// This also applies to the P2WSH case.
79
83
break ;
80
84
}
81
- isminetype ret = IsMineInner (keystore, GetScriptForDestination (CKeyID (uint160 (vSolutions[0 ]))), isInvalid, IsMineSigVersion::WITNESS_V0);
82
- if (ret == ISMINE_SPENDABLE || ret == ISMINE_WATCH_ONLY || (ret == ISMINE_NO && isInvalid)) {
83
- return ret;
84
- }
85
+ Update (ret, IsMineInner (keystore, GetScriptForDestination (CKeyID (uint160 (vSolutions[0 ]))), isInvalid, IsMineSigVersion::WITNESS_V0));
85
86
break ;
86
87
}
87
88
case TX_PUBKEYHASH:
@@ -93,18 +94,16 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
93
94
return ISMINE_NO;
94
95
}
95
96
}
96
- if (keystore.HaveKey (keyID))
97
- return ISMINE_SPENDABLE;
97
+ if (keystore.HaveKey (keyID)) {
98
+ Update (ret, ISMINE_SPENDABLE);
99
+ }
98
100
break ;
99
101
case TX_SCRIPTHASH:
100
102
{
101
103
CScriptID scriptID = CScriptID (uint160 (vSolutions[0 ]));
102
104
CScript subscript;
103
105
if (keystore.GetCScript (scriptID, subscript)) {
104
- isminetype ret = IsMineInner (keystore, subscript, isInvalid, IsMineSigVersion::P2SH);
105
- if (ret == ISMINE_SPENDABLE || ret == ISMINE_WATCH_ONLY || (ret == ISMINE_NO && isInvalid)) {
106
- return ret;
107
- }
106
+ Update (ret, IsMineInner (keystore, subscript, isInvalid, IsMineSigVersion::P2SH));
108
107
}
109
108
break ;
110
109
}
@@ -118,18 +117,17 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
118
117
CScriptID scriptID = CScriptID (hash);
119
118
CScript subscript;
120
119
if (keystore.GetCScript (scriptID, subscript)) {
121
- isminetype ret = IsMineInner (keystore, subscript, isInvalid, IsMineSigVersion::WITNESS_V0);
122
- if (ret == ISMINE_SPENDABLE || ret == ISMINE_WATCH_ONLY || (ret == ISMINE_NO && isInvalid)) {
123
- return ret;
124
- }
120
+ Update (ret, IsMineInner (keystore, subscript, isInvalid, IsMineSigVersion::WITNESS_V0));
125
121
}
126
122
break ;
127
123
}
128
124
129
125
case TX_MULTISIG:
130
126
{
131
127
// Never treat bare multisig outputs as ours (they can still be made watchonly-though)
132
- if (sigversion == IsMineSigVersion::TOP) break ;
128
+ if (sigversion == IsMineSigVersion::TOP) {
129
+ break ;
130
+ }
133
131
134
132
// Only consider transactions "mine" if we own ALL the
135
133
// keys involved. Multi-signature transactions that are
@@ -146,23 +144,27 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
146
144
}
147
145
}
148
146
if (HaveKeys (keys, keystore)) {
149
- return ISMINE_SPENDABLE;
147
+ Update (ret, ISMINE_SPENDABLE) ;
150
148
}
151
149
break ;
152
150
}
153
151
}
154
152
155
- if (keystore.HaveWatchOnly (scriptPubKey)) {
153
+ if (ret == ISMINE_NO && keystore.HaveWatchOnly (scriptPubKey)) {
156
154
return ISMINE_WATCH_ONLY;
157
155
}
158
- return ISMINE_NO ;
156
+ return ret ;
159
157
}
160
158
161
159
} // namespace
162
160
163
161
isminetype IsMine (const CKeyStore& keystore, const CScript& scriptPubKey, bool & isInvalid)
164
162
{
165
- return IsMineInner (keystore, scriptPubKey, isInvalid, IsMineSigVersion::TOP);
163
+ isminetype ret = IsMineInner (keystore, scriptPubKey, isInvalid, IsMineSigVersion::TOP);
164
+ if (isInvalid) {
165
+ ret = ISMINE_NO;
166
+ }
167
+ return ret;
166
168
}
167
169
168
170
isminetype IsMine (const CKeyStore& keystore, const CScript& scriptPubKey)
0 commit comments