1
- // Copyright 2022-2024 Shift Crypto AG
1
+ // Copyright 2022-2025 Shift Crypto AG
2
2
//
3
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
4
// you may not use this file except in compliance with the License.
@@ -25,10 +25,11 @@ pub use pb::btc_sign_init_request::FormatUnit;
25
25
pub use pb:: { BtcCoin , BtcOutputType } ;
26
26
27
27
use super :: script_configs:: { ValidatedScriptConfig , ValidatedScriptConfigWithKeypath } ;
28
- use super :: { multisig, params:: Params , script } ;
28
+ use super :: { multisig, params:: Params } ;
29
29
30
30
use sha2:: { Digest , Sha256 } ;
31
31
32
+ use bitcoin:: ScriptBuf ;
32
33
use bitcoin:: bech32;
33
34
use bitcoin:: hashes:: Hash ;
34
35
@@ -254,51 +255,42 @@ impl Payload {
254
255
}
255
256
}
256
257
257
- /// Computes the pkScript from a pubkey hash or script hash or pubkey, depending on the output type.
258
+ /// Computes the pkScript from a pubkey hash or script hash or pubkey, depending on the output
259
+ /// type.
258
260
pub fn pk_script ( & self , params : & Params ) -> Result < Vec < u8 > , Error > {
259
261
let payload = self . data . as_slice ( ) ;
260
- match self . output_type {
261
- BtcOutputType :: Unknown => Err ( Error :: InvalidInput ) ,
262
+ let script = match self . output_type {
263
+ BtcOutputType :: Unknown => return Err ( Error :: InvalidInput ) ,
262
264
BtcOutputType :: P2pkh => {
263
- if payload. len ( ) != HASH160_LEN {
264
- return Err ( Error :: Generic ) ;
265
- }
266
- let mut result = vec ! [ script:: OP_DUP , script:: OP_HASH160 ] ;
267
- script:: push_data ( & mut result, payload) ;
268
- result. extend_from_slice ( & [ script:: OP_EQUALVERIFY , script:: OP_CHECKSIG ] ) ;
269
- Ok ( result)
265
+ let pk_hash =
266
+ bitcoin:: PubkeyHash :: from_slice ( payload) . map_err ( |_| Error :: Generic ) ?;
267
+
268
+ ScriptBuf :: new_p2pkh ( & pk_hash)
270
269
}
271
270
BtcOutputType :: P2sh => {
272
- if payload. len ( ) != HASH160_LEN {
273
- return Err ( Error :: Generic ) ;
274
- }
275
- let mut result = vec ! [ script:: OP_HASH160 ] ;
276
- script:: push_data ( & mut result, payload) ;
277
- result. push ( script:: OP_EQUAL ) ;
278
- Ok ( result)
271
+ let script_hash =
272
+ bitcoin:: ScriptHash :: from_slice ( payload) . map_err ( |_| Error :: Generic ) ?;
273
+ ScriptBuf :: new_p2sh ( & script_hash)
279
274
}
280
- BtcOutputType :: P2wpkh | BtcOutputType :: P2wsh => {
281
- if ( self . output_type == BtcOutputType :: P2wpkh && payload. len ( ) != HASH160_LEN )
282
- || ( self . output_type == BtcOutputType :: P2wsh && payload. len ( ) != SHA256_LEN )
283
- {
284
- return Err ( Error :: Generic ) ;
285
- }
286
- let mut result = vec ! [ script:: OP_0 ] ;
287
- script:: push_data ( & mut result, payload) ;
288
- Ok ( result)
275
+ BtcOutputType :: P2wpkh => {
276
+ let wpkh = bitcoin:: WPubkeyHash :: from_slice ( payload) . map_err ( |_| Error :: Generic ) ?;
277
+ ScriptBuf :: new_p2wpkh ( & wpkh)
278
+ }
279
+ BtcOutputType :: P2wsh => {
280
+ let wsh = bitcoin:: WScriptHash :: from_slice ( payload) . map_err ( |_| Error :: Generic ) ?;
281
+ ScriptBuf :: new_p2wsh ( & wsh)
289
282
}
290
283
BtcOutputType :: P2tr => {
291
284
if !params. taproot_support {
292
285
return Err ( Error :: InvalidInput ) ;
293
286
}
294
- if payload. len ( ) != 32 {
295
- return Err ( Error :: Generic ) ;
296
- }
297
- let mut result = vec ! [ script:: OP_1 ] ;
298
- script:: push_data ( & mut result, payload) ;
299
- Ok ( result)
287
+ let tweaked = bitcoin:: key:: TweakedPublicKey :: dangerous_assume_tweaked (
288
+ bitcoin:: XOnlyPublicKey :: from_slice ( payload) . map_err ( |_| Error :: Generic ) ?,
289
+ ) ;
290
+ ScriptBuf :: new_p2tr_tweaked ( tweaked)
300
291
}
301
- }
292
+ } ;
293
+ Ok ( script. into_bytes ( ) )
302
294
}
303
295
}
304
296
0 commit comments