Skip to content

Commit 06209ba

Browse files
committed
Merge #709: tweakfedpegscript: Optional fedpeg arg
97e46f9 tweakfedpegscript: Optional fedpeg arg (Gregory Sanders) Pull request description: Might be useful for dynamic federations chains, when calculating old peg-in addresses Tree-SHA512: 33c8f58cf020cf835640ca959f6e84dd58b59df3386fcd5ac71dee9c210028d0857acef65a02fb84888209010e41115b5c54bbb2458effc284afaf44b310c3a5
2 parents d6f304a + 97e46f9 commit 06209ba

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

src/rpc/misc.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -631,12 +631,13 @@ static UniValue echo(const JSONRPCRequest& request)
631631

632632
UniValue tweakfedpegscript(const JSONRPCRequest& request)
633633
{
634-
if (request.fHelp || request.params.size() != 1)
634+
if (request.fHelp || request.params.size() < 1 || request.params.size() > 2)
635635
throw std::runtime_error(
636636
RPCHelpMan{"tweakfedpegscript",
637637
"\nReturns a tweaked fedpegscript.\n",
638638
{
639639
{"claim_script", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "Script to tweak the fedpegscript with. For example obtained as a result of getpeginaddress."},
640+
{"fedpegscript", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED_NAMED_ARG, "Fedpegscript to be used with the claim_script. By default this is the current fedpegscript."},
640641
},
641642
RPCResult{
642643
"{\n"
@@ -651,11 +652,21 @@ UniValue tweakfedpegscript(const JSONRPCRequest& request)
651652
throw JSONRPCError(RPC_TYPE_ERROR, "the first argument must be a hex string");
652653
}
653654

655+
CScript fedpegscript = GetValidFedpegScripts(chainActive.Tip(), Params().GetConsensus(), true /* nextblock_validation */).front().second;
656+
657+
if (!request.params[1].isNull()) {
658+
if (IsHex(request.params[1].get_str())) {
659+
std::vector<unsigned char> fedpeg_byte = ParseHex(request.params[1].get_str());
660+
fedpegscript = CScript(fedpeg_byte.begin(), fedpeg_byte.end());
661+
} else {
662+
throw JSONRPCError(RPC_TYPE_ERROR, "fedpegscript must be a hex string");
663+
}
664+
}
665+
654666
std::vector<unsigned char> scriptData = ParseHex(request.params[0].get_str());
655667
CScript claim_script = CScript(scriptData.begin(), scriptData.end());
656668

657-
const auto& fedpegscripts = GetValidFedpegScripts(chainActive.Tip(), Params().GetConsensus(), true /* nextblock_validation */);
658-
CScript tweaked_script = calculate_contract(fedpegscripts.front().second, claim_script);
669+
CScript tweaked_script = calculate_contract(fedpegscript, claim_script);
659670
CTxDestination parent_addr(ScriptHash(GetScriptForWitness(tweaked_script)));
660671

661672
UniValue ret(UniValue::VOBJ);
@@ -846,7 +857,7 @@ static const CRPCCommand commands[] =
846857
{ "util", "signmessagewithprivkey", &signmessagewithprivkey, {"privkey","message"} },
847858
// ELEMENTS:
848859
{ "util", "getpakinfo", &getpakinfo, {}},
849-
{ "util", "tweakfedpegscript", &tweakfedpegscript, {"claim_script"} },
860+
{ "util", "tweakfedpegscript", &tweakfedpegscript, {"claim_script", "fedpegscript"} },
850861
{ "util", "createblindedaddress", &createblindedaddress, {"address", "blinding_key"}},
851862
{ "util", "dumpassetlabels", &dumpassetlabels, {}},
852863
{ "hidden", "calcfastmerkleroot", &calcfastmerkleroot, {"leaves"} },

test/functional/rpc_tweakfedpeg.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,5 +104,11 @@ def run_test(self):
104104
dyna_fed_tweaked = "75745c87635b2103258857ed88024e5296436f851337451d3d68522fbb21dc5a047b965cd2f790932103ab43d77e8706a799cee3c14678574bccaca98c101217369cee987073cd2546492102ee5c8dfdf742bcc2b08386a6a3ec4b6087d39a6fd7e6f0fdeb82ecc30b11d0342102b104b6a469d8b3ccf0a671198e5f7d7010dbf2eb5587733b168f6e0d3be75760210207fc37d4877529fb0d63b1de352689627400a43f18717fa182fe0eea283bdd7921025d8724d82c61708458bc1a08ec9a7fcaf0ab6747ccf0a7d378faea07a261ab3e2102af6859d48d0a4518a4811f12adb974bbd051931e3f96f0b6ae16142c43ae6fd12102458215967f7977effc21b964bd92d870ae7eca98f343801031639150139e63ed2102cdef66bf4b5d26d0be22cabd5761970cfa84be905dc0137ad08ab634f104cb9e210297fb764f808c126f46ce0444124213bdc6a18f2904e75c9144f53bed4c19376e2103c631e77d14a5eb2fc61496ee3e9ea19d1e56e7e65a07aaa786f25ffc2921efde210270addb9011a4b41987b0848a8dc52e5442964fe5188c6a4c9320fbb9016390772103bf9aa75444d0013c46dcf10d70831b75b46a25d901fb7c6360beb2f6cac9c503210278f303dbaad1410a26d99e4dca8925fae4c90532a156c29e8ab1abf5ccaa663d210394cc0983add2dc60aa988c9faedebdc5463106184d72dd430ef24d215daf8b935f6702c00fb275522102892d66841804e5ad236f9e012bd8f1082857c9355f83aa4cd64dbe19e487d50821032d090e7b1d5047a3ac626de4b2a18e210501734895c5b7717412dac0234dd97b21026a693f0278011a09d56c04cf6b62ce8253c92a5f03a5010e6633b497ce3989085368ae"
105105
assert_equal(self.nodes[2].tweakfedpegscript(claim_script)["script"], dyna_fed_tweaked)
106106

107+
# Optional fedpegscript arg (same arg as active script!)
108+
assert_equal(self.nodes[2].tweakfedpegscript(claim_script, DYNAFED_SCRIPT)["script"], dyna_fed_tweaked)
109+
110+
# Older script should result in same as before
111+
assert_equal(self.nodes[2].tweakfedpegscript(claim_script, LIQUID_SCRIPT)["script"], liquid_tweaked)
112+
107113
if __name__ == '__main__':
108114
TweakFedpegTest().main()

0 commit comments

Comments
 (0)