# tec Codes [[Source]](https://github.com/XRPLF/rippled/blob/master/src/libxrpl/protocol/TER.cpp) These codes indicate that the transaction did not succeed, but it was applied to a ledger to apply the [transaction cost](/es-es/docs/concepts/transactions/transaction-cost) and may have had other side effects to the ledger. The `tec` codes have numerical values in the range 100 to 199. It is recommended to use the text code, not the numeric value. A transaction that fails with a `tec` code destroys the XRP paid as a [transaction cost](/es-es/docs/concepts/transactions/transaction-cost) and consumes a [sequence number](/es-es/docs/references/protocol/data-types/basic-data-types#account-sequence). Although the transaction did not succeed, it may also cause some bookkeeping or cleanup work to be done. For example, a transaction that results in `tecOVERSIZE` still removes some [unfunded offers](/es-es/docs/concepts/tokens/decentralized-exchange/offers#lifecycle-of-an-offer). Always look at the [transaction metadata](/es-es/docs/references/protocol/transactions/metadata) to see precisely what a transaction did. A transaction that provisionally failed with a `tec` code may still succeed or fail with a different code after being reapplied. The result is final when it appears in a validated ledger version. For more information, see [Finality of Results](/es-es/docs/concepts/transactions/finality-of-results) and [Reliable Transaction Submission](/es-es/docs/concepts/transactions/reliable-transaction-submission). | Code | Value | Explanation | | --- | --- | --- | | `tecAMM_ACCOUNT` | 168 | The transaction failed because the operation is not allowed on Automated Market Maker (AMM) accounts. | | `tecAMM_UNFUNDED` | 162 | The [AMMCreate transaction](/docs/references/protocol/transactions/types/ammcreate) failed because the sender does not have enough of the specified assets to fund it. | | `tecAMM_BALANCE` | 163 | The [AMMDeposit](/docs/references/protocol/transactions/types/ammdeposit) or [AMMWithdraw](/docs/references/protocol/transactions/types/ammwithdraw) transaction failed because either the AMM or the user does not hold enough of one of the specified assets. (For example, you tried to withdraw more than the AMM holds.) | | `tecAMM_EMPTY` | 166 | The AMM-related transaction failed because the AMM has no assets in its pool. In this state, you can only delete the AMM or fund it with a new deposit. | | `tecAMM_FAILED` | 164 | The AMM-related transaction failed. For [AMMDeposit](/docs/references/protocol/transactions/types/ammdeposit) or [AMMWithdraw](/docs/references/protocol/transactions/types/ammwithdraw) this could be because the sender does not have enough of the specified assets, or the transaction requested an effective price that isn't possible with the available amounts. For [AMMBid](/docs/references/protocol/transactions/types/ammbid) this could be because the account does not have enough to win the bid or needs more than their specified maximum bid. For [AMMVote](/docs/references/protocol/transactions/types/ammvote), this could be because there are already too many votes from other accounts that hold more of this AMM's LP Tokens. | | `tecAMM_INVALID_TOKENS` | 165 | The AMM-related transaction failed due to insufficient LP Tokens or problems with rounding; for example, depositing a very small amount of assets could fail if the amount of LP Tokens to be returned rounds down to zero. | | `tecAMM_NOT_EMPTY` | 167 | The transaction was meant to operate on an AMM with empty asset pools, but the specified AMM currently holds assets. | | `tecCANT_ACCEPT_OWN_NFTOKEN_OFFER` | 157 | The transaction tried to accept an offer that was placed by the same account to buy or sell a [non-fungible token](/es-es/docs/concepts/tokens/nfts). | | `tecCLAIM` | 100 | Unspecified failure, with transaction cost destroyed. | | `tecCRYPTOCONDITION_ERROR` | 146 | This [EscrowCreate](/docs/references/protocol/transactions/types/escrowcreate) or [EscrowFinish](/docs/references/protocol/transactions/types/escrowfinish) transaction contained a malformed or mismatched crypto-condition. | | `tecDIR_FULL` | 121 | The transaction tried to add an object (such as a trust line, Check, Escrow, or Payment Channel) to an account's owner directory, but that account cannot own any more objects in the ledger. | | `tecDUPLICATE` | 149 | The transaction tried to create an object (such as a [DepositPreauth](/docs/references/protocol/transactions/types/depositpreauth) authorization) that already exists. | | `tecDST_TAG_NEEDED` | 143 | The [Payment transaction](/docs/references/protocol/transactions/types/payment) omitted a [destination tag](/es-es/docs/concepts/transactions/source-and-destination-tags), but the destination account has the `lsfRequireDestTag` flag enabled. | | `tecEMPTY_DID` | 187 | The transaction tried to create a [DID entry](/docs/references/protocol/ledger-data/ledger-entry-types/did) with no contents. A DID must not be empty. | | `tecEXPIRED` | 148 | The transaction tried to create an object (such as an Offer or a Check) whose provided Expiration time has already passed. | | `tecFAILED_PROCESSING` | 105 | An unspecified error occurred when processing the transaction. | | `tecFROZEN` | 137 | The [OfferCreate transaction](/docs/references/protocol/transactions/types/offercreate) failed because one or both of the assets involved are subject to a [global freeze](/es-es/docs/concepts/tokens/fungible-tokens/freezes). | | `tecHAS_OBLIGATIONS` | 151 | The [AccountDelete transaction](/docs/references/protocol/transactions/types/accountdelete) failed because the account to be deleted owns objects that cannot be deleted. See [Deleting Accounts](/es-es/docs/concepts/accounts/deleting-accounts) for details. | | `tecINSUF_RESERVE_LINE` | 122 | The transaction failed because the sending account does not have enough XRP to create a new trust line. (See: [Reserves](/es-es/docs/concepts/accounts/reserves)) This error occurs when the counterparty already has a trust line in a non-default state to the sending account for the same currency. (See `tecNO_LINE_INSUF_RESERVE` for the other case.) | | `tecINSUF_RESERVE_OFFER` | 123 | The transaction failed because the sending account does not have enough XRP to create a new Offer. (See: [Reserves](/es-es/docs/concepts/accounts/reserves)) | | `tecINSUFF_FEE` | 136 | The transaction failed because the sending account does not have enough XRP to pay the [transaction cost](/es-es/docs/concepts/transactions/transaction-cost) that it specified. (In this case, the transaction processing destroys all of the sender's XRP even though that amount is lower than the specified transaction cost.) This result only occurs if the account's balance decreases *after* this transaction has been distributed to enough of the network to be included in a consensus set. Otherwise, the transaction fails with [`terINSUF_FEE_B`](/es-es/docs/references/protocol/transactions/transaction-results/ter-codes) before being distributed. | | `tecINSUFFICIENT_FUNDS` | 158 | One of the accounts involved does not hold enough of a necessary asset. | | `tecINSUFFICIENT_PAYMENT` | 161 | The amount specified is not enough to pay all fees involved in the transaction. For example, when trading a non-fungible token, the buy amount may not be enough to pay both the broker fee and the sell amount. | | `tecINSUFFICIENT_RESERVE` | 141 | The transaction would increase the [reserve requirement](/es-es/docs/concepts/accounts/reserves) higher than the sending account's balance. [SignerListSet](/docs/references/protocol/transactions/types/signerlistset), [PaymentChannelCreate](/docs/references/protocol/transactions/types/paymentchannelcreate), [PaymentChannelFund](/docs/references/protocol/transactions/types/paymentchannelfund), and [EscrowCreate](/docs/references/protocol/transactions/types/escrowcreate) can return this error code. See [Signer Lists and Reserves](/es-es/docs/references/protocol/ledger-data/ledger-entry-types/signerlist#signer-lists-and-reserves) for more information. | | `tecINTERNAL` | 144 | Unspecified internal error, with transaction cost applied. This error code should not normally be returned. If you can reproduce this error, please [report an issue](https://github.com/XRPLF/rippled/issues). | | `tecINVALID_UPDATE_TIME` | 188 | The [OracleSet transaction](/docs/references/protocol/transactions/types/oracleset) failed because the `LastUpdateTime` is invalid. This can occur when the time is more than 300 seconds before or after the ledger close time, or when updating an existing oracle, the new `LastUpdateTime` is not greater than the previous value. | | `tecINVARIANT_FAILED` | 147 | An invariant check failed when trying to execute this transaction. If you can reproduce this error, please [report an issue](https://github.com/XRPLF/rippled/issues). | | `tecKILLED` | 150 | The [OfferCreate transaction](/docs/references/protocol/transactions/types/offercreate) specified the `tfFillOrKill` flag and could not be filled, so it was killed. | | `tecMAX_SEQUENCE_REACHED` | 153 | A sequence number field is already at its maximum. This includes the `MintedNFTokens` field. | | `tecNEED_MASTER_KEY` | 142 | This transaction tried to cause changes that require the master key, such as [disabling the master key or giving up the ability to freeze balances](/es-es/docs/references/protocol/transactions/types/accountset#accountset-flags). | | `tecNFTOKEN_BUY_SELL_MISMATCH` | 155 | The [NFTokenAcceptOffer transaction](/docs/references/protocol/transactions/types/nftokenacceptoffer) attempted to match incompatible offers to buy and sell a non-fungible token. | | `tecNFTOKEN_OFFER_TYPE_MISMATCH` | 156 | One or more of the offers specified in the transaction was not the right type of offer. (For example, a buy offer was specified in the `NFTokenSellOffer` field.) | | `tecNO_ALTERNATIVE_KEY` | 130 | The transaction tried to remove the only available method of [authorizing transactions](/es-es/docs/concepts/transactions#authorizing-transactions). This could be a [SetRegularKey transaction](/docs/references/protocol/transactions/types/setregularkey) to remove the regular key, a [SignerListSet transaction](/docs/references/protocol/transactions/types/signerlistset) to delete a SignerList, or an [AccountSet transaction](/docs/references/protocol/transactions/types/accountset) to disable the master key. (Prior to `rippled` 0.30.0, this was called `tecMASTER_DISABLED`.) | | `tecNO_AUTH` | 134 | The transaction failed because it needs to add a balance on a trust line to an account with the `lsfRequireAuth` flag enabled, and that trust line has not been authorized. If the trust line does not exist at all, `tecNO_LINE` occurs instead. | | `tecNO_DST` | 124 | The account on the receiving end of the transaction does not exist. This includes Payment and TrustSet transaction types. (It could be created if it received enough XRP.) | | `tecNO_DST_INSUF_XRP` | 125 | The account on the receiving end of the transaction does not exist, and the transaction is not sending enough XRP to create it. | | `tecNO_ENTRY` | 140 | The transaction tried to modify a [ledger object](/es-es/docs/references/protocol/ledger-data/ledger-entry-types), such as a [Check](/es-es/docs/concepts/payment-types/checks), [Payment Channel](/es-es/docs/concepts/payment-types/payment-channels), or [Deposit Preauthorization](/es-es/docs/references/protocol/ledger-data/ledger-entry-types/depositpreauth), but the specified object does not exist. It may have already been deleted by a previous transaction or the transaction may have an incorrect value in an ID field such as `CheckID`, `Channel`, `Unauthorize`. | | `tecNO_ISSUER` | 133 | The account specified in the `issuer` field of a currency amount does not exist. | | `tecNO_LINE` | 135 | The `TakerPays` field of the [OfferCreate transaction](/docs/references/protocol/transactions/types/offercreate) specifies an asset whose issuer has `lsfRequireAuth` enabled, and the account making the offer does not have a trust line for that asset. (Normally, making an offer implicitly creates a trust line if necessary, but in this case it does not bother because you cannot hold the asset without authorization.) If the trust line exists, but is not authorized, `tecNO_AUTH` occurs instead. | | `tecNO_LINE_INSUF_RESERVE` | 126 | The transaction failed because the sending account does not have enough XRP to create a new trust line. (See: [Reserves](/es-es/docs/concepts/accounts/reserves)) This error occurs when the counterparty does not have a trust line to this account for the same currency. (See `tecINSUF_RESERVE_LINE` for the other case.) | | `tecNO_LINE_REDUNDANT` | 127 | The transaction failed because it tried to set a trust line to its default state, but the trust line did not exist. | | `tecNO_PERMISSION` | 139 | The sender does not have permission to do this operation. For example, the [EscrowFinish transaction](/docs/references/protocol/transactions/types/escrowfinish) tried to release a held payment before its `FinishAfter` time, someone tried to use [PaymentChannelFund](/docs/references/protocol/transactions/types/paymentchannelfund) on a channel the sender does not own, or a [Payment](/docs/references/protocol/transactions/types/payment) tried to deliver funds to an account with the "DepositAuth" flag enabled. | | `tecNO_REGULAR_KEY` | 131 | The [AccountSet transaction](/docs/references/protocol/transactions/types/accountset) tried to disable the master key, but the account does not have another way to [authorize transactions](/es-es/docs/concepts/transactions#authorizing-transactions). If [multi-signing](/es-es/docs/concepts/accounts/multi-signing) is enabled, this code is deprecated and `tecNO_ALTERNATIVE_KEY` is used instead. | | `tecNO_SUITABLE_NFTOKEN_PAGE` | 154 | The transaction tried to mint or acquire a non-fungible token but the account receiving the `NFToken` does not have a directory page that can hold it. This situation is rare. | | `tecNO_TARGET` | 138 | The transaction referenced an Escrow or PayChannel ledger object that doesn't exist, either because it never existed or it has already been deleted. (For example, another [EscrowFinish transaction](/docs/references/protocol/transactions/types/escrowfinish) has already executed the held payment.) Alternatively, the destination account has `asfDisallowXRP` set so it cannot be the destination of this [PaymentChannelCreate](/docs/references/protocol/transactions/types/paymentchannelcreate) or [EscrowCreate](/docs/references/protocol/transactions/types/escrowcreate) transaction. | | `tecOBJECT_NOT_FOUND` | 160 | One of the objects specified by this transaction did not exist in the ledger. | | `tecOVERSIZE` | 145 | This transaction could not be processed, because the server created an excessively large amount of [metadata](/es-es/docs/references/protocol/transactions/metadata) when it tried to apply the transaction. | | `tecOWNERS` | 132 | The transaction cannot succeed because the sender already owns objects in the ledger. For example, an account cannot enable the [`lsfRequireAuth`](/es-es/docs/references/protocol/transactions/types/accountset#accountset-flags) flag if it has any trust lines or available offers. | | `tecPATH_DRY` | 128 | The transaction failed because the provided [paths](/es-es/docs/concepts/tokens/fungible-tokens/paths) did not have enough liquidity to send anything at all. This could mean that the source and destination accounts are not linked by [trust lines](/es-es/docs/concepts/tokens/fungible-tokens). | | `tecPATH_PARTIAL` | 101 | The transaction failed because the provided [paths](/es-es/docs/concepts/tokens/fungible-tokens/paths) did not have enough liquidity to send the full amount. | | `tecTOO_SOON` | 152 | The [AccountDelete transaction](/docs/references/protocol/transactions/types/accountdelete) failed because the account to be deleted had a `Sequence` number that is too high. The current ledger index must be at least 256 higher than the account's sequence number. | | `tecUNFUNDED` | 129 | The transaction failed because the account does not hold enough XRP to pay the amount in the transaction *and* satisfy the additional [reserve](/es-es/docs/concepts/accounts/reserves) necessary to execute this transaction. | | `tecUNFUNDED_ADD` | 102 | **DEPRECATED.** | | `tecUNFUNDED_PAYMENT` | 104 | The transaction failed because the sending account is trying to send more XRP than it holds, not counting the [reserve](/es-es/docs/concepts/accounts/reserves). | | `tecUNFUNDED_OFFER` | 103 | The [OfferCreate transaction](/docs/references/protocol/transactions/types/offercreate) failed because the account creating the offer does not have any of the `TakerGets` currency. |