@@ -786,6 +786,8 @@ class DescriptorImpl : public Descriptor
786
786
arg->GetPubKeys (pubkeys, ext_pubs);
787
787
}
788
788
}
789
+
790
+ virtual std::unique_ptr<DescriptorImpl> Clone () const = 0;
789
791
};
790
792
791
793
/* * A parsed addr(A) descriptor. */
@@ -807,6 +809,10 @@ class AddressDescriptor final : public DescriptorImpl
807
809
bool ToPrivateString (const SigningProvider& arg, std::string& out) const final { return false ; }
808
810
809
811
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
+ }
810
816
};
811
817
812
818
/* * A parsed raw(H) descriptor. */
@@ -830,6 +836,11 @@ class RawDescriptor final : public DescriptorImpl
830
836
bool ToPrivateString (const SigningProvider& arg, std::string& out) const final { return false ; }
831
837
832
838
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
+ }
833
844
};
834
845
835
846
/* * A parsed pk(P) descriptor. */
@@ -865,6 +876,11 @@ class PKDescriptor final : public DescriptorImpl
865
876
}
866
877
867
878
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
+ }
868
884
};
869
885
870
886
/* * A parsed pkh(P) descriptor. */
@@ -894,6 +910,11 @@ class PKHDescriptor final : public DescriptorImpl
894
910
}
895
911
896
912
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
+ }
897
918
};
898
919
899
920
/* * A parsed wpkh(P) descriptor. */
@@ -923,6 +944,11 @@ class WPKHDescriptor final : public DescriptorImpl
923
944
}
924
945
925
946
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
+ }
926
952
};
927
953
928
954
/* * A parsed combo(P) descriptor. */
@@ -947,6 +973,10 @@ class ComboDescriptor final : public DescriptorImpl
947
973
public:
948
974
ComboDescriptor (std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), " combo" ) {}
949
975
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
+ }
950
980
};
951
981
952
982
/* * A parsed multi(...) or sortedmulti(...) descriptor */
@@ -985,6 +1015,14 @@ class MultisigDescriptor final : public DescriptorImpl
985
1015
}
986
1016
987
1017
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
+ }
988
1026
};
989
1027
990
1028
/* * A parsed (sorted)multi_a(...) descriptor. Always uses x-only pubkeys. */
@@ -1021,6 +1059,16 @@ class MultiADescriptor final : public DescriptorImpl
1021
1059
}
1022
1060
1023
1061
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
+ }
1024
1072
};
1025
1073
1026
1074
/* * A parsed sh(...) descriptor. */
@@ -1066,6 +1114,11 @@ class SHDescriptor final : public DescriptorImpl
1066
1114
if (const auto sub_elems = m_subdescriptor_args[0 ]->MaxSatisfactionElems ()) return 1 + *sub_elems;
1067
1115
return {};
1068
1116
}
1117
+
1118
+ std::unique_ptr<DescriptorImpl> Clone () const override
1119
+ {
1120
+ return std::make_unique<SHDescriptor>(m_subdescriptor_args.at (0 )->Clone ());
1121
+ }
1069
1122
};
1070
1123
1071
1124
/* * A parsed wsh(...) descriptor. */
@@ -1102,6 +1155,11 @@ class WSHDescriptor final : public DescriptorImpl
1102
1155
if (const auto sub_elems = m_subdescriptor_args[0 ]->MaxSatisfactionElems ()) return 1 + *sub_elems;
1103
1156
return {};
1104
1157
}
1158
+
1159
+ std::unique_ptr<DescriptorImpl> Clone () const override
1160
+ {
1161
+ return std::make_unique<WSHDescriptor>(m_subdescriptor_args.at (0 )->Clone ());
1162
+ }
1105
1163
};
1106
1164
1107
1165
/* * A parsed tr(...) descriptor. */
@@ -1167,6 +1225,14 @@ class TRDescriptor final : public DescriptorImpl
1167
1225
// FIXME: See above, we assume keypath spend.
1168
1226
return 1 ;
1169
1227
}
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
+ }
1170
1236
};
1171
1237
1172
1238
/* We instantiate Miniscript here with a simple integer as key type.
@@ -1285,6 +1351,16 @@ class MiniscriptDescriptor final : public DescriptorImpl
1285
1351
std::optional<int64_t > MaxSatisfactionElems () const override {
1286
1352
return m_node->GetStackSize ();
1287
1353
}
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
+ }
1288
1364
};
1289
1365
1290
1366
/* * A parsed rawtr(...) descriptor. */
@@ -1315,6 +1391,11 @@ class RawTRDescriptor final : public DescriptorImpl
1315
1391
// See above, we assume keypath spend.
1316
1392
return 1 ;
1317
1393
}
1394
+
1395
+ std::unique_ptr<DescriptorImpl> Clone () const override
1396
+ {
1397
+ return std::make_unique<RawTRDescriptor>(m_pubkey_args.at (0 )->Clone ());
1398
+ }
1318
1399
};
1319
1400
1320
1401
// //////////////////////////////////////////////////////////////////////////
0 commit comments