From 1441abcf015c4ccad682cd19ccf45a8de5b864b5 Mon Sep 17 00:00:00 2001 From: tequ Date: Fri, 3 Oct 2025 22:09:46 +0900 Subject: [PATCH] use `sfSponsorSignature` --- include/xrpl/protocol/STObject.h | 2 - include/xrpl/protocol/STTx.h | 62 ----- include/xrpl/protocol/Sign.h | 25 ++ include/xrpl/protocol/detail/sfields.macro | 3 +- src/libxrpl/protocol/InnerObjectFormats.cpp | 5 + src/libxrpl/protocol/STObject.cpp | 7 - src/libxrpl/protocol/STTx.cpp | 186 +------------ src/libxrpl/protocol/Sign.cpp | 48 ++++ src/libxrpl/protocol/TxFormats.cpp | 1 + src/test/app/Sponsor_test.cpp | 290 ++++++++++---------- src/test/jtx/JTx.h | 3 +- src/test/jtx/impl/Env.cpp | 3 - src/test/jtx/impl/multisign.cpp | 3 +- src/test/jtx/impl/sponsor.cpp | 70 ----- src/test/jtx/sponsor.h | 29 -- src/test/rpc/AccountTx_test.cpp | 8 +- src/xrpld/app/tx/detail/Transactor.cpp | 21 +- src/xrpld/app/tx/detail/apply.cpp | 10 +- 18 files changed, 255 insertions(+), 521 deletions(-) diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index 7d316ddd78..84706c5833 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -249,8 +249,6 @@ public: getFieldObject(SField const& field) const; STArray const& getFieldArray(SField const& field) const; - STObject const& - getFieldObject(SField const& field) const; STCurrency const& getFieldCurrency(SField const& field) const; STNumber const& diff --git a/include/xrpl/protocol/STTx.h b/include/xrpl/protocol/STTx.h index f1fb8068e1..1e3695050d 100644 --- a/include/xrpl/protocol/STTx.h +++ b/include/xrpl/protocol/STTx.h @@ -115,12 +115,6 @@ public: boost::container::flat_set getMentionedAccounts() const; - static Blob - getSigningData(STObject const& that); - - static Blob - getSponsorSigningData(STTx const& that); - uint256 getTransactionID() const; @@ -168,11 +162,6 @@ public: RequireFullyCanonicalSig requireCanonicalSig, Rules const& rules) const; - Expected - checkSponsorSign( - RequireFullyCanonicalSig requireCanonicalSig, - Rules const& rules) const; - // SQL Functions with metadata. static std::string const& getMetaSQLInsertReplaceHeader(); @@ -208,23 +197,12 @@ private: STObject const& batchSigner, RequireFullyCanonicalSig requireCanonicalSig) const; - Expected - checkSponsorSingleSign( - STObject const& signer, - RequireFullyCanonicalSig requireCanonicalSig) const; - Expected checkBatchMultiSign( STObject const& batchSigner, RequireFullyCanonicalSig requireCanonicalSig, Rules const& rules) const; - Expected - checkSponsorMultiSign( - STObject const& signer, - RequireFullyCanonicalSig requireCanonicalSig, - Rules const& rules) const; - STBase* copy(std::size_t n, void* buf) const override; STBase* @@ -273,46 +251,6 @@ STTx::getTransactionID() const return tid_; } -/** Return a Serializer suitable for computing a multisigning TxnSignature. */ -Serializer -buildMultiSigningData(STObject const& obj, AccountID const& signingID); - -/** Break the multi-signing hash computation into 2 parts for optimization. - - We can optimize verifying multiple multisignatures by splitting the - data building into two parts; - o A large part that is shared by all of the computations. - o A small part that is unique to each signer in the multisignature. - - The following methods support that optimization: - 1. startMultiSigningData provides the large part which can be shared. - 2. finishMultiSigningData caps the passed in serializer with each - signer's unique data. -*/ -Serializer -startMultiSigningData(STObject const& obj); - -inline void -finishMultiSigningData(AccountID const& signingID, Serializer& s) -{ - s.addBitString(signingID); -} - -Serializer -buildSponsorMultiSigningData( - STObject const& obj, - AccountID const& signingID, - uint32_t flags); - -Serializer -startSponsorSigningData(STObject const& obj); - -inline void -finishSponsorSigningData(AccountID const& signerID, Serializer& s) -{ - s.addBitString(signerID); -} - } // namespace ripple #endif diff --git a/include/xrpl/protocol/Sign.h b/include/xrpl/protocol/Sign.h index 512d82cb43..5aa9fabddc 100644 --- a/include/xrpl/protocol/Sign.h +++ b/include/xrpl/protocol/Sign.h @@ -61,6 +61,31 @@ verify( PublicKey const& pk, SF_VL const& sigField = sfSignature); +/** Return a Serializer suitable for computing a multisigning TxnSignature. */ +Serializer +buildMultiSigningData(STObject const& obj, AccountID const& signingID); + +/** Break the multi-signing hash computation into 2 parts for optimization. + + We can optimize verifying multiple multisignatures by splitting the + data building into two parts; + o A large part that is shared by all of the computations. + o A small part that is unique to each signer in the multisignature. + + The following methods support that optimization: + 1. startMultiSigningData provides the large part which can be shared. + 2. finishMultiSigningData caps the passed in serializer with each + signer's unique data. +*/ +Serializer +startMultiSigningData(STObject const& obj); + +inline void +finishMultiSigningData(AccountID const& signingID, Serializer& s) +{ + s.addBitString(signingID); +} + } // namespace ripple #endif diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index 3f800a4a64..624f430cca 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -383,7 +383,8 @@ UNTYPED_SFIELD(sfCredential, OBJECT, 33) UNTYPED_SFIELD(sfRawTransaction, OBJECT, 34) UNTYPED_SFIELD(sfBatchSigner, OBJECT, 35) UNTYPED_SFIELD(sfBook, OBJECT, 36) -UNTYPED_SFIELD(sfSponsor, OBJECT, 37, SField::sMD_Default, SField::notSigning) +UNTYPED_SFIELD(sfSponsor, OBJECT, 37) +UNTYPED_SFIELD(sfSponsorSignature, OBJECT, 38, SField::sMD_Default, SField::notSigning) // array of objects (common) // ARRAY/1 is reserved for end of array diff --git a/src/libxrpl/protocol/InnerObjectFormats.cpp b/src/libxrpl/protocol/InnerObjectFormats.cpp index 4b82b1acfd..962d2f3d8d 100644 --- a/src/libxrpl/protocol/InnerObjectFormats.cpp +++ b/src/libxrpl/protocol/InnerObjectFormats.cpp @@ -178,6 +178,11 @@ InnerObjectFormats::InnerObjectFormats() { {sfAccount, soeREQUIRED}, {sfFlags, soeREQUIRED}, + }); + + add(sfSponsorSignature.jsonName.c_str(), + sfSponsorSignature.getCode(), + { {sfSigningPubKey, soeOPTIONAL}, {sfTxnSignature, soeOPTIONAL}, {sfSigners, soeOPTIONAL}, diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 3c8b76f3d7..8fb21a638d 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -705,13 +705,6 @@ STObject::getFieldArray(SField const& field) const return getFieldByConstRef(field, empty); } -STObject const& -STObject::getFieldObject(SField const& field) const -{ - static STObject const empty(field); - return getFieldByConstRef(field, empty); -} - STCurrency const& STObject::getFieldCurrency(SField const& field) const { diff --git a/src/libxrpl/protocol/STTx.cpp b/src/libxrpl/protocol/STTx.cpp index 87e01190fb..64c1041984 100644 --- a/src/libxrpl/protocol/STTx.cpp +++ b/src/libxrpl/protocol/STTx.cpp @@ -49,7 +49,6 @@ #include #include #include -#include #include #include #include @@ -185,26 +184,15 @@ STTx::getMentionedAccounts() const return list; } -Blob -STTx::getSigningData(STObject const& that) +static Blob +getSigningData(STTx const& that) { Serializer s; s.add32(HashPrefix::txSign); that.addWithoutSigningFields(s); - if (that.isFieldPresent(sfSponsor)) - { - auto const sst = that.getFieldObject(sfSponsor); - addSerializeSponsorData(s, sst.getAccountID(sfAccount), sst.getFlags()); - } return s.getData(); } -Blob -STTx::getSponsorSigningData(STTx const& that) -{ - return startSponsorSigningData(that).getData(); -} - uint256 STTx::getSigningHash() const { @@ -299,15 +287,14 @@ STTx::checkSign( if (auto const ret = checkSign(requireCanonicalSig, rules, nullptr); !ret) return ret; - /* Placeholder for field that will be added by Lending Protocol - if (isFieldPresent(sfCounterpartySignature)) + if (isFieldPresent(sfSponsorSignature)) { - auto const counterSig = getFieldObject(sfCounterpartySignature); - if (auto const ret = checkSign(requireCanonicalSig, rules, &counterSig); + auto const sponsorSignatureObj = getFieldObject(sfSponsorSignature); + if (auto const ret = + checkSign(requireCanonicalSig, rules, &sponsorSignatureObj); !ret) - return Unexpected("Counterparty: " + ret.error()); + return Unexpected("Sponsor: " + ret.error()); } - */ return {}; } @@ -347,42 +334,6 @@ STTx::checkBatchSign( return Unexpected("Internal batch signature check failure."); } -Expected -STTx::checkSponsorSign( - RequireFullyCanonicalSig requireCanonicalSig, - Rules const& rules) const -{ - try - { - XRPL_ASSERT( - isFieldPresent(sfSponsor), - "STTx::checkSponsorSign: not a sponsored transaction"); - if (!isFieldPresent(sfSponsor)) - { - JLOG(debugLog().fatal()) << "not a sponsored transaction"; - return Unexpected("Not a sponsored transaction."); - } - STObject const& sponsorObj{getFieldObject(sfSponsor)}; - - Blob const& signingPubKey = sponsorObj.getFieldVL(sfSigningPubKey); - - auto const result = signingPubKey.empty() - ? checkSponsorMultiSign(sponsorObj, requireCanonicalSig, rules) - : checkSponsorSingleSign(sponsorObj, requireCanonicalSig); - - if (!result) - return result; - - return {}; - } - catch (std::exception const& e) - { - JLOG(debugLog().error()) - << "Sponsor signature check failed: " << e.what(); - } - return Unexpected("Sponsor signature check failure."); -} - Json::Value STTx::getJson(JsonOptions options) const { @@ -523,17 +474,6 @@ STTx::checkBatchSingleSign( return singleSignHelper(batchSigner, msg.slice(), fullyCanonical); } -Expected -STTx::checkSponsorSingleSign( - STObject const& signer, - RequireFullyCanonicalSig requireCanonicalSig) const -{ - auto const data = getSponsorSigningData(*this); - bool const fullyCanonical = (getFlags() & tfFullyCanonicalSig) || - (requireCanonicalSig == STTx::RequireFullyCanonicalSig::yes); - return singleSignHelper(signer, makeSlice(data), fullyCanonical); -} - Expected multiSignHelper( STObject const& sigObject, @@ -640,32 +580,6 @@ STTx::checkBatchMultiSign( rules); } -Expected -STTx::checkSponsorMultiSign( - STObject const& sponsorObj, - RequireFullyCanonicalSig requireCanonicalSig, - Rules const& rules) const -{ - bool const fullyCanonical = (getFlags() & tfFullyCanonicalSig) || - (requireCanonicalSig == RequireFullyCanonicalSig::yes); - - // We can ease the computational load inside the loop a bit by - // pre-constructing part of the data that we hash. Fill a Serializer - // with the stuff that stays constant from signature to signature. - auto const data = startSponsorSigningData(*this); - Serializer dataStart = Serializer(data.data(), data.size()); - - return multiSignHelper( - sponsorObj, - fullyCanonical, - [&dataStart](AccountID const& accountID) mutable -> Serializer { - Serializer s = dataStart; - finishSponsorSigningData(accountID, s); - return s; - }, - rules); -} - Expected STTx::checkMultiSign( RequireFullyCanonicalSig requireCanonicalSig, @@ -964,90 +878,4 @@ isPseudoTx(STObject const& tx) return tt == ttAMENDMENT || tt == ttFEE || tt == ttUNL_MODIFY; } -// Questions regarding buildMultiSigningData: -// -// Why do we include the Signer.Account in the blob to be signed? -// -// Unless you include the Account which is signing in the signing blob, -// you could swap out any Signer.Account for any other, which may also -// be on the SignerList and have a RegularKey matching the -// Signer.SigningPubKey. -// -// That RegularKey may be set to allow some 3rd party to sign transactions -// on the account's behalf, and that RegularKey could be common amongst all -// users of the 3rd party. That's just one example of sharing the same -// RegularKey amongst various accounts and just one vulnerability. -// -// "When you have something that's easy to do that makes entire classes of -// attacks clearly and obviously impossible, you need a damn good reason -// not to do it." -- David Schwartz -// -// Why would we include the signingFor account in the blob to be signed? -// -// In the current signing scheme, the account that a signer is `signing -// for/on behalf of` is the tx_json.Account. -// -// Later we might support more levels of signing. Suppose Bob is a signer -// for Alice, and Carol is a signer for Bob, so Carol can sign for Bob who -// signs for Alice. But suppose Alice has two signers: Bob and Dave. If -// Carol is a signer for both Bob and Dave, then the signature needs to -// distinguish between Carol signing for Bob and Carol signing for Dave. -// -// So, if we support multiple levels of signing, then we'll need to -// incorporate the "signing for" accounts into the signing data as well. -Serializer -buildMultiSigningData(STObject const& obj, AccountID const& signingID) -{ - Serializer s{startMultiSigningData(obj)}; - finishMultiSigningData(signingID, s); - return s; -} - -Serializer -startMultiSigningData(STObject const& obj) -{ - Serializer s; - s.add32(HashPrefix::txMultiSign); - obj.addWithoutSigningFields(s); - // if (obj.isFieldPresent(sfSponsor)) - // { - // auto const sst = obj.getFieldObject(sfSponsor); - // addSerializeSponsorData(s, sst.getAccountID(sfAccount), - // sst.getFlags()); - // } - return s; -} - -Serializer -buildSponsorMultiSigningData( - STObject const& obj, - AccountID const& signingID, - uint32_t flags) -{ - Serializer s{startSponsorSigningData(obj)}; - finishSponsorSigningData(signingID, s); - return s; -} - -Serializer -startSponsorSigningData(STObject const& obj) -{ - Serializer s; - s.add32(HashPrefix::sponsor); - STObject tmp = obj; - tmp.setFieldVL(sfSigningPubKey, Blob{}); - tmp.addWithoutSigningFields(s); - - XRPL_ASSERT( - tmp.isFieldPresent(sfSponsor), - "STTx::getSponsorSigningData : sponsor is not set"); - - if (tmp.isFieldPresent(sfSponsor)) - { - auto const sst = tmp.getFieldObject(sfSponsor); - addSerializeSponsorData(s, sst.getAccountID(sfAccount), sst.getFlags()); - } - return s; -} - } // namespace ripple diff --git a/src/libxrpl/protocol/Sign.cpp b/src/libxrpl/protocol/Sign.cpp index b72742336d..27c2b0435c 100644 --- a/src/libxrpl/protocol/Sign.cpp +++ b/src/libxrpl/protocol/Sign.cpp @@ -61,4 +61,52 @@ verify( pk, Slice(ss.data(), ss.size()), Slice(sig->data(), sig->size())); } +// Questions regarding buildMultiSigningData: +// +// Why do we include the Signer.Account in the blob to be signed? +// +// Unless you include the Account which is signing in the signing blob, +// you could swap out any Signer.Account for any other, which may also +// be on the SignerList and have a RegularKey matching the +// Signer.SigningPubKey. +// +// That RegularKey may be set to allow some 3rd party to sign transactions +// on the account's behalf, and that RegularKey could be common amongst all +// users of the 3rd party. That's just one example of sharing the same +// RegularKey amongst various accounts and just one vulnerability. +// +// "When you have something that's easy to do that makes entire classes of +// attacks clearly and obviously impossible, you need a damn good reason +// not to do it." -- David Schwartz +// +// Why would we include the signingFor account in the blob to be signed? +// +// In the current signing scheme, the account that a signer is `signing +// for/on behalf of` is the tx_json.Account. +// +// Later we might support more levels of signing. Suppose Bob is a signer +// for Alice, and Carol is a signer for Bob, so Carol can sign for Bob who +// signs for Alice. But suppose Alice has two signers: Bob and Dave. If +// Carol is a signer for both Bob and Dave, then the signature needs to +// distinguish between Carol signing for Bob and Carol signing for Dave. +// +// So, if we support multiple levels of signing, then we'll need to +// incorporate the "signing for" accounts into the signing data as well. +Serializer +buildMultiSigningData(STObject const& obj, AccountID const& signingID) +{ + Serializer s{startMultiSigningData(obj)}; + finishMultiSigningData(signingID, s); + return s; +} + +Serializer +startMultiSigningData(STObject const& obj) +{ + Serializer s; + s.add32(HashPrefix::txMultiSign); + obj.addWithoutSigningFields(s); + return s; +} + } // namespace ripple diff --git a/src/libxrpl/protocol/TxFormats.cpp b/src/libxrpl/protocol/TxFormats.cpp index 9cc1b2ea07..caa3533687 100644 --- a/src/libxrpl/protocol/TxFormats.cpp +++ b/src/libxrpl/protocol/TxFormats.cpp @@ -48,6 +48,7 @@ TxFormats::TxFormats() {sfNetworkID, soeOPTIONAL}, {sfDelegate, soeOPTIONAL}, {sfSponsor, soeOPTIONAL}, + {sfSponsorSignature, soeOPTIONAL}, }; #pragma push_macro("UNWRAP") diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index f2b17891c2..28906f195a 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -73,7 +73,7 @@ public: env(noop(alice), fee(XRP(1)), sponsor::as(sponsor), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(temDISABLED)); env(sponsor::transfer(alice), ter(temDISABLED)); @@ -208,7 +208,7 @@ public: // Signature doesn't exist auto tx = noop(alice); tx[sfSponsor.jsonName][sfAccount.jsonName] = sponsor.human(); - tx[sfSponsor.jsonName][sfSigningPubKey.jsonName] = + tx[sfSponsorSignature.jsonName][sfSigningPubKey.jsonName] = strHex(sponsor.pk().slice()); env(tx, @@ -217,7 +217,7 @@ public: ter(telENV_RPC_FAILED)); // Invalid signature - tx[sfSponsor.jsonName][sfTxnSignature.jsonName] = "DEADBEEF"; + tx[sfSponsorSignature.jsonName][sfTxnSignature.jsonName] = "DEADBEEF"; env(tx, fee(XRP(1)), sponsor::as(sponsor, tfSponsorReserve), @@ -227,14 +227,14 @@ public: env(noop(alice), fee(XRP(1)), sponsor::as(invalid, tfSponsorReserve), - sponsor::sig(invalid), + sig(sfSponsorSignature, invalid), ter(terNO_ACCOUNT)); // Success env(noop(alice), fee(XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tesSUCCESS)); } @@ -259,8 +259,8 @@ public: // Invalid signature auto tx = noop(alice); - auto& signers1 = - tx[sfSponsor.jsonName][sfSigners.jsonName][0U][sfSigner.jsonName]; + auto& signers1 = tx[sfSponsorSignature.jsonName][sfSigners.jsonName][0U] + [sfSigner.jsonName]; signers1[sfAccount.jsonName] = signer1.human(); signers1[sfSigningPubKey.jsonName] = strHex(signer1.pk().slice()); signers1[sfTxnSignature.jsonName] = "DEADBEEF"; @@ -273,13 +273,13 @@ public: env(noop(alice), fee(XRP(1)), sponsor::as(invalid, tfSponsorReserve), - sponsor::msig({signer1}), + msig(sfSponsorSignature, {signer1}), ter(tefNOT_MULTI_SIGNING)); env(noop(alice), fee(XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::msig({signer1}), + msig(sfSponsorSignature, {signer1}), ter(tesSUCCESS)); env(signers(sponsor, 2, {{signer1, 1}, {signer2, 1}})); @@ -288,7 +288,7 @@ public: env(noop(alice), fee(XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::msig({signer1, signer2}), + msig(sfSponsorSignature, {signer1, signer2}), ter(tesSUCCESS)); } @@ -353,7 +353,7 @@ public: env(sponsor::transfer(alice), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1), + sig(sfSponsorSignature, sponsor1), ter(tecINSUFFICIENT_RESERVE)); env(pay(alice, sponsor1, drops(1))); @@ -361,7 +361,7 @@ public: env(sponsor::transfer(alice), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1)); + sig(sfSponsorSignature, sponsor1)); env.close(); BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 0); @@ -377,7 +377,7 @@ public: // transfer sponsor env(sponsor::transfer(alice), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2), + sig(sfSponsorSignature, sponsor2), ter(tecINSUFFICIENT_RESERVE)); env(pay(alice, sponsor2, drops(1))); @@ -385,7 +385,7 @@ public: env(sponsor::transfer(alice), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 0); @@ -456,7 +456,7 @@ public: env(sponsor::transfer(alice, checkId), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1), + sig(sfSponsorSignature, sponsor1), ter(tecINSUFFICIENT_RESERVE)); env.close(); @@ -466,14 +466,14 @@ public: // Invalid Owner env(sponsor::transfer(bob, checkId), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1), + sig(sfSponsorSignature, sponsor1), ter(tecNO_PERMISSION)); env.close(); // Valid Owner env(sponsor::transfer(alice, checkId), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1)); + sig(sfSponsorSignature, sponsor1)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -490,7 +490,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, checkId), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2), + sig(sfSponsorSignature, sponsor2), ter(tecINSUFFICIENT_RESERVE)); env(pay(alice, sponsor2, drops(1))); @@ -498,7 +498,7 @@ public: env(sponsor::transfer(alice, checkId), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 1); @@ -575,7 +575,7 @@ public: env(pay(alice, bob, XRP(100)), fee(XRP(2000)), sponsor::as(sponsor, tfSponsorFee), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(terNO_ACCOUNT)); env.close(); BEAST_EXPECT(env.balance(alice) == aliceBalance); @@ -597,7 +597,7 @@ public: env(pay(alice, bob, sendAmt), fee(feeAmt), sponsor::as(sponsor, tfSponsorFee), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(env.balance(alice) == aliceBalance - sendAmt); BEAST_EXPECT(env.balance(bob) == bobBalance + sendAmt); @@ -613,7 +613,7 @@ public: env(pay(alice, bob, XRP(100)), fee(XRP(2000)), sponsor::as(sponsor, tfSponsorFee), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(terINSUF_FEE_B)); env.close(); BEAST_EXPECT(env.balance(alice) == aliceBalance); @@ -632,7 +632,7 @@ public: env(pay(alice, bob, XRP(20000)), fee(feeAmt), sponsor::as(sponsor, tfSponsorFee), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecUNFUNDED_PAYMENT)); env.close(); @@ -829,7 +829,7 @@ public: bob, STAmount(env.current()->fees().accountReserve(0))), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); auto const bobSle = env.le(keylet::account(bob)); @@ -971,7 +971,7 @@ public: env(ammCreate(env, alice, USD(100), EUR(100)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUF_RESERVE_LINE)); env.close(); adjustAccountXRPBalance(env, sponsor, reserve(env, 2)); @@ -979,7 +979,7 @@ public: env(ammCreate(env, alice, USD(100), EUR(100)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); auto const amm = @@ -1027,7 +1027,7 @@ public: env(ammDeposit(env, bob, USD(100), EUR(100)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUF_RESERVE_LINE)); env.close(); adjustAccountXRPBalance(env, sponsor, reserve(env, 2)); @@ -1035,7 +1035,7 @@ public: env(ammDeposit(env, bob, USD(100), EUR(100)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT( @@ -1062,7 +1062,7 @@ public: env(ammCreate(env, alice, USD(1000), EUR(1000)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); env(trust(alice, USD(0))); @@ -1095,7 +1095,7 @@ public: env, sponsor, reserve(env, 2) - drops(1)); env(jv, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); adjustAccountXRPBalance(env, sponsor, reserve(env, 3)); @@ -1103,7 +1103,7 @@ public: env(jv, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); // USD, LPToken @@ -1128,7 +1128,7 @@ public: env(ammCreate(env, alice, USD(1000), EUR(1000)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); env(trust(alice, USD(0))); @@ -1159,7 +1159,7 @@ public: env, sponsor, reserve(env, 3) - drops(1)); env(jv, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); adjustAccountXRPBalance(env, sponsor, reserve(env, 4)); @@ -1167,7 +1167,7 @@ public: env(jv, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); // USD, EUR @@ -1199,7 +1199,7 @@ public: env(ammCreate(env, alice, USD(100), EUR2(100)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); env(trust(alice, USD(0))); @@ -1213,7 +1213,7 @@ public: // doesn't sponsor holder's new RippleState env(amm::ammClawback(gw, alice, USD, EUR2, USD(10)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); // LPToken, EUR2 @@ -1223,7 +1223,7 @@ public: { env(amm::ammClawback(gw, alice, USD, EUR2, std::nullopt), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); // EUR2 @@ -1255,7 +1255,7 @@ public: auto const seq = env.seq(alice); env(check::create(alice, bob, XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); // Check @@ -1270,7 +1270,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, keylet.key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); // Check @@ -1302,7 +1302,7 @@ public: auto const seq2 = env.seq(alice); env(check::create(alice, bob, XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); // Check @@ -1315,7 +1315,7 @@ public: auto const checkId2 = keylet::check(alice, seq2).key; env(check::cash(bob, checkId2, XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 0); @@ -1340,7 +1340,7 @@ public: auto const seq2 = env.seq(alice); env(check::create(alice, bob, USD(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); // RippleState + Check @@ -1356,7 +1356,7 @@ public: // CheckCash env(check::cash(bob, keylet.key, USD(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); // RippleState @@ -1380,7 +1380,7 @@ public: env(check::create(alice, bob, XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); @@ -1388,7 +1388,7 @@ public: env(check::create(alice, bob, XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tesSUCCESS)); env.close(); } @@ -1414,7 +1414,7 @@ public: auto const keylet = keylet::check(alice, seq); env(check::cash(bob, keylet.key, USD(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecNO_LINE_INSUF_RESERVE)); env.close(); } @@ -1445,7 +1445,7 @@ public: auto const seq = env.seq(alice); env(offer(alice, USD(1), XRP(1)), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1)); + sig(sfSponsorSignature, sponsor1)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1457,7 +1457,7 @@ public: auto const keylet = keylet::offer(alice, seq); env(sponsor::transfer(alice, keylet.key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1490,7 +1490,7 @@ public: auto const seq = env.seq(alice); env(offer(alice, USD(1), XRP(1)), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1)); + sig(sfSponsorSignature, sponsor1)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1503,7 +1503,7 @@ public: env(offer(alice, USD(1), XRP(1)), json(jss::OfferSequence, seq), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1543,7 +1543,7 @@ public: // OfferCreate env(offer(alice, EUR(1), USD(1)), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1)); + sig(sfSponsorSignature, sponsor1)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -1559,7 +1559,7 @@ public: // OfferCreate (cross offer) env(offer(bob, USD(1), EUR(1)), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -1590,7 +1590,7 @@ public: // fullly not crossed env(offer(alice, USD(1), XRP(1)), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1), + sig(sfSponsorSignature, sponsor1), ter(tecINSUF_RESERVE_OFFER)); // partially crossed @@ -1599,7 +1599,7 @@ public: env(offer(alice, USD(5), XRP(5)), sponsor::as(sponsor1, tfSponsorReserve), - sponsor::sig(sponsor1), + sig(sfSponsorSignature, sponsor1), ter(tecINSUF_RESERVE_OFFER)); } } @@ -1622,7 +1622,7 @@ public: std::uint32_t const ticketSeq{env.seq(alice) + 1}; env(ticket::create(alice, 250), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 250); @@ -1637,7 +1637,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, keylet.key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 250); @@ -1668,14 +1668,14 @@ public: adjustAccountXRPBalance(env, sponsor, reserve(env, 1) - drops(1)); env(ticket::create(alice, 1), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); adjustAccountXRPBalance(env, sponsor, reserve(env, 249)); env(ticket::create(alice, 250), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -1703,7 +1703,7 @@ public: env(credentials::create(subject, issuer, credType), credentials::uri("uri"), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, issuer) == 1); @@ -1717,7 +1717,7 @@ public: keylet::credential(subject, issuer, credTypeSlice); env(sponsor::transfer(issuer, keylet.key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, issuer) == 1); @@ -1730,7 +1730,7 @@ public: // CredentialsAccept env(credentials::accept(subject, issuer, credType), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, issuer) == 0); @@ -1760,7 +1760,7 @@ public: // Accept Sponsored Credentials without sponsoring env(credentials::create(subject, issuer, credType), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, issuer) == 1); @@ -1796,7 +1796,7 @@ public: env, sponsor, reserve(env, 1) - drops(1)); env(credentials::create(subject, issuer, credType), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -1809,7 +1809,7 @@ public: env, sponsor, reserve(env, 1) - drops(1)); env(credentials::accept(subject, issuer, credType), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -1834,7 +1834,7 @@ public: // DelegateSet env(delegate::set(alice, bob, {"Payment"}), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1845,7 +1845,7 @@ public: auto const keylet = keylet::delegate(alice, bob); env(sponsor::transfer(alice, keylet.key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1871,7 +1871,7 @@ public: adjustAccountXRPBalance(env, sponsor, reserve(env, 1) - drops(1)); env(delegate::set(alice, bob, {"Payment"}), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -1894,7 +1894,7 @@ public: // DepositPreauthSet env(deposit::auth(alice, sponsor), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1905,7 +1905,7 @@ public: auto const keylet = keylet::depositPreauth(alice, sponsor); env(sponsor::transfer(alice, keylet.key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1932,7 +1932,7 @@ public: adjustAccountXRPBalance(env, sponsor, reserve(env, 1) - drops(1)); env(deposit::auth(alice, sponsor), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -1956,7 +1956,7 @@ public: env(did::set(alice), did::uri("uri"), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1967,7 +1967,7 @@ public: auto const keylet = keylet::did(alice); env(sponsor::transfer(alice, keylet.key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -1995,7 +1995,7 @@ public: env(did::set(alice), did::uri("uri"), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -2028,7 +2028,7 @@ public: escrow::condition(escrow::cb1), escrow::cancel_time(env.now() + 100s), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2042,7 +2042,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, keylet::escrow(alice, seq).key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2091,7 +2091,7 @@ public: escrow::condition(escrow::cb1), escrow::cancel_time(env.now() + 10s), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -2107,7 +2107,7 @@ public: escrow::condition(escrow::cb1), escrow::fulfillment(escrow::fb1), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2), + sig(sfSponsorSignature, sponsor2), fee(baseFee * 150)); env.close(); @@ -2136,7 +2136,7 @@ public: escrow::condition(escrow::cb1), escrow::cancel_time(env.now() + 10s), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); @@ -2152,7 +2152,7 @@ public: escrow::condition(escrow::cb1), escrow::cancel_time(env.now() + 10s), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); auto const seq = env.seq(alice); @@ -2165,7 +2165,7 @@ public: escrow::condition(escrow::cb1), escrow::fulfillment(escrow::fb1), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), fee(baseFee * 150), ter(tecNO_LINE_INSUF_RESERVE)); env.close(); @@ -2194,7 +2194,7 @@ public: auto const mptid = makeMptID(env.seq(alice), alice.id()); env(jv, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2205,7 +2205,7 @@ public: auto const mptIssuanceKeylet = keylet::mptIssuance(mptid); env(sponsor::transfer(alice, mptIssuanceKeylet.key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2220,7 +2220,7 @@ public: jv[sfMPTokenIssuanceID] = to_string(mptid); env(jv, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2234,7 +2234,7 @@ public: auto const mptTokenKeylet = keylet::mptoken(mptid, bob); env(sponsor::transfer(bob, mptTokenKeylet.key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2287,7 +2287,7 @@ public: // auto const mptid = makeMptID(env.seq(alice), alice.id()); env(jv, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -2316,7 +2316,7 @@ public: // error (non-free mptoken) env(jv, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); @@ -2329,7 +2329,7 @@ public: // pass (free mptoken) env(jv, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tesSUCCESS)); env.close(); } @@ -2356,7 +2356,7 @@ public: uint256 const nftId{token::getNextID(env, alice, 0)}; env(token::mint(alice), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2375,7 +2375,7 @@ public: env(token::mint(alice), token::amount(XRP(10000)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -2397,7 +2397,7 @@ public: { env(token::mint(alice), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); } env.close(); @@ -2429,7 +2429,7 @@ public: adjustAccountXRPBalance(env, sponsor, reserve(env, 1) - drops(1)); env(token::mint(alice), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); @@ -2437,7 +2437,7 @@ public: env(token::mint(alice), token::amount(XRP(10000)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -2477,7 +2477,7 @@ public: token::destination(bob), txflags(tfSellNFToken), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -2490,7 +2490,7 @@ public: token::destination(bob), txflags(tfSellNFToken), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 3); @@ -2500,7 +2500,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, offerIndex1), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 3); @@ -2539,7 +2539,7 @@ public: token::destination(bob), txflags(tfSellNFToken), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -2577,7 +2577,7 @@ public: token::owner(alice), token::destination(alice), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, bob) == 1); @@ -2615,7 +2615,7 @@ public: token::owner(alice), token::destination(broker), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, bob) == 1); @@ -2629,7 +2629,7 @@ public: txflags(tfSellNFToken), token::destination(broker), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -2665,7 +2665,7 @@ public: env(token::createOffer(alice, nextNftId, XRP(1)), txflags(tfSellNFToken), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); @@ -2677,7 +2677,7 @@ public: // NFTokenOfferAccept (buyer) env(token::acceptSellOffer(bob, offerIndex), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -2705,7 +2705,7 @@ public: auto const chan = paychan::channel(alice, bob, env.seq(alice)); env(paychan::create(alice, bob, XRP(100), settleDelay, pk), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2715,7 +2715,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, chan), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2747,7 +2747,7 @@ public: auto const settleDelay = 10s; env(paychan::create(alice, bob, XRP(100), settleDelay, pk), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -2771,7 +2771,7 @@ public: pdomain::Credentials credentials{{alice, "first credential"}}; env(pdomain::setTx(alice, credentials), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2782,7 +2782,7 @@ public: env(sponsor::transfer( alice, keylet::permissionedDomain(alice, seq).key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2813,7 +2813,7 @@ public: pdomain::Credentials credentials{{alice, "first credential"}}; env(pdomain::setTx(alice, credentials), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -2898,7 +2898,7 @@ public: // OracleSet (reserve 1) env(oracleSet(env, alice, 5), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2908,7 +2908,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, keylet::oracle(alice, 1).key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2929,7 +2929,7 @@ public: // OracleSet (reserve 2) env(oracleSet(env, alice, 6), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -2939,7 +2939,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, keylet::oracle(alice, 1).key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -2960,7 +2960,7 @@ public: // OracleSet (reserve 1->2, sponsor1 -> no-sponsor) env(oracleSet(env, alice, 5), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2987,7 +2987,7 @@ public: // OracleSet (reserve 1->2, sponsor1 -> sponsor2) env(oracleSet(env, alice, 5), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -2997,7 +2997,7 @@ public: // reserve 1->2 env(oracleSet(env, alice, 6), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -3024,7 +3024,7 @@ public: // reserve 1->2 env(oracleSet(env, alice, 6), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); @@ -3046,7 +3046,7 @@ public: auto const ocount = isTwoOwnerCount ? 2 : 1; env(oracleSet(env, alice, dataSeriesSize), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == ocount); @@ -3056,7 +3056,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, keylet::oracle(alice, 1).key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == ocount); @@ -3083,14 +3083,14 @@ public: adjustAccountXRPBalance(env, sponsor, reserve(env, 1) - drops(1)); env(oracleSet(env, alice, 5), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); adjustAccountXRPBalance(env, sponsor, reserve(env, 2) - drops(1)); env(oracleSet(env, alice, 6), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -3114,7 +3114,7 @@ public: // SignerListSet env(signers(alice, 1, {{bob, 1}}), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -3124,7 +3124,7 @@ public: // transfer sponsor env(sponsor::transfer(alice, keylet::signers(alice).key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 1); @@ -3151,7 +3151,7 @@ public: adjustAccountXRPBalance(env, sponsor, reserve(env, 1) - drops(1)); env(signers(alice, 1, {{bob, 1}}), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); } @@ -3201,7 +3201,7 @@ public: // create TrustLine env(trust(user, USD(100)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, user) == 1); @@ -3215,7 +3215,7 @@ public: env(sponsor::transfer( user, keylet::line(user, issuer, currency).key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); BEAST_EXPECT(ownerCount(env, user) == 1); @@ -3255,7 +3255,7 @@ public: // update TrustLine from user to make reserve env(trust(user, USD(100)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, user) == 1); @@ -3307,7 +3307,7 @@ public: // create TrustLine env(trust(user, USD(100)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecNO_LINE_INSUF_RESERVE)); env.close(); @@ -3349,7 +3349,7 @@ public: // check with OwnerCount=3 because free MPToken condition exists env(tx, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); adjustAccountXRPBalance(env, sponsor, reserve(env, 3)); @@ -3363,7 +3363,7 @@ public: env(tx, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); // Vault, MPToken(share) @@ -3402,7 +3402,7 @@ public: // // check with OwnerCount=3 because free MPToken condition // exists env(depositTx, // sponsor::as(sponsor, tfSponsorReserve), - // sponsor::sig(sponsor), + // sig(sfSponsorSignature,sponsor), // ter(tecINSUFFICIENT_RESERVE)); // env.close(); // adjustAccountXRPBalance(env, sponsor, reserve(env, 3)); @@ -3412,7 +3412,7 @@ public: env(depositTx, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT( @@ -3454,7 +3454,7 @@ public: // // exists // env(depositTx, // sponsor::as(sponsor, tfSponsorReserve), - // sponsor::sig(sponsor), + // sig(sfSponsorSignature,sponsor), // ter(tecINSUFFICIENT_RESERVE)); // env.close(); // adjustAccountXRPBalance(env, sponsor, reserve(env, 3)); @@ -3464,7 +3464,7 @@ public: env(depositTx, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); env(trust(bob, asset(0))); // remove trustline @@ -3482,7 +3482,7 @@ public: .id = keylet.key, .amount = asset(50)}), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT( @@ -3500,7 +3500,7 @@ public: .id = keylet.key, .amount = asset(50)}), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, bob) == 1); // RippleState @@ -3548,7 +3548,7 @@ public: // // exists // env(depositTx, // sponsor::as(sponsor, tfSponsorReserve), - // sponsor::sig(sponsor), + // sig(sfSponsorSignature,sponsor), // ter(tecINSUFFICIENT_RESERVE)); // env.close(); // adjustAccountXRPBalance(env, sponsor, reserve(env, 3)); @@ -3558,7 +3558,7 @@ public: env(depositTx, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT( @@ -3573,7 +3573,7 @@ public: .holder = bob, .amount = asset(0)}), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, bob) == 1); // RippleState @@ -3593,7 +3593,7 @@ public: auto [tx, keylet] = vault.create({.owner = alice, .asset = asset}); env(tx, sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, alice) == 2); // Vault, MPToken(share) @@ -3638,14 +3638,14 @@ public: adjustAccountXRPBalance(env, sponsor, reserve(env, 1) - drops(1)); env(bridge_create(doorA, jvb, XRP(1), XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); adjustAccountXRPBalance(env, sponsor, reserve(env, 1)); env(bridge_create(doorA, jvb, XRP(1), XRP(1)), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); BEAST_EXPECT(ownerCount(env, doorA) == 2); // Bridge, SignerList @@ -3661,14 +3661,14 @@ public: adjustAccountXRPBalance(env, sponsor, reserve(env, 2) - drops(1)); env(xchain_create_claim_id(alice, jvb, XRP(1), bob), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor), + sig(sfSponsorSignature, sponsor), ter(tecINSUFFICIENT_RESERVE)); env.close(); adjustAccountXRPBalance(env, sponsor, reserve(env, 2)); env(xchain_create_claim_id(alice, jvb, XRP(1), bob), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); // XChainOwnedClaimID created @@ -3684,7 +3684,7 @@ public: env(xchain_commit(alice, jvb, 1, XRP(100), bob), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); // doesn't sponsor anything @@ -3701,7 +3701,7 @@ public: env(claim_attestation( alice, jvb, bob, XRP(1), bob, false, 1, bob, signer), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); // XChainOwnedClaimID deleted @@ -3715,7 +3715,7 @@ public: { env(xchain_create_claim_id(alice, jvb, XRP(1), bob), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env(xchain_commit( alice, jvb, 2, XRP(100))); // omit destination env(claim_attestation( diff --git a/src/test/jtx/JTx.h b/src/test/jtx/JTx.h index 59792c8788..1b6cab1af4 100644 --- a/src/test/jtx/JTx.h +++ b/src/test/jtx/JTx.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_TEST_JTX_JTX_H_INCLUDED #define RIPPLE_TEST_JTX_JTX_H_INCLUDED -#include #include #include @@ -58,7 +57,7 @@ struct JTx // Functions that sign the transaction from the Account std::vector> mainSigners; // Functions that sign something else after the mainSigners, such as - // sfCounterpartySignature + // sfCounterpartySignature and sfSponsorSignature std::vector> postSigners; JTx() = default; diff --git a/src/test/jtx/impl/Env.cpp b/src/test/jtx/impl/Env.cpp index 68e783e0e3..18b1520c47 100644 --- a/src/test/jtx/impl/Env.cpp +++ b/src/test/jtx/impl/Env.cpp @@ -592,9 +592,6 @@ Env::autofill_sig(JTx& jt) jtx::sign(jv, lookup(ar->getAccountID(sfRegularKey))); else jtx::sign(jv, account); - - if (jt.sponsorSigner) - jt.sponsorSigner(*this, jt); } void diff --git a/src/test/jtx/impl/multisign.cpp b/src/test/jtx/impl/multisign.cpp index fc6163a2f3..4a61554705 100644 --- a/src/test/jtx/impl/multisign.cpp +++ b/src/test/jtx/impl/multisign.cpp @@ -70,7 +70,8 @@ msig::operator()(Env& env, JTx& jt) const { auto const mySigners = signers; auto callback = [subField = subField, mySigners, &env](Env&, JTx& jtx) { - // Where to put the signature. Supports sfCounterPartySignature. + // Where to put the signature. Supports sfCounterPartySignature and + // sfSponsorSignature. auto& sigObject = subField ? jtx[*subField] : jtx.jv; // The signing pub key is only required at the top level. diff --git a/src/test/jtx/impl/sponsor.cpp b/src/test/jtx/impl/sponsor.cpp index befaaa337b..e5729130c3 100644 --- a/src/test/jtx/impl/sponsor.cpp +++ b/src/test/jtx/impl/sponsor.cpp @@ -119,76 +119,6 @@ as::operator()(Env& env, JTx& jt) const jt.jv[sfSponsor.jsonName][sfFlags.jsonName] = flags; } -void -sig::operator()(Env& env, JTx& jt) const -{ - auto const signer = signer_; - - jt.jv[sfSponsor.jsonName][sfAccount.jsonName] = signer.acct.human(); - jt.jv[sfSponsor.jsonName][sfSigningPubKey.jsonName] = - strHex(signer.sig.pk().slice()); - - jt.sponsorSigner = [signer, &env](Env&, JTx& jtx) { - std::optional st; - try - { - Json::Value jv = jtx.jv; - st = parse(jv); - } - catch (parse_error const&) - { - env.test.log << pretty(jtx.jv) << std::endl; - Rethrow(); - } - - auto const sst = st->getFieldObject(sfSponsor); - - auto const signingData = - STTx::getSponsorSigningData(STTx{std::move(*st)}); - - auto const sig = ripple::sign( - signer.acct.pk(), signer.acct.sk(), makeSlice(signingData)); - jtx.jv[sfSponsor.jsonName][jss::TxnSignature] = - strHex(Slice{sig.data(), sig.size()}); - }; -} - -void -msig::operator()(Env& env, JTx& jt) const -{ - auto const mySigners = signers; - jt.sponsorSigner = [mySigners, &env](Env&, JTx& jtx) { - std::optional st; - try - { - Json::Value jv = jtx.jv; - jv[jss::SigningPubKey] = ""; - st = parse(jv); - } - catch (parse_error const&) - { - env.test.log << pretty(jtx.jv) << std::endl; - Rethrow(); - } - auto const sst = st->getFieldObject(sfSponsor); - auto& js = jtx[sfSponsor.jsonName][sfSigners.jsonName]; - for (std::size_t i = 0; i < mySigners.size(); ++i) - { - auto const& e = mySigners[i]; - auto& jo = js[i][sfSigner.jsonName]; - jo[jss::Account] = e.acct.human(); - jo[jss::SigningPubKey] = strHex(e.sig.pk().slice()); - - Serializer ss{ - buildSponsorMultiSigningData(*st, e.acct.id(), sst.getFlags())}; - - auto const sig = ripple::sign( - *publicKeyType(e.sig.pk().slice()), e.sig.sk(), ss.slice()); - jo[sfTxnSignature.jsonName] = strHex(Slice{sig.data(), sig.size()}); - } - }; -} - Json::Value ledgerEntry( jtx::Env& env, diff --git a/src/test/jtx/sponsor.h b/src/test/jtx/sponsor.h index db350207c8..64e09a96c1 100644 --- a/src/test/jtx/sponsor.h +++ b/src/test/jtx/sponsor.h @@ -101,35 +101,6 @@ public: operator()(jtx::Env&, jtx::JTx& jtx) const; }; -struct sig -{ -private: - Reg signer_; - -public: - sig(Reg signer) : signer_(std::move(signer)) - { - } - - void - operator()(jtx::Env&, jtx::JTx& jtx) const; -}; - -struct msig -{ -private: - std::vector signers; - -public: - msig(std::vector signers_) : signers(std::move(signers_)) - { - sortSigners(signers); - } - - void - operator()(jtx::Env&, jtx::JTx& jtx) const; -}; - Json::Value ledgerEntry( jtx::Env& env, diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index 8e500cc865..a0e91dce21 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -870,7 +870,7 @@ class AccountTx_test : public beast::unit_test::suite // fee sponsorship env(noop(alice), sponsor::as(sponsor, tfSponsorFee), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); checkTx(alice, jss::AccountSet); checkTx(sponsor, jss::AccountSet); @@ -893,7 +893,7 @@ class AccountTx_test : public beast::unit_test::suite // transfer object sponsorship env(sponsor::transfer(alice, keylet::ticket(alice, seq + 1).key), sponsor::as(sponsor2, tfSponsorReserve), - sponsor::sig(sponsor2)); + sig(sfSponsorSignature, sponsor2)); env.close(); checkTx(alice, jss::SponsorshipTransfer); checkTx(sponsor, jss::SponsorshipTransfer); @@ -903,7 +903,7 @@ class AccountTx_test : public beast::unit_test::suite env(noop(alice), ticket::use(seq + 1), sponsor::as(sponsor, tfSponsorFee), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); checkTx(alice, jss::AccountSet); checkTx(sponsor, jss::AccountSet); @@ -912,7 +912,7 @@ class AccountTx_test : public beast::unit_test::suite // account sponsorship env(sponsor::transfer(alice), sponsor::as(sponsor, tfSponsorReserve), - sponsor::sig(sponsor)); + sig(sfSponsorSignature, sponsor)); env.close(); checkTx(alice, jss::SponsorshipTransfer); checkTx(sponsor, jss::SponsorshipTransfer); diff --git a/src/xrpld/app/tx/detail/Transactor.cpp b/src/xrpld/app/tx/detail/Transactor.cpp index 4b3b5d4c88..1243953f84 100644 --- a/src/xrpld/app/tx/detail/Transactor.cpp +++ b/src/xrpld/app/tx/detail/Transactor.cpp @@ -322,9 +322,7 @@ Transactor::checkSponsor(ReadView const& view, STTx const& tx) auto const sponsorAcc = txSponsor.getAccountID(sfAccount); auto const sponseeAcc = tx.getAccountID(sfAccount); - auto const hasSponsorSignature = txSponsor.isFieldPresent(sfTxnSignature) || - !txSponsor.getFieldVL(sfSigningPubKey).empty() || - txSponsor.isFieldPresent(sfSigners); + auto const hasSponsorSignature = tx.isFieldPresent(sfSponsorSignature); if (!hasSponsorSignature) { @@ -787,17 +785,20 @@ Transactor::checkSign( return tesSUCCESS; } - if (sigObject.isFieldPresent(sfSponsor)) + if (sigObject.isFieldPresent(sfSponsorSignature)) { + if (!sigObject.isFieldPresent(sfSponsor)) + return temMALFORMED; + auto const sponsorObj = sigObject.getFieldObject(sfSponsor); - auto const isCoSigned = sponsorObj.isFieldPresent(sfTxnSignature) || - !sponsorObj.getFieldVL(sfSigningPubKey).empty() || - sponsorObj.isFieldPresent(sfSigners); + auto const isCoSigned = sigObject.isFieldPresent(sfSponsorSignature); if (isCoSigned) { auto const sponsorAcc = sponsorObj.getAccountID(sfAccount); + auto const sponsorSignature = + sigObject.getFieldObject(sfSponsorSignature); if (auto const ret = - checkSign(view, flags, sponsorAcc, sponsorObj, j); + checkSign(view, flags, sponsorAcc, sponsorSignature, j); !isTesSuccess(ret)) return ret; } @@ -1266,9 +1267,7 @@ Transactor::getFeePayer(STTx const& tx) tx.getFieldObject(sfSponsor).isFlag(tfSponsorFee)) { auto const sponsor = tx.getFieldObject(sfSponsor); - auto const hasSignature = sponsor.isFieldPresent(sfTxnSignature) || - !sponsor.getFieldVL(sfSigningPubKey).empty() || - sponsor.isFieldPresent(sfSigners); + auto const hasSignature = tx.isFieldPresent(sfSponsorSignature); if (!hasSignature) { diff --git a/src/xrpld/app/tx/detail/apply.cpp b/src/xrpld/app/tx/detail/apply.cpp index 6b91314ad0..065f9cb832 100644 --- a/src/xrpld/app/tx/detail/apply.cpp +++ b/src/xrpld/app/tx/detail/apply.cpp @@ -86,13 +86,13 @@ checkValidity( if (tx.isFieldPresent(sfSponsor) && rules.enabled(featureSponsor)) { auto const sponsorObj = tx.getFieldObject(sfSponsor); - auto const isCoSigned = sponsorObj.isFieldPresent(sfTxnSignature) || - !sponsorObj.getFieldVL(sfSigningPubKey).empty() || - sponsorObj.isFieldPresent(sfSigners); + auto const isCoSigned = tx.isFieldPresent(sfSponsorSignature); if (isCoSigned) { - auto const sigVerify = - tx.checkSponsorSign(requireCanonicalSig, rules); + auto const sponsorSignatureObj = + tx.getFieldObject(sfSponsorSignature); + auto const sigVerify = tx.checkSign( + requireCanonicalSig, rules, &sponsorSignatureObj); if (!sigVerify) { router.setFlags(id, SF_SIGBAD);