diff --git a/qa/rpc-tests/feature_fedpeg.py b/qa/rpc-tests/feature_fedpeg.py index b5c72515950..94918e9a990 100755 --- a/qa/rpc-tests/feature_fedpeg.py +++ b/qa/rpc-tests/feature_fedpeg.py @@ -61,6 +61,8 @@ def setup_network(self, split=False): connect_nodes_bi(self.nodes, 0, 1) self.parentgenesisblockhash = self.nodes[0].getblockhash(0) print('parentgenesisblockhash', self.parentgenesisblockhash) + parent_pegged_asset = self.nodes[0].getsidechaininfo()['pegged_asset'] + print('parent_pegged_asset', parent_pegged_asset) # Sidechain args parent_chain_signblockscript = '51' @@ -80,6 +82,7 @@ def setup_network(self, split=False): '-parentpubkeyprefix=235', '-parentscriptprefix=75', '-con_parent_chain_signblockscript=%s' % parent_chain_signblockscript, + '-con_parent_pegged_asset=%s' % parent_pegged_asset, ]) self.nodes.append(start_node(n + 2, self.options.tmpdir, self.extra_args[n + 2], chain='sidechain')) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 87b671dbfac..bb1d0f199bc 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -131,6 +131,7 @@ class CCustomParams : public CChainParams { consensus.pegin_min_depth = GetArg("-peginconfirmationdepth", DEFAULT_PEGIN_CONFIRMATION_DEPTH); consensus.mandatory_coinbase_destination = StrHexToScriptWithDefault(GetArg("-con_mandatorycoinbase", ""), CScript()); // Blank script allows any coinbase destination consensus.parent_chain_signblockscript = StrHexToScriptWithDefault(GetArg("-con_parent_chain_signblockscript", ""), CScript()); + consensus.parent_pegged_asset.SetHex(GetArg("-con_parent_pegged_asset", "0x00")); // bitcoin regtest is the parent chain by default parentGenesisBlockHash = uint256S(GetArg("-parentgenesisblockhash", "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")); diff --git a/src/consensus/params.h b/src/consensus/params.h index ac5e3baa685..5414ad0eb1b 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -74,6 +74,7 @@ struct Params { CScript signblockscript; bool has_parent_chain; CScript parent_chain_signblockscript; + CAsset parent_pegged_asset; bool ParentChainHasPow() const { return parent_chain_signblockscript == CScript();} }; } // namespace Consensus diff --git a/src/init.cpp b/src/init.cpp index 7d218f09d6b..15b6e6eccc3 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -519,6 +519,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-parentpubkeyprefix", strprintf(_("The byte prefix, in decimal, of the parent chain's base58 pubkey address. (default: %d)"), 111)); strUsage += HelpMessageOpt("-parentscriptprefix", strprintf(_("The byte prefix, in decimal, of the parent chain's base58 script address. (default: %d)"), 196)); strUsage += HelpMessageOpt("-con_parent_chain_signblockscript", _("Whether parent chain uses pow or signed blocks. If the parent chain uses signed blocks, the challenge (scriptPubKey) script. If not, an empty string. (default: empty script [ie parent uses pow])")); + strUsage += HelpMessageOpt("-con_parent_pegged_asset=", _("Asset ID (hex) for pegged asset for when parent chain has CA. (default: 0x00)")); } strUsage += HelpMessageOpt("-validatepegin", strprintf(_("Validate pegin claims. All functionaries must run this. (default: %u)"), DEFAULT_VALIDATE_PEGIN)); strUsage += HelpMessageOpt("-mainchainrpchost=", strprintf("The address which the daemon will try to connect to validate peg-ins, if enabled. (default: cookie auth)")); diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 53f7c2999e4..c36e86c052a 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1113,6 +1113,7 @@ UniValue getsidechaininfo(const JSONRPCRequest& request) "\nExamples:\n" + HelpExampleCli("getsidechaininfo", "") + HelpExampleRpc("getsidechaininfo", "") + // TODO Update docs ); LOCK(cs_main); @@ -1129,6 +1130,7 @@ UniValue getsidechaininfo(const JSONRPCRequest& request) if (!consensus.ParentChainHasPow()) { obj.push_back(Pair("parent_chain_signblockscript_asm", ScriptToAsmStr(consensus.parent_chain_signblockscript))); obj.push_back(Pair("parent_chain_signblockscript_hex", HexStr(consensus.parent_chain_signblockscript))); + obj.push_back(Pair("parent_pegged_asset", HexStr(consensus.parent_pegged_asset))); } return obj; } diff --git a/src/validation.cpp b/src/validation.cpp index e71d871b5e2..f368785d2c2 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2380,6 +2380,12 @@ bool GetAmountFromParentChainPegin(CAmount& amount, const CTransaction& txBTC, u if (!txBTC.vout[nOut].nValue.IsExplicit()) { return false; } + if (!txBTC.vout[nOut].nAsset.IsExplicit()) { + return false; + } + if (txBTC.vout[nOut].nAsset.GetAsset() != Params().GetConsensus().parent_pegged_asset) { + return false; + } amount = txBTC.vout[nOut].nValue.GetAmount(); return true; } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 03e5d4d2ae9..acfd861315e 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3625,7 +3625,8 @@ static UniValue createrawpegin(const JSONRPCRequest& request, T_tx_ref& txBTCRef CAmount value = 0; if (!GetAmountFromParentChainPegin(value, txBTC, nOut)) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Amounts to pegin must be explicit"); + throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Amounts to pegin must be explicit and asset must be %s", + Params().GetConsensus().parent_pegged_asset.GetHex())); } CDataStream stream(0, 0);