Last updated
Edit

OfferCreate

[Source]

An OfferCreate transaction places an Offer in the decentralized exchange.

Example OfferCreate JSON

{
    "TransactionType": "OfferCreate",
    "Account": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX",
    "Fee": "12",
    "Flags": 0,
    "LastLedgerSequence": 7108682,
    "Sequence": 8,
    "TakerGets": "6000000",
    "TakerPays": {
      "currency": "GKO",
      "issuer": "ruazs5h1qEsqpke88pcqnaseXdm6od2xc",
      "value": "2"
    }
}
Query example transaction

OfferCreate Fields

In addition to the common fields, OfferCreate transactions use the following fields:

FieldJSON TypeInternal TypeRequired?Description
DomainIDString - HashHash256NoThe ledger entry ID of a permissioned domain. If provided, restrict this offer to the permissioned DEX of that domain. (Requires the PermissionedDEX amendment )
ExpirationNumberUInt32NoTime after which the Offer is no longer active, in seconds since the Ripple Epoch.
OfferSequenceNumberUInt32NoAn Offer to delete first, specified in the same way as OfferCancel.
TakerGetsCurrency AmountAmountYesThe amount and type of currency being sold.
TakerPaysCurrency AmountAmountYesThe amount and type of currency being bought.

OfferCreate Flags

Transactions of the OfferCreate type support additional values in the Flags field, as follows:

Flag NameHex ValueDecimal ValueDescription
tfPassive0x0001000065536Do not consume offers that exactly match this one, only offers that cross it. This makes it possible to set up offers in the ledger that peg the exchange rate at a specific value.
tfImmediateOrCancel0x00020000131072Treat the offer as an Immediate or Cancel order and do not place an Offer entry into the order books. The transaction trades as much as it can by consuming existing offers when it's processed.
tfFillOrKill0x00040000262144Treat the offer as a Fill or Kill order, do not place an Offer entry into the order books, and cancel the offer if it cannot be fully filled at the time of execution. By default, this means that the owner must receive the full TakerPays amount; if the tfSell flag is enabled, the owner must be able to spend the entire TakerGets amount instead.
tfSell0x00080000524288Exchange the entire TakerGets amount, even if it means obtaining more than the TakerPays amount in exchange.
tfHybrid0x001000001048576Make this a hybrid offer that can use both a permissioned DEX and the open DEX. The DomainID field must be provided when using this flag.

Error Cases

Error CodeDescription
tecDIR_FULLThe owner owns too many items in the ledger, or the order book contains too many Offers at the same exchange rate already.
tecEXPIREDThe transaction specifies an Expiration time that has already passed.
tecFROZENThe transaction involves a token on a frozen trust line (including local and global freezes). The TakerPays (buy amount) token has been deep-frozen by the issuer.
tecINSUF_RESERVE_OFFERThe owner does not have enough XRP to meet the reserve requirement of adding a new offer ledger entry, and the transaction did not convert any currency. (If the transaction successfully traded any amount, the transaction succeeds with the result code tesSUCCESS, but does not create an offer ledger entry for the remainder.)
tecKILLEDThe transaction specifies tfFillOrKill, and the full amount cannot be filled. If the ImmediateOfferKilled amendment is enabled, this result code also occurs when the transaction specifies tfImmediateOrCancel and executes without moving funds (previously, an Immediate or Cancel offer would return tesSUCCESS even if no funds were moved).
tecNO_AUTHThe transaction involves a token whose issuer uses Authorized Trust Lines and the the trust line that would receive the tokens exists but has not been authorized.
tecNO_ISSUERThe transaction specifies a token whose issuer value is not a funded account in the ledger.
tecNO_LINEThe transaction involves a token whose issuer uses Authorized Trust Lines and the necessary trust line does not exist.
tecNO_PERMISSIONThe transaction uses a DomainID but the sender is not a member of that domain. (Requires the PermissionedDEX amendment )
tecUNFUNDED_OFFERThe owner does not hold a positive amount of the TakerGets currency. (Exception: if TakerGets specifies a token that the owner issues, the transaction can succeed.)
temBAD_CURRENCYThe transaction specifies a fungible token incorrectly, such as a fungible token with the currency code "XRP".
temBAD_EXPIRATIONThe transaction contains an Expiration field that is not validly formatted.
temBAD_ISSUERThe transaction specifies a token with an invalid issuer value.
temBAD_OFFERThe offer tries to trade XRP for XRP, or tries to trade an invalid or negative amount of a token.
temBAD_SEQUENCEThe transaction contains an OfferSequence that is not validly formatted, or is higher than the transaction's own Sequence number.
temINVALID_FLAGThe transaction specifies an invalid flag combination, such as both tfImmediateOrCancel and tfFillOrKill, or the transaction uses tfHybrid but omits the DomainID field.
temREDUNDANTThe transaction would trade a token for the same token (same issuer and currency code).