@@ -46,6 +46,11 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
4646 None
4747 }
4848
49+ /// Given a public key, look up an schnorr signature with that key
50+ fn lookup_schnorr_sig ( & self , _: & Pk ) -> Option < bitcoin:: SchnorrSig > {
51+ None
52+ }
53+
4954 /// Given a `Pkh`, lookup corresponding `Pk`
5055 fn lookup_pkh_pk ( & self , _: & Pk :: Hash ) -> Option < Pk > {
5156 None
@@ -62,6 +67,17 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
6267 None
6368 }
6469
70+ /// Given a keyhash, look up the schnorr signature and the associated key
71+ /// Even if signatures for public key Hashes are not available, the users
72+ /// can use this map to provide pkh -> pk mapping which can be useful
73+ /// for dissatisfying pkh.
74+ fn lookup_pkh_schnorr_sig (
75+ & self ,
76+ _: & Pk :: Hash ,
77+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
78+ None
79+ }
80+
6581 /// Given a SHA256 hash, look up its preimage
6682 fn lookup_sha256 ( & self , _: sha256:: Hash ) -> Option < Preimage32 > {
6783 None
@@ -142,6 +158,12 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk, bitcoin::Ecd
142158 }
143159}
144160
161+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk , bitcoin:: SchnorrSig > {
162+ fn lookup_schnorr_sig ( & self , key : & Pk ) -> Option < bitcoin:: SchnorrSig > {
163+ self . get ( key) . map ( |x| * x)
164+ }
165+ }
166+
145167impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk :: Hash , ( Pk , bitcoin:: EcdsaSig ) >
146168where
147169 Pk : MiniscriptKey + ToPublicKey ,
@@ -163,11 +185,36 @@ where
163185 }
164186}
165187
188+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk :: Hash , ( Pk , bitcoin:: SchnorrSig ) >
189+ where
190+ Pk : MiniscriptKey + ToPublicKey ,
191+ {
192+ fn lookup_schnorr_sig ( & self , key : & Pk ) -> Option < bitcoin:: SchnorrSig > {
193+ self . get ( & key. to_pubkeyhash ( ) ) . map ( |x| x. 1 )
194+ }
195+
196+ fn lookup_pkh_pk ( & self , pk_hash : & Pk :: Hash ) -> Option < Pk > {
197+ self . get ( pk_hash) . map ( |x| x. 0 . clone ( ) )
198+ }
199+
200+ fn lookup_pkh_schnorr_sig (
201+ & self ,
202+ pk_hash : & Pk :: Hash ,
203+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
204+ self . get ( pk_hash)
205+ . map ( |& ( ref pk, sig) | ( pk. to_public_key ( ) , sig) )
206+ }
207+ }
208+
166209impl < ' a , Pk : MiniscriptKey + ToPublicKey , S : Satisfier < Pk > > Satisfier < Pk > for & ' a S {
167210 fn lookup_ecdsa_sig ( & self , p : & Pk ) -> Option < bitcoin:: EcdsaSig > {
168211 ( * * self ) . lookup_ecdsa_sig ( p)
169212 }
170213
214+ fn lookup_schnorr_sig ( & self , p : & Pk ) -> Option < bitcoin:: SchnorrSig > {
215+ ( * * self ) . lookup_schnorr_sig ( p)
216+ }
217+
171218 fn lookup_pkh_pk ( & self , pkh : & Pk :: Hash ) -> Option < Pk > {
172219 ( * * self ) . lookup_pkh_pk ( pkh)
173220 }
@@ -179,6 +226,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
179226 ( * * self ) . lookup_pkh_ecdsa_sig ( pkh)
180227 }
181228
229+ fn lookup_pkh_schnorr_sig (
230+ & self ,
231+ pkh : & Pk :: Hash ,
232+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
233+ ( * * self ) . lookup_pkh_schnorr_sig ( pkh)
234+ }
235+
182236 fn lookup_sha256 ( & self , h : sha256:: Hash ) -> Option < Preimage32 > {
183237 ( * * self ) . lookup_sha256 ( h)
184238 }
@@ -209,6 +263,10 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
209263 ( * * self ) . lookup_ecdsa_sig ( p)
210264 }
211265
266+ fn lookup_schnorr_sig ( & self , p : & Pk ) -> Option < bitcoin:: SchnorrSig > {
267+ ( * * self ) . lookup_schnorr_sig ( p)
268+ }
269+
212270 fn lookup_pkh_pk ( & self , pkh : & Pk :: Hash ) -> Option < Pk > {
213271 ( * * self ) . lookup_pkh_pk ( pkh)
214272 }
@@ -220,6 +278,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
220278 ( * * self ) . lookup_pkh_ecdsa_sig ( pkh)
221279 }
222280
281+ fn lookup_pkh_schnorr_sig (
282+ & self ,
283+ pkh : & Pk :: Hash ,
284+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
285+ ( * * self ) . lookup_pkh_schnorr_sig ( pkh)
286+ }
287+
223288 fn lookup_sha256 ( & self , h : sha256:: Hash ) -> Option < Preimage32 > {
224289 ( * * self ) . lookup_sha256 ( h)
225290 }
@@ -263,6 +328,16 @@ macro_rules! impl_tuple_satisfier {
263328 None
264329 }
265330
331+ fn lookup_schnorr_sig( & self , key: & Pk ) -> Option <bitcoin:: SchnorrSig > {
332+ let & ( $( ref $ty, ) * ) = self ;
333+ $(
334+ if let Some ( result) = $ty. lookup_schnorr_sig( key) {
335+ return Some ( result) ;
336+ }
337+ ) *
338+ None
339+ }
340+
266341 fn lookup_pkh_ecdsa_sig(
267342 & self ,
268343 key_hash: & Pk :: Hash ,
@@ -276,6 +351,19 @@ macro_rules! impl_tuple_satisfier {
276351 None
277352 }
278353
354+ fn lookup_pkh_schnorr_sig(
355+ & self ,
356+ key_hash: & Pk :: Hash ,
357+ ) -> Option <( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
358+ let & ( $( ref $ty, ) * ) = self ;
359+ $(
360+ if let Some ( result) = $ty. lookup_pkh_schnorr_sig( key_hash) {
361+ return Some ( result) ;
362+ }
363+ ) *
364+ None
365+ }
366+
279367 fn lookup_pkh_pk(
280368 & self ,
281369 key_hash: & Pk :: Hash ,
0 commit comments