Skip to content

Commit b5802a9

Browse files
committed
Simplify IsMine logic
1 parent 4e91820 commit b5802a9

File tree

1 file changed

+28
-26
lines changed

1 file changed

+28
-26
lines changed

src/script/ismine.cpp

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,20 @@ bool HaveKeys(const std::vector<valtype>& pubkeys, const CKeyStore& keystore)
4242
return true;
4343
}
4444

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+
4551
isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, bool& isInvalid, IsMineSigVersion sigversion)
4652
{
53+
isminetype ret = ISMINE_NO;
4754
isInvalid = false;
4855

4956
std::vector<valtype> vSolutions;
5057
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);
5659

5760
CKeyID keyID;
5861
switch (whichType)
@@ -67,8 +70,9 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
6770
isInvalid = true;
6871
return ISMINE_NO;
6972
}
70-
if (keystore.HaveKey(keyID))
71-
return ISMINE_SPENDABLE;
73+
if (keystore.HaveKey(keyID)) {
74+
Update(ret, ISMINE_SPENDABLE);
75+
}
7276
break;
7377
case TX_WITNESS_V0_KEYHASH:
7478
{
@@ -78,10 +82,7 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
7882
// This also applies to the P2WSH case.
7983
break;
8084
}
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));
8586
break;
8687
}
8788
case TX_PUBKEYHASH:
@@ -93,18 +94,16 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
9394
return ISMINE_NO;
9495
}
9596
}
96-
if (keystore.HaveKey(keyID))
97-
return ISMINE_SPENDABLE;
97+
if (keystore.HaveKey(keyID)) {
98+
Update(ret, ISMINE_SPENDABLE);
99+
}
98100
break;
99101
case TX_SCRIPTHASH:
100102
{
101103
CScriptID scriptID = CScriptID(uint160(vSolutions[0]));
102104
CScript subscript;
103105
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));
108107
}
109108
break;
110109
}
@@ -118,18 +117,17 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
118117
CScriptID scriptID = CScriptID(hash);
119118
CScript subscript;
120119
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));
125121
}
126122
break;
127123
}
128124

129125
case TX_MULTISIG:
130126
{
131127
// 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+
}
133131

134132
// Only consider transactions "mine" if we own ALL the
135133
// keys involved. Multi-signature transactions that are
@@ -146,23 +144,27 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
146144
}
147145
}
148146
if (HaveKeys(keys, keystore)) {
149-
return ISMINE_SPENDABLE;
147+
Update(ret, ISMINE_SPENDABLE);
150148
}
151149
break;
152150
}
153151
}
154152

155-
if (keystore.HaveWatchOnly(scriptPubKey)) {
153+
if (ret == ISMINE_NO && keystore.HaveWatchOnly(scriptPubKey)) {
156154
return ISMINE_WATCH_ONLY;
157155
}
158-
return ISMINE_NO;
156+
return ret;
159157
}
160158

161159
} // namespace
162160

163161
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey, bool& isInvalid)
164162
{
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;
166168
}
167169

168170
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey)

0 commit comments

Comments
 (0)