@@ -1300,6 +1300,52 @@ impl BitGoPsbt {
13001300 Ok ( ( ) )
13011301 }
13021302
1303+ /// Merge all input fields from a raw PSBT (given as bytes) into this PSBT.
1304+ ///
1305+ /// For Zcash PSBTs the source is parsed with the ZEC-aware deserializer (skipping
1306+ /// the ZecConsensusBranchId check so that stripped HSM responses are accepted).
1307+ /// For all other coins the bitcoin PSBT deserializer is used.
1308+ ///
1309+ /// Copies per input: partial_sigs, tap_key_sig, tap_script_sigs, proprietary.
1310+ pub fn combine_inputs ( & mut self , other_bytes : & [ u8 ] ) -> Result < ( ) , String > {
1311+ let raw: Psbt = match self {
1312+ BitGoPsbt :: Zcash ( _, network) => {
1313+ ZcashBitGoPsbt :: deserialize_stripped ( other_bytes, * network)
1314+ . map ( |z| z. psbt )
1315+ . map_err ( |e| format ! ( "Failed to parse PSBT: {}" , e) ) ?
1316+ }
1317+ _ => Psbt :: deserialize ( other_bytes)
1318+ . map_err ( |e| format ! ( "Failed to parse PSBT: {}" , e) ) ?,
1319+ } ;
1320+
1321+ let dest = self . psbt_mut ( ) ;
1322+
1323+ if raw. inputs . len ( ) != dest. inputs . len ( ) {
1324+ return Err ( format ! (
1325+ "PSBT input count mismatch: source has {}, destination has {}" ,
1326+ raw. inputs. len( ) ,
1327+ dest. inputs. len( )
1328+ ) ) ;
1329+ }
1330+
1331+ for ( src_in, dest_in) in raw. inputs . iter ( ) . zip ( dest. inputs . iter_mut ( ) ) {
1332+ for ( k, v) in & src_in. partial_sigs {
1333+ dest_in. partial_sigs . insert ( * k, * v) ;
1334+ }
1335+ if let Some ( sig) = src_in. tap_key_sig {
1336+ dest_in. tap_key_sig = Some ( sig) ;
1337+ }
1338+ for ( k, v) in & src_in. tap_script_sigs {
1339+ dest_in. tap_script_sigs . insert ( * k, * v) ;
1340+ }
1341+ for ( k, v) in & src_in. proprietary {
1342+ dest_in. proprietary . insert ( k. clone ( ) , v. clone ( ) ) ;
1343+ }
1344+ }
1345+
1346+ Ok ( ( ) )
1347+ }
1348+
13031349 /// Serialize the PSBT to bytes, using network-specific logic
13041350 pub fn serialize ( & self ) -> Result < Vec < u8 > , SerializeError > {
13051351 match self {
0 commit comments