Skip to content

Commit 0d55dea

Browse files
committed
descriptors: Add DescriptorImpl::Clone
1 parent 7e86541 commit 0d55dea

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

src/script/descriptor.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,8 @@ class DescriptorImpl : public Descriptor
786786
arg->GetPubKeys(pubkeys, ext_pubs);
787787
}
788788
}
789+
790+
virtual std::unique_ptr<DescriptorImpl> Clone() const = 0;
789791
};
790792

791793
/** A parsed addr(A) descriptor. */
@@ -807,6 +809,10 @@ class AddressDescriptor final : public DescriptorImpl
807809
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
808810

809811
std::optional<int64_t> ScriptSize() const override { return GetScriptForDestination(m_destination).size(); }
812+
std::unique_ptr<DescriptorImpl> Clone() const override
813+
{
814+
return std::make_unique<AddressDescriptor>(m_destination);
815+
}
810816
};
811817

812818
/** A parsed raw(H) descriptor. */
@@ -830,6 +836,11 @@ class RawDescriptor final : public DescriptorImpl
830836
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
831837

832838
std::optional<int64_t> ScriptSize() const override { return m_script.size(); }
839+
840+
std::unique_ptr<DescriptorImpl> Clone() const override
841+
{
842+
return std::make_unique<RawDescriptor>(m_script);
843+
}
833844
};
834845

835846
/** A parsed pk(P) descriptor. */
@@ -865,6 +876,11 @@ class PKDescriptor final : public DescriptorImpl
865876
}
866877

867878
std::optional<int64_t> MaxSatisfactionElems() const override { return 1; }
879+
880+
std::unique_ptr<DescriptorImpl> Clone() const override
881+
{
882+
return std::make_unique<PKDescriptor>(m_pubkey_args.at(0)->Clone(), m_xonly);
883+
}
868884
};
869885

870886
/** A parsed pkh(P) descriptor. */
@@ -894,6 +910,11 @@ class PKHDescriptor final : public DescriptorImpl
894910
}
895911

896912
std::optional<int64_t> MaxSatisfactionElems() const override { return 2; }
913+
914+
std::unique_ptr<DescriptorImpl> Clone() const override
915+
{
916+
return std::make_unique<PKHDescriptor>(m_pubkey_args.at(0)->Clone());
917+
}
897918
};
898919

899920
/** A parsed wpkh(P) descriptor. */
@@ -923,6 +944,11 @@ class WPKHDescriptor final : public DescriptorImpl
923944
}
924945

925946
std::optional<int64_t> MaxSatisfactionElems() const override { return 2; }
947+
948+
std::unique_ptr<DescriptorImpl> Clone() const override
949+
{
950+
return std::make_unique<WPKHDescriptor>(m_pubkey_args.at(0)->Clone());
951+
}
926952
};
927953

928954
/** A parsed combo(P) descriptor. */
@@ -947,6 +973,10 @@ class ComboDescriptor final : public DescriptorImpl
947973
public:
948974
ComboDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), "combo") {}
949975
bool IsSingleType() const final { return false; }
976+
std::unique_ptr<DescriptorImpl> Clone() const override
977+
{
978+
return std::make_unique<ComboDescriptor>(m_pubkey_args.at(0)->Clone());
979+
}
950980
};
951981

952982
/** A parsed multi(...) or sortedmulti(...) descriptor */
@@ -985,6 +1015,14 @@ class MultisigDescriptor final : public DescriptorImpl
9851015
}
9861016

9871017
std::optional<int64_t> MaxSatisfactionElems() const override { return 1 + m_threshold; }
1018+
1019+
std::unique_ptr<DescriptorImpl> Clone() const override
1020+
{
1021+
std::vector<std::unique_ptr<PubkeyProvider>> providers;
1022+
providers.reserve(m_pubkey_args.size());
1023+
std::transform(m_pubkey_args.begin(), m_pubkey_args.end(), providers.begin(), [](const std::unique_ptr<PubkeyProvider>& p) { return p->Clone(); });
1024+
return std::make_unique<MultisigDescriptor>(m_threshold, std::move(providers), m_sorted);
1025+
}
9881026
};
9891027

