# NFTokenAcceptOffer

[[ソース]](https://github.com/XRPLF/rippled/blob/master/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp)

`NFTokenAcceptOffer`トランザクションは`NFToken`の購入または売却のオファーを受け入れるために使用されます。トランザクションは次のいずれかになります。

* 1つのオファーを受け入れます。これは *ダイレクト* モードと呼ばれます。
* 2つの異なるオファー(`NFToken`の購入オファーと同じ`NFToken`に対するの売却オファー)をアトミックに受け入れます。これは *ブローカー* モードと呼ばれます。


NonFungibleTokensV1_1
## NFTokenAcceptOffer JSONの例


```json
{
  "Account": "r9spUPhPBfB6kQeF6vPhwmtFwRhBh2JUCG",
  "Fee": "12",
  "LastLedgerSequence": 75447550,
  "Memos": [
    {
      "Memo": {
        "MemoData": "61356534373538372D633134322D346663382D616466362D393666383562356435386437"
      }
    }
  ],
  "NFTokenSellOffer": "68CD1F6F906494EA08C9CB5CAFA64DFA90D4E834B7151899B73231DE5A0C3B77",
  "Sequence": 68549302,
  "TransactionType": "NFTokenAcceptOffer"
}
```

## ブローカー vs. ダイレクト モード

トランザクションが動作するモードは、トランザクションの`NFTokenSellOffer`フィールドと`NFTokenBuyOffer`フィールドの存在によって決まります。

| `NFTokenSellOffer` | `NFTokenBuyOffer` | Mode |
|  --- | --- | --- |
| ✔️ | ✔️ | ブローカー |
| ✔️ | X | ダイレクト |
| X | ✔️ | ダイレクト |


もしこれらのフィールドがどちらも指定されていない場合、トランザクションは不正で、`tem`クラスのエラーを発生させます。

ブローカーモードの意味合いは、ダイレクト・モードのそれとは若干異なります。トランザクションを送信するアカウントはブローカーとして機能し、2つのオファーをまとめてマッチングさせますが、関係する`NFToken`の所有権を取得することはなく、トランザクションが成功すれば、販売者から購入者に直接転送されます。

## 実行内容

トランザクションが成功した場合

* 既存の`owner`の`NFTokenPage`からトークンが削除され、新しい`owner`の`NFTokenPage`に追加されます。
* `NFTokenOffer`で指定された通り、購入者から販売者に資金が移動します。対応する`NFToken`のオファーに`TransferFee`が指定されている場合、`issuer`は指定されたパーセンテージを受け取り、残りは`NFToken`の販売者に送られます。


以下の場合、トランザクションは[`tec`コード](/ja/docs/references/protocol/transactions/transaction-results/tec-codes)で失敗します。

- 購入者が既に`NFToken`を所有している。
- 販売者が現在`NFToken`の所有者でない。
- 取引のオファーの一方または両方の期限が失効している。
- 売却オファーが特定の宛先アカウントを指定しており、トランザクションの送信者がそのアカウントでない。
- トランザクションの送信者が購入または売却のオファーを所有している。


## フィールド

##  フィールド

[共通フィールド](/ja/docs/references/protocol/transactions/common-fields)に加えて、トランザクションは以下のフィールドを使用します。

| フィールド | JSONの型 | [内部の型](/ja/docs/references/protocol/binary-format) | 説明 |
|  --- | --- | --- | --- |
| `NFTokenSellOffer` | 文字列 | UInt256 | *(省略可)* `NFToken`の売却を提案する`NFTokenOffer`の識別情報です。 |
| `NFTokenBuyOffer` | 文字列 | UInt256 | *(省略可)* `NFToken`の購入を提案する`NFTokenOffer`の識別情報です。 |
| `NFTokenBrokerFee` | [通貨額](/ja/docs/references/protocol/data-types/basic-data-types#%E9%80%9A%E8%B2%A8%E9%A1%8D%E3%81%AE%E6%8C%87%E5%AE%9A) | Amount | *(省略可)* このフィールドはブローカーモードでのみ有効であり、2つのオファーをまとめるための手数料としてブローカーが保持する金額を指定します。残りの金額は`NFToken`の販売者に送られます。指定する場合、発行者が課す送金手数料を考慮する前に、販売者が受け取る金額が少なくとも売却オファーで示された金額になるように手数料を設定しなければなりません。 |


ダイレクトモードでは、`NFTokenSellOffer`または`NFTokenBuyOffer`フィールドの**いずれか**を指定する必要があります。ブローカーモードでは、**両方**のフィールドを指定する必要があります。

この機能は、`NFToken`の所有者が第三者のブローカーにトークンの売却を提案し、ブローカーが`NFToken`を所有したり資金を預けることなく、より高額で`NFToken`を売却することを可能にするものです。

両方のオファーが同じ資産に対するものである場合、資金が転送される順序によって、本来成功するはずの取引が、資金不足のために失敗する可能性があります。決定論的なトランザクション実行を保証し、成功の可能性を最大化するために、`NFToken`を購入しようとするアカウントから先に資金が引き落とされます。ブローカーに支払われる資金は、販売者に入金される前に入金されます。

ブローカーモードでは、`NFTokenBuyOffer`と`NFTokenSellOffer`の両方が同じ`NFTokenID`を指定する必要があります。

## エラーケース

すべてのトランザクションで発生する可能性のあるエラーに加えて、トランザクションでは、次の[トランザクション結果コード](/ja/docs/references/protocol/transactions/transaction-results)が発生する可能性があります。

| エラーコード | 説明 |
|  --- | --- |
| `temDISABLED` | [NonFungibleTokensV1 Amendment](/ja/resources/known-amendments#nonfungibletokensv1)は有効ではありません。 |
| `temMALFORMED` | トランザクションのフォーマットが正しくありません。たとえば、`NFTokenSellOffer`と`NFTokenBuyOffer`のどちらも指定されていないか、`NFTokenBrokerFee`に負の値が指定されています。 |
| `tecCANT_ACCEPT_OWN_NFTOKEN_OFFER` | 購入者と販売者が同じアカウントになっています。 |
| `tecEXPIRED` | トランザクションで指定されたオファーの有効期限が既に切れています。 |
| `tecINSUFFICIENT_FUNDS` | 購入者が申し出た金額を全額持っていない。購入額がXRPで指定されている場合、[所有者準備金](/ja/docs/concepts/accounts/reserves)が原因である可能性があります。購入額がトークンである場合、トークンが[フリーズ](/ja/docs/concepts/tokens/fungible-tokens/freezes) されていることが原因と考えられます。 |
| `tecINSUFFICIENT_PAYMENT` | ブローカーモードにおいて、提示された購入額は、`BrokerFee` *および* `NFToken`の売却コストを支払うには十分な額ではありません。 |
| `tecOBJECT_NOT_FOUND` | トランザクションで指定されたオファーがレジャーに存在しません。 |
| `tecNFTOKEN_BUY_SELL_MISMATCH` | ブローカーモードにおいて、2つのオファーが有効なマッチングではありません。例えば、販売者が購入者の提示額よりも高い金額を提示している、購入と売却のオファーが異なる通貨で提示されている、販売者が購入者や ブローカーとは異なる販売先を指定している、などです。 |
| `tecNFTOKEN_OFFER_TYPE_MISMATCH` | `NFTokenBuyOffer`で識別されるオブジェクトが実際には購入オファーでない、または`NFTokenSellOffer`で識別されるオブジェクトが実際には売却オファーでない場合です。 |
| `tecNO_PERMISSION` | 販売者が売却する`NFToken`を所有していません。または、マッチングオファーが、オファーを受け入れるアカウントとは異なる`Destination`アカウントを指定しています。 |