33// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44
55#include < blind.h>
6+ #include < chainparams.h>
67
78#include < hash.h>
89#include < primitives/transaction.h>
@@ -157,11 +158,6 @@ bool UnblindConfidentialPair(const CKey& blinding_key, const CConfidentialValue&
157158 return false ;
158159 }
159160
160- // Value sidechannel must be a transaction-valid amount (should be belt-and-suspenders check)
161- if (amount > (uint64_t )MAX_MONEY || !MoneyRange ((CAmount)amount)) {
162- return false ;
163- }
164-
165161 // Convenience pointers to starting point of each recovered 32 byte message
166162 unsigned char *asset_type = msg;
167163 unsigned char *asset_blinder = msg+32 ;
@@ -172,6 +168,13 @@ bool UnblindConfidentialPair(const CKey& blinding_key, const CConfidentialValue&
172168 return false ;
173169 }
174170
171+ CAsset asset{std::vector<unsigned char >{asset_type, asset_type + 32 }};
172+
173+ // Value sidechannel must be a transaction-valid amount (should be belt-and-suspenders check)
174+ if ((!committedScript.IsUnspendable () && amount == 0 ) || (asset == Params ().GetConsensus ().pegged_asset && (amount > (uint64_t )MAX_MONEY || !MoneyRange ((CAmount)amount)))) {
175+ return false ;
176+ }
177+
175178 // Serialize both generators then compare
176179 unsigned char observed_generator[33 ];
177180 unsigned char derived_generator[33 ];
@@ -182,7 +185,7 @@ bool UnblindConfidentialPair(const CKey& blinding_key, const CConfidentialValue&
182185 }
183186
184187 amount_out = (CAmount)amount;
185- asset_out = CAsset (std::vector< unsigned char >(asset_type, asset_type+ 32 )) ;
188+ asset_out = asset ;
186189 asset_blinding_factor_out = uint256 (std::vector<unsigned char >(asset_blinder, asset_blinder+32 ));
187190 return true ;
188191}
0 commit comments