#include #include namespace hook { using namespace ripple; using HookReturnCode = hook_api::hook_return_code; using Bytes = std::vector; struct HookContext; // defined in applyHook.h class HookAPI { public: explicit HookAPI(HookContext& ctx) : hookCtx(ctx) { } /// control APIs // _g // accept // rollback /// util APIs Expected util_raddr(Bytes const& accountID) const; Expected util_accid(std::string raddress) const; Expected util_verify(Slice const& data, Slice const& sig, Slice const& key) const; uint256 util_sha512h(Slice const& data) const; // util_keylet() /// sto APIs Expected sto_validate(Bytes const& data) const; Expected, HookReturnCode> sto_subfield(Bytes const& data, uint32_t field_id) const; Expected, HookReturnCode> sto_subarray(Bytes const& data, uint32_t index_id) const; Expected sto_emplace( Bytes const& source_object, std::optional const& field_object, uint32_t field_id) const; // sto_erase(): same as sto_emplace with field_object = nullopt /// etxn APIs Expected, HookReturnCode> emit(Slice const& txBlob) const; Expected etxn_burden() const; Expected etxn_fee_base(Slice const& txBlob) const; Expected etxn_details(uint8_t* out_ptr) const; Expected etxn_reserve(uint64_t count) const; uint32_t etxn_generation() const; Expected etxn_nonce() const; /// float APIs Expected float_set(int32_t exponent, int64_t mantissa) const; Expected float_multiply(uint64_t float1, uint64_t float2) const; Expected float_mulratio( uint64_t float1, uint32_t round_up, uint32_t numerator, uint32_t denominator) const; uint64_t float_negate(uint64_t float1) const; Expected float_compare(uint64_t float1, uint64_t float2, uint32_t mode) const; Expected float_sum(uint64_t float1, uint64_t float2) const; Expected float_sto( std::optional currency, std::optional issuer, uint64_t float1, uint32_t field_code, uint32_t write_len) const; Expected float_sto_set(Bytes const& data) const; Expected float_invert(uint64_t float1) const; Expected float_divide(uint64_t float1, uint64_t float2) const; uint64_t float_one() const; Expected float_mantissa(uint64_t float1) const; uint64_t float_sign(uint64_t float1) const; Expected float_int(uint64_t float1, uint32_t decimal_places, uint32_t absolute) const; Expected float_log(uint64_t float1) const; Expected float_root(uint64_t float1, uint32_t n) const; /// otxn APIs uint64_t otxn_burden() const; uint32_t otxn_generation() const; Expected otxn_field(uint32_t field_id) const; Expected otxn_id(uint32_t flags) const; TxType otxn_type() const; Expected otxn_slot(uint32_t slot_into) const; Expected otxn_param(Bytes const& param_name) const; /// hook APIs AccountID hook_account() const; Expected hook_hash(int32_t hook_no) const; Expected hook_again() const; Expected hook_param(Bytes const& paramName) const; Expected hook_param_set( uint256 const& hash, Bytes const& paramName, Bytes const& paramValue) const; Expected hook_skip(uint256 const& hash, uint32_t flags) const; uint8_t hook_pos() const; /// ledger APIs uint64_t fee_base() const; uint32_t ledger_seq() const; uint256 ledger_last_hash() const; uint64_t ledger_last_time() const; Expected ledger_nonce() const; Expected ledger_keylet(Keylet const& klLo, Keylet const& klHi) const; /// state APIs // state(): same as state_foreign with ns = 0 and account = hook_account() Expected state_foreign( uint256 const& key, uint256 const& ns, AccountID const& account) const; // state_set(): same as state_foreign_set with ns = 0 and account = Expected state_foreign_set( uint256 const& key, uint256 const& ns, AccountID const& account, Bytes& data) const; /// slot APIs Expected slot(uint32_t slot_no) const; Expected slot_clear(uint32_t slot_no) const; Expected slot_count(uint32_t slot_no) const; Expected slot_set(Bytes const& data, uint32_t slot_no) const; Expected slot_size(uint32_t slot_no) const; Expected slot_subarray(uint32_t parent_slot, uint32_t array_id, uint32_t new_slot) const; Expected slot_subfield(uint32_t parent_slot, uint32_t field_id, uint32_t new_slot) const; Expected, HookReturnCode> slot_type(uint32_t slot_no, uint32_t flags) const; Expected slot_float(uint32_t slot_no) const; /// trace APIs // trace // trace_num // trace_float Expected meta_slot(uint32_t slot_into) const; Expected, HookReturnCode> xpop_slot(uint32_t slot_into_tx, uint32_t slot_into_meta) const; private: HookContext& hookCtx; inline int32_t no_free_slots() const; inline std::optional get_free_slot() const; inline Expected float_multiply_internal_parts( uint64_t man1, int32_t exp1, bool neg1, uint64_t man2, int32_t exp2, bool neg2) const; inline Expected mulratio_internal( int64_t& man1, int32_t& exp1, bool round_up, uint32_t numerator, uint32_t denominator) const; inline Expected float_divide_internal(uint64_t float1, uint64_t float2) const; inline Expected double_to_xfl(double x) const; std::optional unserialize_keylet(Bytes const& data) const; // update the state cache inline std::optional< std::reference_wrapper const>> lookup_state_cache( AccountID const& acc, uint256 const& ns, uint256 const& key) const; // check the state cache inline Expected set_state_cache( AccountID const& acc, uint256 const& ns, uint256 const& key, Bytes const& data, bool modified) const; // these are only used by get_stobject_length below enum parse_error { pe_unexpected_end = -1, pe_unknown_type_early = -2, // detected early pe_unknown_type_late = -3, // end of function pe_excessive_nesting = -4, pe_excessive_size = -5 }; inline Expected< int32_t, parse_error> get_stobject_length( unsigned char* start, // in - begin iterator unsigned char* maxptr, // in - end iterator int& type, // out - populated by serialized type code int& field, // out - populated by serialized field code int& payload_start, // out - the start of actual payload data for // this type int& payload_length, // out - the length of actual payload data for // this type int recursion_depth = 0) // used internally const; }; } // namespace hook