@@ -137,6 +137,9 @@ template<typename Stream, typename... X>
137137void UnserializeFromVector (Stream& s, X&... args)
138138{
139139 size_t expected_size = ReadCompactSize (s);
140+ if (!expected_size) {
141+ return ; /* Zero size = no data to read */
142+ }
140143 size_t remaining_before = s.size ();
141144 UnserializeMany (s, args...);
142145 size_t remaining_after = s.size ();
@@ -343,15 +346,15 @@ struct PSBTInput
343346 }
344347
345348 // Elements proprietary fields are only allowed with v2
346- // Issuance value
347- if (!m_issuance_value_commitment.IsNull ()) {
348- SerializeToVector (s, CompactSizeWriter (PSBT_IN_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_IN_ISSUANCE_VALUE_COMMITMENT));
349- SerializeToVector (s, m_issuance_value_commitment);
350- }
349+ // Issuance value + commitment
351350 if (m_issuance_value != std::nullopt ) {
352351 SerializeToVector (s, CompactSizeWriter (PSBT_IN_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_IN_ISSUANCE_VALUE));
353352 SerializeToVector (s, *m_issuance_value);
354353 }
354+ if (!m_issuance_value_commitment.IsNull ()) {
355+ SerializeToVector (s, CompactSizeWriter (PSBT_IN_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_IN_ISSUANCE_VALUE_COMMITMENT));
356+ SerializeToVector (s, m_issuance_value_commitment);
357+ }
355358
356359 // Issuance rangeproof
357360 if (!m_issuance_rangeproof.empty ()) {
@@ -995,8 +998,12 @@ struct PSBTOutput
995998 SerializeHDKeypaths (s, hd_keypaths, CompactSizeWriter (PSBT_OUT_BIP32_DERIVATION));
996999
9971000 if (m_psbt_version >= 2 ) {
998- // Write spk
999- if (script != std::nullopt ) {
1001+ // Write amount and spk
1002+ if (amount != std::nullopt ) {
1003+ SerializeToVector (s, CompactSizeWriter (PSBT_OUT_AMOUNT));
1004+ SerializeToVector (s, *amount);
1005+ }
1006+ if (script.has_value ()) {
10001007 SerializeToVector (s, CompactSizeWriter (PSBT_OUT_SCRIPT));
10011008 s << *script;
10021009 }
@@ -1007,20 +1014,16 @@ struct PSBTOutput
10071014 SerializeToVector (s, CompactSizeWriter (PSBT_OUT_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_OUT_VALUE_COMMITMENT));
10081015 SerializeToVector (s, m_value_commitment);
10091016 }
1010- if (amount != std::nullopt ) {
1011- SerializeToVector (s, CompactSizeWriter (PSBT_OUT_AMOUNT));
1012- SerializeToVector (s, *amount);
1013- }
10141017
1015- // Asset
1016- if (!m_asset_commitment.IsNull ()) {
1017- SerializeToVector (s, CompactSizeWriter (PSBT_OUT_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_OUT_ASSET_COMMITMENT));
1018- SerializeToVector (s, m_asset_commitment);
1019- }
1018+ // Asset + commitment
10201019 if (!m_asset.IsNull ()) {
10211020 SerializeToVector (s, CompactSizeWriter (PSBT_OUT_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_OUT_ASSET));
10221021 SerializeToVector (s, m_asset);
10231022 }
1023+ if (!m_asset_commitment.IsNull ()) {
1024+ SerializeToVector (s, CompactSizeWriter (PSBT_OUT_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_OUT_ASSET_COMMITMENT));
1025+ SerializeToVector (s, m_asset_commitment);
1026+ }
10241027
10251028 // Value rangeproof
10261029 if (!m_value_rangeproof.empty ()) {
@@ -1052,13 +1055,13 @@ struct PSBTOutput
10521055 SerializeToVector (s, *m_blinder_index);
10531056 }
10541057
1055- // BLind value proof
1058+ // Blind value proof
10561059 if (!m_blind_value_proof.empty ()) {
10571060 SerializeToVector (s, CompactSizeWriter (PSBT_OUT_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_OUT_BLIND_VALUE_PROOF));
10581061 s << m_blind_value_proof;
10591062 }
10601063
1061- // BLind asset proof
1064+ // Blind asset proof
10621065 if (!m_blind_asset_proof.empty ()) {
10631066 SerializeToVector (s, CompactSizeWriter (PSBT_OUT_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_OUT_BLIND_ASSET_PROOF));
10641067 s << m_blind_asset_proof;
@@ -1423,7 +1426,7 @@ struct PartiallySignedTransaction
14231426 // Scalar offsets
14241427 for (const uint256& scalar : m_scalar_offsets) {
14251428 SerializeToVector (s, CompactSizeWriter (PSBT_GLOBAL_PROPRIETARY), PSBT_ELEMENTS_ID, CompactSizeWriter (PSBT_ELEMENTS_GLOBAL_SCALAR), scalar);
1426- SerializeToVector (s, std::vector< unsigned char >());
1429+ s << PSBT_SEPARATOR; /* Zero length data value */
14271430 }
14281431 }
14291432
@@ -1659,6 +1662,9 @@ struct PartiallySignedTransaction
16591662 m_scalar_offsets.insert (scalar);
16601663 break ;
16611664 }
1665+ default :
1666+ known = false ;
1667+ break ;
16621668 }
16631669 }
16641670
0 commit comments