@@ -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
@@ -59,6 +64,17 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
5964 None
6065 }
6166
67+ /// Given a keyhash, look up the schnorr signature and the associated key
68+ /// Even if signatures for public key Hashes are not available, the users
69+ /// can use this map to provide pkh -> pk mapping which can be useful
70+ /// for dissatisfying pkh.
71+ fn lookup_pkh_schnorr_sig (
72+ & self ,
73+ _: & Pk :: Hash ,
74+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
75+ None
76+ }
77+
6278 /// Given a SHA256 hash, look up its preimage
6379 fn lookup_sha256 ( & self , _: sha256:: Hash ) -> Option < Preimage32 > {
6480 None
@@ -139,6 +155,12 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk, bitcoin::Ecd
139155 }
140156}
141157
158+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk , bitcoin:: SchnorrSig > {
159+ fn lookup_schnorr_sig ( & self , key : & Pk ) -> Option < bitcoin:: SchnorrSig > {
160+ self . get ( key) . map ( |x| * x)
161+ }
162+ }
163+
142164impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk :: Hash , ( Pk , bitcoin:: EcdsaSig ) >
143165where
144166 Pk : MiniscriptKey + ToPublicKey ,
@@ -160,11 +182,36 @@ where
160182 }
161183}
162184
185+ impl < Pk : MiniscriptKey + ToPublicKey > Satisfier < Pk > for HashMap < Pk :: Hash , ( Pk , bitcoin:: SchnorrSig ) >
186+ where
187+ Pk : MiniscriptKey + ToPublicKey ,
188+ {
189+ fn lookup_schnorr_sig ( & self , key : & Pk ) -> Option < bitcoin:: SchnorrSig > {
190+ self . get ( & key. to_pubkeyhash ( ) ) . map ( |x| x. 1 )
191+ }
192+
193+ fn lookup_pkh_pk ( & self , pk_hash : & Pk :: Hash ) -> Option < Pk > {
194+ self . get ( pk_hash) . map ( |x| x. 0 . clone ( ) )
195+ }
196+
197+ fn lookup_pkh_schnorr_sig (
198+ & self ,
199+ pk_hash : & Pk :: Hash ,
200+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
201+ self . get ( pk_hash)
202+ . map ( |& ( ref pk, sig) | ( pk. to_public_key ( ) , sig) )
203+ }
204+ }
205+
163206impl < ' a , Pk : MiniscriptKey + ToPublicKey , S : Satisfier < Pk > > Satisfier < Pk > for & ' a S {
164207 fn lookup_ec_sig ( & self , p : & Pk ) -> Option < bitcoin:: EcdsaSig > {
165208 ( * * self ) . lookup_ec_sig ( p)
166209 }
167210
211+ fn lookup_schnorr_sig ( & self , p : & Pk ) -> Option < bitcoin:: SchnorrSig > {
212+ ( * * self ) . lookup_schnorr_sig ( p)
213+ }
214+
168215 fn lookup_pkh_pk ( & self , pkh : & Pk :: Hash ) -> Option < Pk > {
169216 ( * * self ) . lookup_pkh_pk ( pkh)
170217 }
@@ -173,6 +220,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
173220 ( * * self ) . lookup_pkh_ec_sig ( pkh)
174221 }
175222
223+ fn lookup_pkh_schnorr_sig (
224+ & self ,
225+ pkh : & Pk :: Hash ,
226+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
227+ ( * * self ) . lookup_pkh_schnorr_sig ( pkh)
228+ }
229+
176230 fn lookup_sha256 ( & self , h : sha256:: Hash ) -> Option < Preimage32 > {
177231 ( * * self ) . lookup_sha256 ( h)
178232 }
@@ -203,6 +257,10 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
203257 ( * * self ) . lookup_ec_sig ( p)
204258 }
205259
260+ fn lookup_schnorr_sig ( & self , p : & Pk ) -> Option < bitcoin:: SchnorrSig > {
261+ ( * * self ) . lookup_schnorr_sig ( p)
262+ }
263+
206264 fn lookup_pkh_pk ( & self , pkh : & Pk :: Hash ) -> Option < Pk > {
207265 ( * * self ) . lookup_pkh_pk ( pkh)
208266 }
@@ -211,6 +269,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
211269 ( * * self ) . lookup_pkh_ec_sig ( pkh)
212270 }
213271
272+ fn lookup_pkh_schnorr_sig (
273+ & self ,
274+ pkh : & Pk :: Hash ,
275+ ) -> Option < ( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
276+ ( * * self ) . lookup_pkh_schnorr_sig ( pkh)
277+ }
278+
214279 fn lookup_sha256 ( & self , h : sha256:: Hash ) -> Option < Preimage32 > {
215280 ( * * self ) . lookup_sha256 ( h)
216281 }
@@ -254,6 +319,16 @@ macro_rules! impl_tuple_satisfier {
254319 None
255320 }
256321
322+ fn lookup_schnorr_sig( & self , key: & Pk ) -> Option <bitcoin:: SchnorrSig > {
323+ let & ( $( ref $ty, ) * ) = self ;
324+ $(
325+ if let Some ( result) = $ty. lookup_schnorr_sig( key) {
326+ return Some ( result) ;
327+ }
328+ ) *
329+ None
330+ }
331+
257332 fn lookup_pkh_ec_sig(
258333 & self ,
259334 key_hash: & Pk :: Hash ,
@@ -267,6 +342,19 @@ macro_rules! impl_tuple_satisfier {
267342 None
268343 }
269344
345+ fn lookup_pkh_schnorr_sig(
346+ & self ,
347+ key_hash: & Pk :: Hash ,
348+ ) -> Option <( bitcoin:: PublicKey , bitcoin:: SchnorrSig ) > {
349+ let & ( $( ref $ty, ) * ) = self ;
350+ $(
351+ if let Some ( result) = $ty. lookup_pkh_schnorr_sig( key_hash) {
352+ return Some ( result) ;
353+ }
354+ ) *
355+ None
356+ }
357+
270358 fn lookup_pkh_pk(
271359 & self ,
272360 key_hash: & Pk :: Hash ,
0 commit comments