Skip to content

Commit 2d6d50a

Browse files
committed
Add translate functions
1 parent d4d9f1a commit 2d6d50a

File tree

3 files changed

+114
-3
lines changed

3 files changed

+114
-3
lines changed

src/descriptor/bare.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use {BareCtx, Error, Miniscript, MiniscriptKey, Satisfier, ToPublicKey};
3030

3131
use super::{
3232
checksum::{desc_checksum, verify_checksum},
33-
DescriptorTrait,
33+
DescriptorTrait, PkTranslate,
3434
};
3535

3636
/// Create a Bare Descriptor. That is descriptor that is
@@ -175,6 +175,27 @@ where
175175
}
176176
}
177177

178+
impl<P: MiniscriptKey, Q: MiniscriptKey> PkTranslate<P, Q> for Bare<P> {
179+
type Output = Bare<Q>;
180+
181+
fn translate_pk<Fpk, Fpkh, E>(
182+
&self,
183+
mut translatefpk: Fpk,
184+
mut translatefpkh: Fpkh,
185+
) -> Result<Self::Output, E>
186+
where
187+
Fpk: FnMut(&P) -> Result<Q, E>,
188+
Fpkh: FnMut(&P::Hash) -> Result<Q::Hash, E>,
189+
Q: MiniscriptKey,
190+
{
191+
Ok(Bare::new(
192+
self.ms
193+
.translate_pk(&mut translatefpk, &mut translatefpkh)?,
194+
)
195+
.expect("Translation cannot fail inside Bare"))
196+
}
197+
}
198+
178199
/// A bare PkH descriptor at top level
179200
#[derive(Clone, Ord, PartialOrd, Eq, PartialEq)]
180201
pub struct Pkh<Pk: MiniscriptKey> {
@@ -333,3 +354,20 @@ where
333354
self.script_pubkey(to_pk_ctx)
334355
}
335356
}
357+
358+
impl<P: MiniscriptKey, Q: MiniscriptKey> PkTranslate<P, Q> for Pkh<P> {
359+
type Output = Pkh<Q>;
360+
361+
fn translate_pk<Fpk, Fpkh, E>(
362+
&self,
363+
mut translatefpk: Fpk,
364+
_translatefpkh: Fpkh,
365+
) -> Result<Self::Output, E>
366+
where
367+
Fpk: FnMut(&P) -> Result<Q, E>,
368+
Fpkh: FnMut(&P::Hash) -> Result<Q::Hash, E>,
369+
Q: MiniscriptKey,
370+
{
371+
Ok(Pkh::new(translatefpk(&self.pk)?))
372+
}
373+
}

src/descriptor/segwitv0.rs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use {Error, Miniscript, MiniscriptKey, Satisfier, Segwitv0, ToPublicKey};
2828

2929
use super::{
3030
checksum::{desc_checksum, verify_checksum},
31-
DescriptorTrait, SortedMultiVec,
31+
DescriptorTrait, PkTranslate, SortedMultiVec,
3232
};
3333
/// A Segwitv0 wsh descriptor
3434
#[derive(Clone, Ord, PartialOrd, Eq, PartialEq)]
@@ -247,6 +247,31 @@ where
247247
}
248248
}
249249

250+
impl<P: MiniscriptKey, Q: MiniscriptKey> PkTranslate<P, Q> for Wsh<P> {
251+
type Output = Wsh<Q>;
252+
253+
fn translate_pk<Fpk, Fpkh, E>(
254+
&self,
255+
mut translatefpk: Fpk,
256+
mut translatefpkh: Fpkh,
257+
) -> Result<Self::Output, E>
258+
where
259+
Fpk: FnMut(&P) -> Result<Q, E>,
260+
Fpkh: FnMut(&P::Hash) -> Result<Q::Hash, E>,
261+
Q: MiniscriptKey,
262+
{
263+
let inner = match self.inner {
264+
WshInner::SortedMulti(ref smv) => {
265+
WshInner::SortedMulti(smv.translate_pk(&mut translatefpk)?)
266+
}
267+
WshInner::Ms(ref ms) => {
268+
WshInner::Ms(ms.translate_pk(&mut translatefpk, &mut translatefpkh)?)
269+
}
270+
};
271+
Ok(Wsh { inner: inner })
272+
}
273+
}
274+
250275
/// A bare Wpkh descriptor at top level
251276
#[derive(Clone, Ord, PartialOrd, Eq, PartialEq)]
252277
pub struct Wpkh<Pk: MiniscriptKey> {
@@ -414,3 +439,20 @@ where
414439
addr.script_pubkey()
415440
}
416441
}
442+
443+
impl<P: MiniscriptKey, Q: MiniscriptKey> PkTranslate<P, Q> for Wpkh<P> {
444+
type Output = Wpkh<Q>;
445+
446+
fn translate_pk<Fpk, Fpkh, E>(
447+
&self,
448+
mut translatefpk: Fpk,
449+
_translatefpkh: Fpkh,
450+
) -> Result<Self::Output, E>
451+
where
452+
Fpk: FnMut(&P) -> Result<Q, E>,
453+
Fpkh: FnMut(&P::Hash) -> Result<Q::Hash, E>,
454+
Q: MiniscriptKey,
455+
{
456+
Ok(Wpkh::new(translatefpk(&self.pk)?).expect("Uncompressed keys in Wpkh"))
457+
}
458+
}

src/descriptor/sh.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use {Error, Legacy, Miniscript, MiniscriptKey, Satisfier, Segwitv0, ToPublicKey}
3131

3232
use super::{
3333
checksum::{desc_checksum, verify_checksum},
34-
DescriptorTrait, SortedMultiVec, Wpkh, Wsh,
34+
DescriptorTrait, PkTranslate, SortedMultiVec, Wpkh, Wsh,
3535
};
3636

3737
/// A Legacy p2sh Descriptor
@@ -336,3 +336,34 @@ where
336336
}
337337
}
338338
}
339+
340+
impl<P: MiniscriptKey, Q: MiniscriptKey> PkTranslate<P, Q> for Sh<P> {
341+
type Output = Sh<Q>;
342+
343+
fn translate_pk<Fpk, Fpkh, E>(
344+
&self,
345+
mut translatefpk: Fpk,
346+
mut translatefpkh: Fpkh,
347+
) -> Result<Self::Output, E>
348+
where
349+
Fpk: FnMut(&P) -> Result<Q, E>,
350+
Fpkh: FnMut(&P::Hash) -> Result<Q::Hash, E>,
351+
Q: MiniscriptKey,
352+
{
353+
let inner = match self.inner {
354+
ShInner::Wsh(ref wsh) => {
355+
ShInner::Wsh(wsh.translate_pk(&mut translatefpk, &mut translatefpkh)?)
356+
}
357+
ShInner::Wpkh(ref wpkh) => {
358+
ShInner::Wpkh(wpkh.translate_pk(&mut translatefpk, &mut translatefpkh)?)
359+
}
360+
ShInner::SortedMulti(ref smv) => {
361+
ShInner::SortedMulti(smv.translate_pk(&mut translatefpk)?)
362+
}
363+
ShInner::Ms(ref ms) => {
364+
ShInner::Ms(ms.translate_pk(&mut translatefpk, &mut translatefpkh)?)
365+
}
366+
};
367+
Ok(Sh { inner: inner })
368+
}
369+
}

0 commit comments

Comments
 (0)