diff --git a/src/ripple/protocol/TER.h b/src/ripple/protocol/TER.h index dcb31bfd8..a30bd794a 100644 --- a/src/ripple/protocol/TER.h +++ b/src/ripple/protocol/TER.h @@ -185,7 +185,7 @@ enum TERcodes : TERUnderlyingType { // - Hold // - Makes hole in sequence which jams transactions. terRETRY = -99, - terFUNDS_SPENT, // This is a free transaction, so don't burden network. + terFUNDS_SPENT, // DEPRECATED. terINSUF_FEE_B, // Can't pay fee, therefore don't burden network. terNO_ACCOUNT, // Can't pay fee, therefore don't burden network. terNO_AUTH, // Not authorized to hold IOUs. @@ -193,7 +193,7 @@ enum TERcodes : TERUnderlyingType { terOWNERS, // Can't succeed with non-zero owner count. terPRE_SEQ, // Can't pay fee, no point in forwarding, so don't // burden network. - terLAST, // Process after all other transactions + terLAST, // DEPRECATED. terNO_RIPPLE, // Rippling not allowed terQUEUED // Transaction is being held in TxQ until fee drops }; @@ -238,7 +238,7 @@ enum TECcodes : TERUnderlyingType { // DO NOT CHANGE THESE NUMBERS: They appear in ledger meta data. tecCLAIM = 100, tecPATH_PARTIAL = 101, - tecUNFUNDED_ADD = 102, + tecUNFUNDED_ADD = 102, // Unused legacy code tecUNFUNDED_OFFER = 103, tecUNFUNDED_PAYMENT = 104, tecFAILED_PROCESSING = 105, @@ -250,7 +250,7 @@ enum TECcodes : TERUnderlyingType { tecNO_LINE_INSUF_RESERVE = 126, tecNO_LINE_REDUNDANT = 127, tecPATH_DRY = 128, - tecUNFUNDED = 129, // Deprecated, old ambiguous unfunded. + tecUNFUNDED = 129, tecNO_ALTERNATIVE_KEY = 130, tecNO_REGULAR_KEY = 131, tecOWNERS = 132, diff --git a/src/ripple/protocol/impl/TER.cpp b/src/ripple/protocol/impl/TER.cpp index 7f0e795cf..f496711dd 100644 --- a/src/ripple/protocol/impl/TER.cpp +++ b/src/ripple/protocol/impl/TER.cpp @@ -31,230 +31,144 @@ static std::unordered_map< std::pair> const& transResults() { - static std::unordered_map< - TERUnderlyingType, - std::pair> const results{ - {tecCLAIM, {"tecCLAIM", "Fee claimed. Sequence used. No action."}}, - {tecDIR_FULL, {"tecDIR_FULL", "Can not add entry to full directory."}}, - {tecFAILED_PROCESSING, - {"tecFAILED_PROCESSING", "Failed to correctly process transaction."}}, - {tecINSUF_RESERVE_LINE, - {"tecINSUF_RESERVE_LINE", "Insufficient reserve to add trust line."}}, - {tecINSUF_RESERVE_OFFER, - {"tecINSUF_RESERVE_OFFER", "Insufficient reserve to create offer."}}, - {tecNO_DST, - {"tecNO_DST", "Destination does not exist. Send XRP to create it."}}, - {tecNO_DST_INSUF_XRP, - {"tecNO_DST_INSUF_XRP", - "Destination does not exist. Too little XRP sent to create it."}}, - {tecNO_LINE_INSUF_RESERVE, - {"tecNO_LINE_INSUF_RESERVE", - "No such line. Too little reserve to create it."}}, - {tecNO_LINE_REDUNDANT, - {"tecNO_LINE_REDUNDANT", "Can't set non-existent line to default."}}, - {tecPATH_DRY, {"tecPATH_DRY", "Path could not send partial amount."}}, - {tecPATH_PARTIAL, - {"tecPATH_PARTIAL", "Path could not send full amount."}}, - {tecNO_ALTERNATIVE_KEY, - {"tecNO_ALTERNATIVE_KEY", - "The operation would remove the ability to sign transactions with " - "the account."}}, - {tecNO_REGULAR_KEY, {"tecNO_REGULAR_KEY", "Regular key is not set."}}, - {tecOVERSIZE, {"tecOVERSIZE", "Object exceeded serialization limits."}}, - {tecUNFUNDED, - {"tecUNFUNDED", "One of _ADD, _OFFER, or _SEND. Deprecated."}}, - {tecUNFUNDED_ADD, - {"tecUNFUNDED_ADD", "Insufficient XRP balance for WalletAdd."}}, - {tecUNFUNDED_OFFER, - {"tecUNFUNDED_OFFER", "Insufficient balance to fund created offer."}}, - {tecUNFUNDED_PAYMENT, - {"tecUNFUNDED_PAYMENT", "Insufficient XRP balance to send."}}, - {tecOWNERS, {"tecOWNERS", "Non-zero owner count."}}, - {tecNO_ISSUER, {"tecNO_ISSUER", "Issuer account does not exist."}}, - {tecNO_AUTH, {"tecNO_AUTH", "Not authorized to hold asset."}}, - {tecNO_LINE, {"tecNO_LINE", "No such line."}}, - {tecINSUFF_FEE, {"tecINSUFF_FEE", "Insufficient balance to pay fee."}}, - {tecFROZEN, {"tecFROZEN", "Asset is frozen."}}, - {tecNO_TARGET, {"tecNO_TARGET", "Target account does not exist."}}, - {tecNO_PERMISSION, - {"tecNO_PERMISSION", "No permission to perform requested operation."}}, - {tecNO_ENTRY, {"tecNO_ENTRY", "No matching entry found."}}, - {tecINSUFFICIENT_RESERVE, - {"tecINSUFFICIENT_RESERVE", - "Insufficient reserve to complete requested operation."}}, - {tecNEED_MASTER_KEY, - {"tecNEED_MASTER_KEY", - "The operation requires the use of the Master Key."}}, - {tecDST_TAG_NEEDED, - {"tecDST_TAG_NEEDED", "A destination tag is required."}}, - {tecINTERNAL, - {"tecINTERNAL", "An internal error has occurred during processing."}}, - {tecCRYPTOCONDITION_ERROR, - {"tecCRYPTOCONDITION_ERROR", - "Malformed, invalid, or mismatched conditional or fulfillment."}}, - {tecINVARIANT_FAILED, - {"tecINVARIANT_FAILED", - "One or more invariants for the transaction were not satisfied."}}, - {tecEXPIRED, {"tecEXPIRED", "Expiration time is passed."}}, - {tecDUPLICATE, {"tecDUPLICATE", "Ledger object already exists."}}, - {tecKILLED, {"tecKILLED", "FillOrKill offer killed."}}, - {tecHAS_OBLIGATIONS, - {"tecHAS_OBLIGATIONS", - "The account cannot be deleted since it has obligations."}}, - {tecTOO_SOON, - {"tecTOO_SOON", - "It is too early to attempt the requested operation. Please wait."}}, + // clang-format off - {tefALREADY, - {"tefALREADY", "The exact transaction was already in this ledger."}}, - {tefBAD_ADD_AUTH, - {"tefBAD_ADD_AUTH", "Not authorized to add account."}}, - {tefBAD_AUTH, - {"tefBAD_AUTH", "Transaction's public key is not authorized."}}, - {tefBAD_LEDGER, {"tefBAD_LEDGER", "Ledger in unexpected state."}}, - {tefBAD_QUORUM, - {"tefBAD_QUORUM", "Signatures provided do not meet the quorum."}}, - {tefBAD_SIGNATURE, - {"tefBAD_SIGNATURE", "A signature is provided for a non-signer."}}, - {tefCREATED, {"tefCREATED", "Can't add an already created account."}}, - {tefEXCEPTION, {"tefEXCEPTION", "Unexpected program state."}}, - {tefFAILURE, {"tefFAILURE", "Failed to apply."}}, - {tefINTERNAL, {"tefINTERNAL", "Internal error."}}, - {tefMASTER_DISABLED, {"tefMASTER_DISABLED", "Master key is disabled."}}, - {tefMAX_LEDGER, {"tefMAX_LEDGER", "Ledger sequence too high."}}, - {tefNO_AUTH_REQUIRED, {"tefNO_AUTH_REQUIRED", "Auth is not required."}}, - {tefNOT_MULTI_SIGNING, - {"tefNOT_MULTI_SIGNING", - "Account has no appropriate list of multi-signers."}}, - {tefPAST_SEQ, - {"tefPAST_SEQ", "This sequence number has already passed."}}, - {tefWRONG_PRIOR, - {"tefWRONG_PRIOR", "This previous transaction does not match."}}, - {tefBAD_AUTH_MASTER, - {"tefBAD_AUTH_MASTER", - "Auth for unclaimed account needs correct master key."}}, - {tefINVARIANT_FAILED, - {"tefINVARIANT_FAILED", - "Fee claim violated invariants for the transaction."}}, - {tefTOO_BIG, {"tefTOO_BIG", "Transaction affects too many items."}}, + // Macros are generally ugly, but they can help make code readable to + // humans without affecting the compiler. +#define MAKE_ERROR(code, desc) { code, { #code, desc } } - {telLOCAL_ERROR, {"telLOCAL_ERROR", "Local failure."}}, - {telBAD_DOMAIN, {"telBAD_DOMAIN", "Domain too long."}}, - {telBAD_PATH_COUNT, - {"telBAD_PATH_COUNT", "Malformed: Too many paths."}}, - {telBAD_PUBLIC_KEY, {"telBAD_PUBLIC_KEY", "Public key too long."}}, - {telFAILED_PROCESSING, - {"telFAILED_PROCESSING", "Failed to correctly process transaction."}}, - {telINSUF_FEE_P, {"telINSUF_FEE_P", "Fee insufficient."}}, - {telNO_DST_PARTIAL, - {"telNO_DST_PARTIAL", - "Partial payment to create account not allowed."}}, - {telCAN_NOT_QUEUE, {"telCAN_NOT_QUEUE", "Can not queue at this time."}}, - {telCAN_NOT_QUEUE_BALANCE, - {"telCAN_NOT_QUEUE_BALANCE", - "Can not queue at this time: insufficient balance to pay all queued " - "fees."}}, - {telCAN_NOT_QUEUE_BLOCKS, - {"telCAN_NOT_QUEUE_BLOCKS", - "Can not queue at this time: would block later queued " - "transaction(s)."}}, - {telCAN_NOT_QUEUE_BLOCKED, - {"telCAN_NOT_QUEUE_BLOCKED", - "Can not queue at this time: blocking transaction in queue."}}, - {telCAN_NOT_QUEUE_FEE, - {"telCAN_NOT_QUEUE_FEE", - "Can not queue at this time: fee insufficient to replace queued " - "transaction."}}, - {telCAN_NOT_QUEUE_FULL, - {"telCAN_NOT_QUEUE_FULL", - "Can not queue at this time: queue is full."}}, + static + std::unordered_map< + TERUnderlyingType, + std::pair> const results + { + MAKE_ERROR(tecCLAIM, "Fee claimed. Sequence used. No action."), + MAKE_ERROR(tecDIR_FULL, "Can not add entry to full directory."), + MAKE_ERROR(tecFAILED_PROCESSING, "Failed to correctly process transaction."), + MAKE_ERROR(tecINSUF_RESERVE_LINE, "Insufficient reserve to add trust line."), + MAKE_ERROR(tecINSUF_RESERVE_OFFER, "Insufficient reserve to create offer."), + MAKE_ERROR(tecNO_DST, "Destination does not exist. Send XRP to create it."), + MAKE_ERROR(tecNO_DST_INSUF_XRP, "Destination does not exist. Too little XRP sent to create it."), + MAKE_ERROR(tecNO_LINE_INSUF_RESERVE, "No such line. Too little reserve to create it."), + MAKE_ERROR(tecNO_LINE_REDUNDANT, "Can't set non-existent line to default."), + MAKE_ERROR(tecPATH_DRY, "Path could not send partial amount."), + MAKE_ERROR(tecPATH_PARTIAL, "Path could not send full amount."), + MAKE_ERROR(tecNO_ALTERNATIVE_KEY, "The operation would remove the ability to sign transactions with the account."), + MAKE_ERROR(tecNO_REGULAR_KEY, "Regular key is not set."), + MAKE_ERROR(tecOVERSIZE, "Object exceeded serialization limits."), + MAKE_ERROR(tecUNFUNDED, "Not enough XRP to satisfy the reserve requirement."), + MAKE_ERROR(tecUNFUNDED_ADD, "DEPRECATED."), + MAKE_ERROR(tecUNFUNDED_OFFER, "Insufficient balance to fund created offer."), + MAKE_ERROR(tecUNFUNDED_PAYMENT, "Insufficient XRP balance to send."), + MAKE_ERROR(tecOWNERS, "Non-zero owner count."), + MAKE_ERROR(tecNO_ISSUER, "Issuer account does not exist."), + MAKE_ERROR(tecNO_AUTH, "Not authorized to hold asset."), + MAKE_ERROR(tecNO_LINE, "No such line."), + MAKE_ERROR(tecINSUFF_FEE, "Insufficient balance to pay fee."), + MAKE_ERROR(tecFROZEN, "Asset is frozen."), + MAKE_ERROR(tecNO_TARGET, "Target account does not exist."), + MAKE_ERROR(tecNO_PERMISSION, "No permission to perform requested operation."), + MAKE_ERROR(tecNO_ENTRY, "No matching entry found."), + MAKE_ERROR(tecINSUFFICIENT_RESERVE, "Insufficient reserve to complete requested operation."), + MAKE_ERROR(tecNEED_MASTER_KEY, "The operation requires the use of the Master Key."), + MAKE_ERROR(tecDST_TAG_NEEDED, "A destination tag is required."), + MAKE_ERROR(tecINTERNAL, "An internal error has occurred during processing."), + MAKE_ERROR(tecCRYPTOCONDITION_ERROR, "Malformed, invalid, or mismatched conditional or fulfillment."), + MAKE_ERROR(tecINVARIANT_FAILED, "One or more invariants for the transaction were not satisfied."), + MAKE_ERROR(tecEXPIRED, "Expiration time is passed."), + MAKE_ERROR(tecDUPLICATE, "Ledger object already exists."), + MAKE_ERROR(tecKILLED, "FillOrKill offer killed."), + MAKE_ERROR(tecHAS_OBLIGATIONS, "The account cannot be deleted since it has obligations."), + MAKE_ERROR(tecTOO_SOON, "It is too early to attempt the requested operation. Please wait."), - {temMALFORMED, {"temMALFORMED", "Malformed transaction."}}, - {temBAD_AMOUNT, {"temBAD_AMOUNT", "Can only send positive amounts."}}, - {temBAD_CURRENCY, {"temBAD_CURRENCY", "Malformed: Bad currency."}}, - {temBAD_EXPIRATION, - {"temBAD_EXPIRATION", "Malformed: Bad expiration."}}, - {temBAD_FEE, {"temBAD_FEE", "Invalid fee, negative or not XRP."}}, - {temBAD_ISSUER, {"temBAD_ISSUER", "Malformed: Bad issuer."}}, - {temBAD_LIMIT, {"temBAD_LIMIT", "Limits must be non-negative."}}, - {temBAD_OFFER, {"temBAD_OFFER", "Malformed: Bad offer."}}, - {temBAD_PATH, {"temBAD_PATH", "Malformed: Bad path."}}, - {temBAD_PATH_LOOP, {"temBAD_PATH_LOOP", "Malformed: Loop in path."}}, - {temBAD_QUORUM, {"temBAD_QUORUM", "Malformed: Quorum is unreachable."}}, - {temBAD_REGKEY, - {"temBAD_REGKEY", - "Malformed: Regular key cannot be same as master key."}}, - {temBAD_SEND_XRP_LIMIT, - {"temBAD_SEND_XRP_LIMIT", - "Malformed: Limit quality is not allowed for XRP to XRP."}}, - {temBAD_SEND_XRP_MAX, - {"temBAD_SEND_XRP_MAX", - "Malformed: Send max is not allowed for XRP to XRP."}}, - {temBAD_SEND_XRP_NO_DIRECT, - {"temBAD_SEND_XRP_NO_DIRECT", - "Malformed: No Ripple direct is not allowed for XRP to XRP."}}, - {temBAD_SEND_XRP_PARTIAL, - {"temBAD_SEND_XRP_PARTIAL", - "Malformed: Partial payment is not allowed for XRP to XRP."}}, - {temBAD_SEND_XRP_PATHS, - {"temBAD_SEND_XRP_PATHS", - "Malformed: Paths are not allowed for XRP to XRP."}}, - {temBAD_SEQUENCE, - {"temBAD_SEQUENCE", "Malformed: Sequence is not in the past."}}, - {temBAD_SIGNATURE, {"temBAD_SIGNATURE", "Malformed: Bad signature."}}, - {temBAD_SIGNER, - {"temBAD_SIGNER", - "Malformed: No signer may duplicate account or other signers."}}, - {temBAD_SRC_ACCOUNT, - {"temBAD_SRC_ACCOUNT", "Malformed: Bad source account."}}, - {temBAD_TRANSFER_RATE, - {"temBAD_TRANSFER_RATE", - "Malformed: Transfer rate must be >= 1.0 and <= 2.0"}}, - {temBAD_WEIGHT, - {"temBAD_WEIGHT", "Malformed: Weight must be a positive value."}}, - {temDST_IS_SRC, {"temDST_IS_SRC", "Destination may not be source."}}, - {temDST_NEEDED, {"temDST_NEEDED", "Destination not specified."}}, - {temINVALID, {"temINVALID", "The transaction is ill-formed."}}, - {temINVALID_FLAG, - {"temINVALID_FLAG", "The transaction has an invalid flag."}}, - {temREDUNDANT, {"temREDUNDANT", "Sends same currency to self."}}, - {temRIPPLE_EMPTY, {"temRIPPLE_EMPTY", "PathSet with no paths."}}, - {temUNCERTAIN, - {"temUNCERTAIN", "In process of determining result. Never returned."}}, - {temUNKNOWN, - {"temUNKNOWN", - "The transaction requires logic that is not implemented yet."}}, - {temDISABLED, - {"temDISABLED", - "The transaction requires logic that is currently disabled."}}, - {temBAD_TICK_SIZE, - {"temBAD_TICK_SIZE", "Malformed: Tick size out of range."}}, - {temINVALID_ACCOUNT_ID, - {"temINVALID_ACCOUNT_ID", - "Malformed: A field contains an invalid account ID."}}, - {temCANNOT_PREAUTH_SELF, - {"temCANNOT_PREAUTH_SELF", - "Malformed: An account may not preauthorize itself."}}, + MAKE_ERROR(tefALREADY, "The exact transaction was already in this ledger."), + MAKE_ERROR(tefBAD_ADD_AUTH, "Not authorized to add account."), + MAKE_ERROR(tefBAD_AUTH, "Transaction's public key is not authorized."), + MAKE_ERROR(tefBAD_LEDGER, "Ledger in unexpected state."), + MAKE_ERROR(tefBAD_QUORUM, "Signatures provided do not meet the quorum."), + MAKE_ERROR(tefBAD_SIGNATURE, "A signature is provided for a non-signer."), + MAKE_ERROR(tefCREATED, "Can't add an already created account."), + MAKE_ERROR(tefEXCEPTION, "Unexpected program state."), + MAKE_ERROR(tefFAILURE, "Failed to apply."), + MAKE_ERROR(tefINTERNAL, "Internal error."), + MAKE_ERROR(tefMASTER_DISABLED, "Master key is disabled."), + MAKE_ERROR(tefMAX_LEDGER, "Ledger sequence too high."), + MAKE_ERROR(tefNO_AUTH_REQUIRED, "Auth is not required."), + MAKE_ERROR(tefNOT_MULTI_SIGNING, "Account has no appropriate list of multi-signers."), + MAKE_ERROR(tefPAST_SEQ, "This sequence number has already passed."), + MAKE_ERROR(tefWRONG_PRIOR, "This previous transaction does not match."), + MAKE_ERROR(tefBAD_AUTH_MASTER, "Auth for unclaimed account needs correct master key."), + MAKE_ERROR(tefINVARIANT_FAILED, "Fee claim violated invariants for the transaction."), + MAKE_ERROR(tefTOO_BIG, "Transaction affects too many items."), - {terRETRY, {"terRETRY", "Retry transaction."}}, - {terFUNDS_SPENT, - {"terFUNDS_SPENT", - "Can't set password, password set funds already spent."}}, - {terINSUF_FEE_B, {"terINSUF_FEE_B", "Account balance can't pay fee."}}, - {terLAST, {"terLAST", "Process last."}}, - {terNO_RIPPLE, {"terNO_RIPPLE", "Path does not permit rippling."}}, - {terNO_ACCOUNT, - {"terNO_ACCOUNT", "The source account does not exist."}}, - {terNO_AUTH, {"terNO_AUTH", "Not authorized to hold IOUs."}}, - {terNO_LINE, {"terNO_LINE", "No such line."}}, - {terPRE_SEQ, {"terPRE_SEQ", "Missing/inapplicable prior transaction."}}, - {terOWNERS, {"terOWNERS", "Non-zero owner count."}}, - {terQUEUED, {"terQUEUED", "Held until escalated fee drops."}}, + MAKE_ERROR(telLOCAL_ERROR, "Local failure."), + MAKE_ERROR(telBAD_DOMAIN, "Domain too long."), + MAKE_ERROR(telBAD_PATH_COUNT, "Malformed: Too many paths."), + MAKE_ERROR(telBAD_PUBLIC_KEY, "Public key too long."), + MAKE_ERROR(telFAILED_PROCESSING, "Failed to correctly process transaction."), + MAKE_ERROR(telINSUF_FEE_P, "Fee insufficient."), + MAKE_ERROR(telNO_DST_PARTIAL, "Partial payment to create account not allowed."), + MAKE_ERROR(telCAN_NOT_QUEUE, "Can not queue at this time."), + MAKE_ERROR(telCAN_NOT_QUEUE_BALANCE, "Can not queue at this time: insufficient balance to pay all queued fees."), + MAKE_ERROR(telCAN_NOT_QUEUE_BLOCKS, "Can not queue at this time: would block later queued transaction(s)."), + MAKE_ERROR(telCAN_NOT_QUEUE_BLOCKED, "Can not queue at this time: blocking transaction in queue."), + MAKE_ERROR(telCAN_NOT_QUEUE_FEE, "Can not queue at this time: fee insufficient to replace queued transaction."), + MAKE_ERROR(telCAN_NOT_QUEUE_FULL, "Can not queue at this time: queue is full."), - {tesSUCCESS, - {"tesSUCCESS", - "The transaction was applied. Only final in a validated ledger."}}, + MAKE_ERROR(temMALFORMED, "Malformed transaction."), + MAKE_ERROR(temBAD_AMOUNT, "Can only send positive amounts."), + MAKE_ERROR(temBAD_CURRENCY, "Malformed: Bad currency."), + MAKE_ERROR(temBAD_EXPIRATION, "Malformed: Bad expiration."), + MAKE_ERROR(temBAD_FEE, "Invalid fee, negative or not XRP."), + MAKE_ERROR(temBAD_ISSUER, "Malformed: Bad issuer."), + MAKE_ERROR(temBAD_LIMIT, "Limits must be non-negative."), + MAKE_ERROR(temBAD_OFFER, "Malformed: Bad offer."), + MAKE_ERROR(temBAD_PATH, "Malformed: Bad path."), + MAKE_ERROR(temBAD_PATH_LOOP, "Malformed: Loop in path."), + MAKE_ERROR(temBAD_QUORUM, "Malformed: Quorum is unreachable."), + MAKE_ERROR(temBAD_REGKEY, "Malformed: Regular key cannot be same as master key."), + MAKE_ERROR(temBAD_SEND_XRP_LIMIT, "Malformed: Limit quality is not allowed for XRP to XRP."), + MAKE_ERROR(temBAD_SEND_XRP_MAX, "Malformed: Send max is not allowed for XRP to XRP."), + MAKE_ERROR(temBAD_SEND_XRP_NO_DIRECT, "Malformed: No Ripple direct is not allowed for XRP to XRP."), + MAKE_ERROR(temBAD_SEND_XRP_PARTIAL, "Malformed: Partial payment is not allowed for XRP to XRP."), + MAKE_ERROR(temBAD_SEND_XRP_PATHS, "Malformed: Paths are not allowed for XRP to XRP."), + MAKE_ERROR(temBAD_SEQUENCE, "Malformed: Sequence is not in the past."), + MAKE_ERROR(temBAD_SIGNATURE, "Malformed: Bad signature."), + MAKE_ERROR(temBAD_SIGNER, "Malformed: No signer may duplicate account or other signers."), + MAKE_ERROR(temBAD_SRC_ACCOUNT, "Malformed: Bad source account."), + MAKE_ERROR(temBAD_TRANSFER_RATE, "Malformed: Transfer rate must be >= 1.0 and <= 2.0"), + MAKE_ERROR(temBAD_WEIGHT, "Malformed: Weight must be a positive value."), + MAKE_ERROR(temDST_IS_SRC, "Destination may not be source."), + MAKE_ERROR(temDST_NEEDED, "Destination not specified."), + MAKE_ERROR(temINVALID, "The transaction is ill-formed."), + MAKE_ERROR(temINVALID_FLAG, "The transaction has an invalid flag."), + MAKE_ERROR(temREDUNDANT, "Sends same currency to self."), + MAKE_ERROR(temRIPPLE_EMPTY, "PathSet with no paths."), + MAKE_ERROR(temUNCERTAIN, "In process of determining result. Never returned."), + MAKE_ERROR(temUNKNOWN, "The transaction requires logic that is not implemented yet."), + MAKE_ERROR(temDISABLED, "The transaction requires logic that is currently disabled."), + MAKE_ERROR(temBAD_TICK_SIZE, "Malformed: Tick size out of range."), + MAKE_ERROR(temINVALID_ACCOUNT_ID, "Malformed: A field contains an invalid account ID."), + MAKE_ERROR(temCANNOT_PREAUTH_SELF, "Malformed: An account may not preauthorize itself."), + + MAKE_ERROR(terRETRY, "Retry transaction."), + MAKE_ERROR(terFUNDS_SPENT, "DEPRECATED."), + MAKE_ERROR(terINSUF_FEE_B, "Account balance can't pay fee."), + MAKE_ERROR(terLAST, "DEPRECATED."), + MAKE_ERROR(terNO_RIPPLE, "Path does not permit rippling."), + MAKE_ERROR(terNO_ACCOUNT, "The source account does not exist."), + MAKE_ERROR(terNO_AUTH, "Not authorized to hold IOUs."), + MAKE_ERROR(terNO_LINE, "No such line."), + MAKE_ERROR(terPRE_SEQ, "Missing/inapplicable prior transaction."), + MAKE_ERROR(terOWNERS, "Non-zero owner count."), + MAKE_ERROR(terQUEUED, "Held until escalated fee drops."), + + MAKE_ERROR(tesSUCCESS, "The transaction was applied. Only final in a validated ledger."), }; + // clang-format on + +#undef MAKE_ERROR + return results; }