Skip to content

Commit 0fb6ca1

Browse files
committed
[Core] Define STAKING_ADDRESS addresses
1 parent 12a6b70 commit 0fb6ca1

File tree

4 files changed

+35
-15
lines changed

4 files changed

+35
-15
lines changed

src/base58.cpp

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -224,32 +224,39 @@ class CBitcoinAddressVisitor : public boost::static_visitor<bool>
224224
{
225225
private:
226226
CBitcoinAddress* addr;
227+
bool IsColdStakingAddr = false;
227228

228229
public:
229-
CBitcoinAddressVisitor(CBitcoinAddress* addrIn) : addr(addrIn) {}
230+
CBitcoinAddressVisitor(CBitcoinAddress* addrIn, const bool fStakingAddr = false) :
231+
addr(addrIn),
232+
IsColdStakingAddr(fStakingAddr){};
230233

231-
bool operator()(const CKeyID& id) const { return addr->Set(id); }
232-
bool operator()(const CScriptID& id) const { return addr->Set(id); }
234+
bool operator()(const CKeyID& id) const { return addr->Set(id, IsColdStakingAddr); }
235+
bool operator()(const CScriptID& id) const { return addr->Set(id, IsColdStakingAddr); }
233236
bool operator()(const CNoDestination& no) const { return false; }
234237
};
235238

236239
} // anon namespace
237240

238-
bool CBitcoinAddress::Set(const CKeyID& id)
241+
bool CBitcoinAddress::Set(const CKeyID& id, const bool fStakingAddr)
239242
{
240-
SetData(Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS), &id, 20);
243+
if (fStakingAddr) {
244+
SetData(Params().Base58Prefix(CChainParams::STAKING_ADDRESS), &id, 20);
245+
} else {
246+
SetData(Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS), &id, 20);
247+
}
241248
return true;
242249
}
243250

244-
bool CBitcoinAddress::Set(const CScriptID& id)
251+
bool CBitcoinAddress::Set(const CScriptID& id, const bool fStakingAddr)
245252
{
246253
SetData(Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS), &id, 20);
247254
return true;
248255
}
249256

250-
bool CBitcoinAddress::Set(const CTxDestination& dest)
257+
bool CBitcoinAddress::Set(const CTxDestination& dest, const bool fStakingAddr)
251258
{
252-
return boost::apply_visitor(CBitcoinAddressVisitor(this), dest);
259+
return boost::apply_visitor(CBitcoinAddressVisitor(this, fStakingAddr), dest);
253260
}
254261

255262
bool CBitcoinAddress::IsValid() const
@@ -261,7 +268,8 @@ bool CBitcoinAddress::IsValid(const CChainParams& params) const
261268
{
262269
bool fCorrectSize = vchData.size() == 20;
263270
bool fKnownVersion = vchVersion == params.Base58Prefix(CChainParams::PUBKEY_ADDRESS) ||
264-
vchVersion == params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
271+
vchVersion == params.Base58Prefix(CChainParams::SCRIPT_ADDRESS) ||
272+
vchVersion == params.Base58Prefix(CChainParams::STAKING_ADDRESS);
265273
return fCorrectSize && fKnownVersion;
266274
}
267275

@@ -271,7 +279,8 @@ CTxDestination CBitcoinAddress::Get() const
271279
return CNoDestination();
272280
uint160 id;
273281
memcpy(&id, &vchData[0], 20);
274-
if (vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
282+
if (vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS) ||
283+
vchVersion == Params().Base58Prefix(CChainParams::STAKING_ADDRESS))
275284
return CKeyID(id);
276285
else if (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS))
277286
return CScriptID(id);
@@ -281,7 +290,9 @@ CTxDestination CBitcoinAddress::Get() const
281290

282291
bool CBitcoinAddress::GetKeyID(CKeyID& keyID) const
283292
{
284-
if (!IsValid() || vchVersion != Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
293+
if (!IsValid() ||
294+
(vchVersion != Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS) &&
295+
vchVersion != Params().Base58Prefix(CChainParams::STAKING_ADDRESS)))
285296
return false;
286297
uint160 id;
287298
memcpy(&id, &vchData[0], 20);
@@ -294,6 +305,11 @@ bool CBitcoinAddress::IsScript() const
294305
return IsValid() && vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS);
295306
}
296307

308+
bool CBitcoinAddress::IsStakingAddress() const
309+
{
310+
return IsValid() && vchVersion == Params().Base58Prefix(CChainParams::STAKING_ADDRESS);
311+
}
312+
297313
void CBitcoinSecret::SetKey(const CKey& vchSecret)
298314
{
299315
assert(vchSecret.IsValid());

src/base58.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,21 @@ class CBase58Data
110110
class CBitcoinAddress : public CBase58Data
111111
{
112112
public:
113-
bool Set(const CKeyID& id);
114-
bool Set(const CScriptID& id);
115-
bool Set(const CTxDestination& dest);
113+
bool Set(const CKeyID& id, const bool fStakingAddr = false);
114+
bool Set(const CScriptID& id, const bool fStakingAddr = false);
115+
bool Set(const CTxDestination& dest, const bool fStakingAddr = false);
116116
bool IsValid() const;
117117
bool IsValid(const CChainParams& params) const;
118118

119119
CBitcoinAddress() {}
120-
CBitcoinAddress(const CTxDestination& dest) { Set(dest); }
120+
CBitcoinAddress(const CTxDestination& dest, const bool fStakingAddr = false) { Set(dest, fStakingAddr); }
121121
CBitcoinAddress(const std::string& strAddress) { SetString(strAddress); }
122122
CBitcoinAddress(const char* pszAddress) { SetString(pszAddress); }
123123

124124
CTxDestination Get() const;
125125
bool GetKeyID(CKeyID& keyID) const;
126126
bool IsScript() const;
127+
bool IsStakingAddress() const;
127128
};
128129

129130
/**

src/chainparams.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ class CMainParams : public CChainParams
233233

234234
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 30);
235235
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 13);
236+
base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 63); // starting with 'S'
236237
base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 212);
237238
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x02)(0x2D)(0x25)(0x33).convert_to_container<std::vector<unsigned char> >();
238239
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x02)(0x21)(0x31)(0x2B).convert_to_container<std::vector<unsigned char> >();
@@ -352,6 +353,7 @@ class CTestNetParams : public CMainParams
352353

353354
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 139); // Testnet pivx addresses start with 'x' or 'y'
354355
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 19); // Testnet pivx script addresses start with '8' or '9'
356+
base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 73); // starting with 'W'
355357
base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 239); // Testnet private keys start with '9' or 'c' (Bitcoin defaults)
356358
// Testnet pivx BIP32 pubkeys start with 'DRKV'
357359
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x3a)(0x80)(0x61)(0xa0).convert_to_container<std::vector<unsigned char> >();

src/chainparams.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class CChainParams
4141
EXT_PUBLIC_KEY, // BIP32
4242
EXT_SECRET_KEY, // BIP32
4343
EXT_COIN_TYPE, // BIP44
44+
STAKING_ADDRESS,
4445

4546
MAX_BASE58_TYPES
4647
};

0 commit comments

Comments
 (0)