diff --git a/src/script/sign.h b/src/script/sign.h --- a/src/script/sign.h +++ b/src/script/sign.h @@ -38,6 +38,17 @@ extern const SigningProvider &DUMMY_SIGNING_PROVIDER; +class PublicOnlySigningProvider : public SigningProvider { +private: + const SigningProvider *m_provider; + +public: + PublicOnlySigningProvider(const SigningProvider *provider) + : m_provider(provider) {} + bool GetCScript(const CScriptID &scriptid, CScript &script) const; + bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const; +}; + /** Interface for signature creators. */ class BaseSignatureCreator { public: @@ -210,8 +221,10 @@ template inline void Serialize(Stream &s) const { // Write the utxo - SerializeToVector(s, PSBT_IN_UTXO); - SerializeToVector(s, utxo); + if (!utxo.IsNull()) { + SerializeToVector(s, PSBT_IN_UTXO); + SerializeToVector(s, utxo); + } if (final_script_sig.empty()) { // Write any partial signatures @@ -493,6 +506,7 @@ for (const PSBTInput &input : inputs) { s << input; } + // Write outputs for (const PSBTOutput &output : outputs) { s << output; diff --git a/src/script/sign.cpp b/src/script/sign.cpp --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -220,7 +220,7 @@ bool SignPSBTInput(const SigningProvider &provider, const CMutableTransaction &tx, PSBTInput &input, SignatureData &sigdata, int index, SigHashType sighash) { - // if this input has a final scriptsig, don't do anything with it + // If this input has a final scriptsig, don't do anything with it. if (!input.final_script_sig.empty()) { return true; } @@ -544,3 +544,13 @@ redeem_script = output.redeem_script; } } + +bool PublicOnlySigningProvider::GetCScript(const CScriptID &scriptid, + CScript &script) const { + return m_provider->GetCScript(scriptid, script); +} + +bool PublicOnlySigningProvider::GetPubKey(const CKeyID &address, + CPubKey &pubkey) const { + return m_provider->GetPubKey(address, pubkey); +}