9901028
/** A parsed (sorted)multi_a(...) descriptor. Always uses x-only pubkeys. */
@@ -1021,6 +1059,16 @@ class MultiADescriptor final : public DescriptorImpl
10211059
}
10221060

10231061
std::optional<int64_t> MaxSatisfactionElems() const override { return m_pubkey_args.size(); }
1062+
1063+
std::unique_ptr<DescriptorImpl> Clone() const override
1064+
{
1065+
std::vector<std::unique_ptr<PubkeyProvider>> providers;
1066+
providers.reserve(m_pubkey_args.size());
1067+
for (const auto& arg : m_pubkey_args) {
1068+
providers.push_back(arg->Clone());
1069+
}
1070+
return std::make_unique<MultiADescriptor>(m_threshold, std::move(providers), m_sorted);
1071+
}
10241072
};
10251073

10261074
/** A parsed sh(...) descriptor. */
@@ -1066,6 +1114,11 @@ class SHDescriptor final : public DescriptorImpl
10661114
if (const auto sub_elems = m_subdescriptor_args[0]->MaxSatisfactionElems()) return 1 + *sub_elems;
10671115
return {};
10681116
}
1117+
1118+
std::unique_ptr<DescriptorImpl> Clone() const override
1119+
{
1120+
return std::make_unique<SHDescriptor>(m_subdescriptor_args.at(0)->Clone());
1121+
}
10691122
};
10701123

10711124
/** A parsed wsh(...) descriptor. */
@@ -1102,6 +1155,11 @@ class WSHDescriptor final : public DescriptorImpl
11021155
if (const auto sub_elems = m_subdescriptor_args[0]->MaxSatisfactionElems()) return 1 + *sub_elems;
11031156
return {};
11041157
}
1158+
1159+
std::unique_ptr<DescriptorImpl> Clone() const override
1160+
{
1161+
return std::make_unique<WSHDescriptor>(m_subdescriptor_args.at(0)->Clone());
1162+
}
11051163
};
11061164

11071165
/** A parsed tr(...) descriptor. */
@@ -1167,6 +1225,14 @@ class TRDescriptor final : public DescriptorImpl
11671225
// FIXME: See above, we assume keypath spend.
11681226
return 1;
11691227
}
1228+
1229+
std::unique_ptr<DescriptorImpl> Clone() const override
1230+
{
1231+
std::vector<std::unique_ptr<DescriptorImpl>> subdescs;
1232+
subdescs.reserve(m_subdescriptor_args.size());
1233+
std::transform(m_subdescriptor_args.begin(), m_subdescriptor_args.end(), subdescs.begin(), [](const std::unique_ptr<DescriptorImpl>& d) { return d->Clone(); });
1234+
return std::make_unique<TRDescriptor>(m_pubkey_args.at(0)->Clone(), std::move(subdescs), m_depths);
1235+
}
11701236
};
11711237

11721238
/* We instantiate Miniscript here with a simple integer as key type.
@@ -1285,6 +1351,16 @@ class MiniscriptDescriptor final : public DescriptorImpl
12851351
std::optional<int64_t> MaxSatisfactionElems() const override {
12861352
return m_node->GetStackSize();
12871353
}
1354+
1355+
std::unique_ptr<DescriptorImpl> Clone() const override
1356+
{
1357+
std::vector<std::unique_ptr<PubkeyProvider>> providers;
1358+
providers.reserve(m_pubkey_args.size());
1359+
for (const auto& arg : m_pubkey_args) {
1360+
providers.push_back(arg->Clone());
1361+
}
1362+
return std::make_unique<MiniscriptDescriptor>(std::move(providers), miniscript::MakeNodeRef<uint32_t>(*m_node));
1363+
}
12881364
};
12891365

12901366
/** A parsed rawtr(...) descriptor. */
@@ -1315,6 +1391,11 @@ class RawTRDescriptor final : public DescriptorImpl
13151391
// See above, we assume keypath spend.
13161392
return 1;
13171393
}
1394+
1395+
std::unique_ptr<DescriptorImpl> Clone() const override
1396+
{
1397+
return std::make_unique<RawTRDescriptor>(m_pubkey_args.at(0)->Clone());
1398+
}
13181399
};
13191400

13201401
////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)