From 8a0635396abe5baba23c7def1894ef5ab5aa9615 Mon Sep 17 00:00:00 2001 From: Richard Holland Date: Fri, 16 Dec 2022 10:44:07 +0000 Subject: [PATCH] ttInvoke part 1 --- Builds/CMake/RippledCore.cmake | 1 + src/ripple/app/hook/applyHook.h | 3 ++- src/ripple/app/hook/impl/applyHook.cpp | 1 + src/ripple/app/tx/impl/applySteps.cpp | 11 +++++++++++ src/ripple/protocol/SField.h | 1 + src/ripple/protocol/TxFormats.h | 3 +++ src/ripple/protocol/impl/SField.cpp | 1 + src/ripple/protocol/impl/TxFormats.cpp | 9 +++++++++ src/ripple/protocol/jss.h | 1 + 9 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Builds/CMake/RippledCore.cmake b/Builds/CMake/RippledCore.cmake index 86fdf8911..31cec2ae0 100644 --- a/Builds/CMake/RippledCore.cmake +++ b/Builds/CMake/RippledCore.cmake @@ -441,6 +441,7 @@ target_sources (rippled PRIVATE src/ripple/app/tx/impl/SetRegularKey.cpp src/ripple/app/tx/impl/SetHook.cpp src/ripple/app/tx/impl/ClaimReward.cpp + src/ripple/app/tx/impl/Invoke.cpp src/ripple/app/tx/impl/SetSignerList.cpp src/ripple/app/tx/impl/SetTrust.cpp src/ripple/app/tx/impl/SignerEntries.cpp diff --git a/src/ripple/app/hook/applyHook.h b/src/ripple/app/hook/applyHook.h index 04dc170f7..c8ea5b478 100644 --- a/src/ripple/app/hook/applyHook.h +++ b/src/ripple/app/hook/applyHook.h @@ -66,7 +66,8 @@ namespace hook {ttNFTOKEN_CREATE_OFFER, tshROLLBACK }, {ttNFTOKEN_CANCEL_OFFER, tshCOLLECT }, {ttNFTOKEN_ACCEPT_OFFER, tshROLLBACK }, - {ttCLAIM_REWARD, tshROLLBACK } + {ttCLAIM_REWARD, tshROLLBACK }, + {ttINVOKE, tshROLLBACK } }; diff --git a/src/ripple/app/hook/impl/applyHook.cpp b/src/ripple/app/hook/impl/applyHook.cpp index 22f4eadd4..fc92b2ba9 100644 --- a/src/ripple/app/hook/impl/applyHook.cpp +++ b/src/ripple/app/hook/impl/applyHook.cpp @@ -202,6 +202,7 @@ namespace hook case ttCHECK_CREATE: case ttACCOUNT_DELETE: case ttPAYCHAN_CREATE: + case ttINVOKE: { ADD_TSH(*destAcc, canRollback); break; diff --git a/src/ripple/app/tx/impl/applySteps.cpp b/src/ripple/app/tx/impl/applySteps.cpp index bddb1339e..850504ca2 100644 --- a/src/ripple/app/tx/impl/applySteps.cpp +++ b/src/ripple/app/tx/impl/applySteps.cpp @@ -41,6 +41,7 @@ #include #include #include +#include namespace ripple { @@ -153,6 +154,8 @@ invoke_preflight(PreflightContext const& ctx) return invoke_preflight_helper(ctx); case ttCLAIM_REWARD: return invoke_preflight_helper(ctx); + case ttINVOKE: + return invoke_preflight_helper(ctx); default: assert(false); return {temUNKNOWN, TxConsequences{temUNKNOWN}}; @@ -260,6 +263,8 @@ invoke_preclaim(PreclaimContext const& ctx) return invoke_preclaim(ctx); case ttCLAIM_REWARD: return invoke_preclaim(ctx); + case ttINVOKE: + return invoke_preclaim(ctx); default: assert(false); return temUNKNOWN; @@ -328,6 +333,8 @@ invoke_calculateBaseFee(ReadView const& view, STTx const& tx) return NFTokenAcceptOffer::calculateBaseFee(view, tx); case ttCLAIM_REWARD: return ClaimReward::calculateBaseFee(view, tx); + case ttINVOKE: + return Invoke::calculateBaseFee(view, tx); default: assert(false); return FeeUnit64{0}; @@ -490,6 +497,10 @@ invoke_apply(ApplyContext& ctx) ClaimReward p(ctx); return p(); } + case ttINVOKE: { + Invoke p(ctx); + return p(); + } default: assert(false); return {temUNKNOWN, false}; diff --git a/src/ripple/protocol/SField.h b/src/ripple/protocol/SField.h index e1f9e5d65..dd8c9cce2 100644 --- a/src/ripple/protocol/SField.h +++ b/src/ripple/protocol/SField.h @@ -519,6 +519,7 @@ extern SF_VL const sfHookStateData; extern SF_VL const sfHookReturnString; extern SF_VL const sfHookParameterName; extern SF_VL const sfHookParameterValue; +extern SF_VL const sfBlob; // account extern SF_ACCOUNT const sfAccount; diff --git a/src/ripple/protocol/TxFormats.h b/src/ripple/protocol/TxFormats.h index b432bdd5d..edf22d628 100644 --- a/src/ripple/protocol/TxFormats.h +++ b/src/ripple/protocol/TxFormats.h @@ -142,6 +142,9 @@ enum TxType : std::uint16_t /** This transaction resets accumulator/counters and claims a reward for holding an average balance * from a specified hook */ ttCLAIM_REWARD = 98, + + /** This transaction invokes a hook, providing arbitrary data. Essentially as a 0 drop payment. **/ + ttINVOKE = 99, /** This system-generated transaction type is used to update the status of the various amendments. diff --git a/src/ripple/protocol/impl/SField.cpp b/src/ripple/protocol/impl/SField.cpp index 0d4058f0d..4e75bd760 100644 --- a/src/ripple/protocol/impl/SField.cpp +++ b/src/ripple/protocol/impl/SField.cpp @@ -270,6 +270,7 @@ CONSTRUCT_TYPED_SFIELD(sfHookStateData, "HookStateData", VL, CONSTRUCT_TYPED_SFIELD(sfHookReturnString, "HookReturnString", VL, 23); CONSTRUCT_TYPED_SFIELD(sfHookParameterName, "HookParameterName", VL, 24); CONSTRUCT_TYPED_SFIELD(sfHookParameterValue, "HookParameterValue", VL, 25); +CONSTRUCT_TYPED_SFIELD(sfBlob, "Blob", VL, 26); // account CONSTRUCT_TYPED_SFIELD(sfAccount, "Account", ACCOUNT, 1); diff --git a/src/ripple/protocol/impl/TxFormats.cpp b/src/ripple/protocol/impl/TxFormats.cpp index 298e8de96..63c22d63b 100644 --- a/src/ripple/protocol/impl/TxFormats.cpp +++ b/src/ripple/protocol/impl/TxFormats.cpp @@ -350,6 +350,15 @@ TxFormats::TxFormats() {sfTicketSequence, soeOPTIONAL}, }, commonFields); + + add(jss::Invoke, + ttINVOKE, + { + {sfBlob, soeOPTIONAL}, + {sfHookParameters, soeOPTIONAL}, + {sfDestination, soeREQUIRED} + }, + commonFields); } TxFormats const& diff --git a/src/ripple/protocol/jss.h b/src/ripple/protocol/jss.h index c52ee8a5a..21754166a 100644 --- a/src/ripple/protocol/jss.h +++ b/src/ripple/protocol/jss.h @@ -83,6 +83,7 @@ JSS(HookParameterValue); // field JSS(HookParameter); // field JSS(HookGrant); // field JSS(Invalid); // +JSS(Invoke); // transaction type JSS(LastLedgerSequence); // in: TransactionSign; field JSS(LedgerHashes); // ledger type. JSS(LimitAmount); // field.