Merge pull request #1145 from allenpiscitello/pset-fixes

Fixing issuance cases and half blinded cases in PSET
This commit is contained in:
Pablo Greco 2022-08-18 13:40:04 -03:00 committed by GitHub
commit debf46b89e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 9 deletions

View file

@ -476,6 +476,9 @@ BlindingStatus BlindPSBT(PartiallySignedTransaction& psbt, std::map<uint32_t, st
} }
} }
} }
else {
input_asset_blinders.emplace_back();
}
} }
} }
} }

View file

@ -123,13 +123,26 @@ CMutableTransaction PartiallySignedTransaction::GetUnsignedTx(bool force_unblind
txin.nSequence = input.sequence.value_or(max_sequence); txin.nSequence = input.sequence.value_or(max_sequence);
txin.assetIssuance.assetBlindingNonce = input.m_issuance_blinding_nonce; txin.assetIssuance.assetBlindingNonce = input.m_issuance_blinding_nonce;
txin.assetIssuance.assetEntropy = input.m_issuance_asset_entropy; txin.assetIssuance.assetEntropy = input.m_issuance_asset_entropy;
if (input.m_issuance_value != std::nullopt && input.m_issuance_inflation_keys_amount != std::nullopt && force_unblinded) { // If there is a commitment we should set the value to the commitment unless we are forcing unblinded.
// If we are forcing unblinded but there is no value, we just use the commitment.
if (input.m_issuance_value != std::nullopt && (input.m_issuance_value_commitment.IsNull() || force_unblinded)) {
txin.assetIssuance.nAmount.SetToAmount(*input.m_issuance_value); txin.assetIssuance.nAmount.SetToAmount(*input.m_issuance_value);
txin.assetIssuance.nInflationKeys.SetToAmount(*input.m_issuance_inflation_keys_amount); }
} else { else if(!input.m_issuance_value_commitment.IsNull()) {
txin.assetIssuance.nAmount = input.m_issuance_value_commitment; txin.assetIssuance.nAmount = input.m_issuance_value_commitment;
}
else {
txin.assetIssuance.nAmount.SetNull();
}
if (input.m_issuance_inflation_keys_amount != std::nullopt && (input.m_issuance_inflation_keys_commitment.IsNull() || force_unblinded)) {
txin.assetIssuance.nInflationKeys.SetToAmount(*input.m_issuance_value);
}
else if(!input.m_issuance_inflation_keys_commitment.IsNull()) {
txin.assetIssuance.nInflationKeys = input.m_issuance_inflation_keys_commitment; txin.assetIssuance.nInflationKeys = input.m_issuance_inflation_keys_commitment;
} }
else {
txin.assetIssuance.nInflationKeys.SetNull();
}
mtx.vin.push_back(txin); mtx.vin.push_back(txin);
} }
for (const PSBTOutput& output : outputs) { for (const PSBTOutput& output : outputs) {
@ -531,12 +544,9 @@ bool PSBTOutput::Merge(const PSBTOutput& output)
CTxOut PSBTOutput::GetTxOut() const CTxOut PSBTOutput::GetTxOut() const
{ {
assert(script != std::nullopt); assert(script != std::nullopt);
if (!m_value_commitment.IsNull() && !m_asset_commitment.IsNull()) { assert(amount != std::nullopt || !m_value_commitment.IsNull());
return CTxOut(m_asset_commitment, m_value_commitment, *script); assert(!m_asset.IsNull() || !m_asset_commitment.IsNull());
} return CTxOut(!m_asset_commitment.IsNull() ? m_asset_commitment : CAsset(m_asset), !m_value_commitment.IsNull() ? m_value_commitment : CConfidentialValue(*amount), *script);
assert(amount != std::nullopt);
assert(!m_asset.IsNull());
return CTxOut(CConfidentialAsset(CAsset(m_asset)), CConfidentialValue(*amount), *script);
} }
bool PSBTOutput::IsBlinded() const bool PSBTOutput::IsBlinded() const

View file

@ -2048,11 +2048,15 @@ TransactionError CWallet::SignPSBT(PartiallySignedTransaction& psbtx, bool& comp
txin.assetIssuance.nAmount = input.m_issuance_value_commitment; txin.assetIssuance.nAmount = input.m_issuance_value_commitment;
} else if (input.m_issuance_value) { } else if (input.m_issuance_value) {
txin.assetIssuance.nAmount.SetToAmount(*input.m_issuance_value); txin.assetIssuance.nAmount.SetToAmount(*input.m_issuance_value);
} else {
txin.assetIssuance.nAmount.SetNull();
} }
if (!input.m_issuance_inflation_keys_commitment.IsNull()) { if (!input.m_issuance_inflation_keys_commitment.IsNull()) {
txin.assetIssuance.nInflationKeys = input.m_issuance_inflation_keys_commitment; txin.assetIssuance.nInflationKeys = input.m_issuance_inflation_keys_commitment;
} else if (input.m_issuance_inflation_keys_amount) { } else if (input.m_issuance_inflation_keys_amount) {
txin.assetIssuance.nInflationKeys.SetToAmount(*input.m_issuance_inflation_keys_amount); txin.assetIssuance.nInflationKeys.SetToAmount(*input.m_issuance_inflation_keys_amount);
} else {
txin.assetIssuance.nInflationKeys.SetNull();
} }
if (!input.m_issuance_rangeproof.empty()) { if (!input.m_issuance_rangeproof.empty()) {
txinwit.vchIssuanceAmountRangeproof = input.m_issuance_rangeproof; txinwit.vchIssuanceAmountRangeproof = input.m_issuance_rangeproof;