# NFTokenAcceptOffer

NFTokenAcceptOffer 트랜잭션은 NFT 토큰을 구매 또는 판매하겠다는 제안을 수락하는 데 사용됩니다. 둘 다 가능합니다:

* 하나의 제안을 수락하도록 허용합니다. 이를 다이렉트 모드라고 합니다.
* 특정 NFT 토큰을 매수하는 제안과 동일한 NFT 토큰을 매도하는 제안, 두 개의 다른 제안을 원자 방식으로 수락하도록 허용합니다. 이를 중개 모드라고 합니다.

_(NonFungibleTokenV1\_1 수정안에 의해 추가되었습니다.)_

## NFTokenAcceptOffer JSON 예시

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

## 중개 모드와 직접 모드

트랜잭션이 작동하는 모드는 트랜잭션의 NFTokenSellOffer 및 NFTokenBuyOffer 필드의 존재 여부에 따라 달라집니다:

| `NFTokenSellOffer` | `NFTokenBuyOffer` | 방법 |
| ------------------ | ----------------- | -- |
| ✔️                 | ✔️                | 중개 |
| ✔️                 | ❌                 | 직접 |
| ❌                  | ✔️                | 직접 |

두 필드 중 어느 것도 지정되지 않으면 트랜잭션이 잘못되어 임시 클래스 에러를 생성합니다.

브로커 모드의 의미는 직접 모드와 약간 다릅니다. 트랜잭션을 전송하는 계정이 브로커 역할을 하여 두 제안을 한데 모아 매칭시키지만, 관련된 NFToken의 소유권을 획득하지는 않습니다. 트랜잭션이 성공하면 NFT 토큰이 판매자에게서 구매자에게 직접 전송됩니다.

## 실행 세부 정보

트랜잭션이 성공하면:

* NFT 토큰의 소유권이 변경되며, 기존 소유자의 NFT 토큰 페이지에서 토큰이 제거되고 새 소유자의 NFT 토큰 페이지에 추가됩니다.
* 자금은 NFT 토큰 제안에 명시된 대로 구매자로부터 판매자에게 이체됩니다. NFT 토큰에 전송 수수료가 있는 경우, 발행자는 지정된 비율을 받고 나머지는 판매자에게 전달됩니다.

다음과 같은 경우 트랜잭션은 기술 클래스 코드로 실패합니다:

* 구매자가 이미 NFToken을 소유한 경우.
* 판매자가 NFT 토큰의 현재 소유자가 아닌 경우.
* 트랜잭션의 제안 중 하나 또는 두 개가 이미 만료되었습니다.
* 판매 제안에 특정 대상 계정이 지정되어 있는데 트랜잭션 발신자가 해당 계정이 아닌 경우.
* 이 트랜잭션의 발신자가 매수 또는 매도 제안을 소유하고 있습니다.

## 필드

## NFTokenAcceptOffer 필드

일반적인 필드 외에도 NFTokenAcceptOffer 트랜잭션은 다음 필드를 사용합니다:

| 필드                 | JSON 유형                                                                     | [내부 유형](https://xrpl.org/serialization.html) | 설명                                                                                                                                                                                    |
| ------------------ | --------------------------------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `NFTokenSellOffer` | 문자열                                                                         | 해시256                                        | (선택 사항) NFToken을 판매하겠다고 제안하는 NFTokenOffer를 식별합니다.                                                                                                                                     |
| `NFTokenBuyOffer`  | 문자열                                                                         | 해시256                                        | (선택 사항) NFToken 구매를 제안하는 NFTokenOffer를 식별합니다.                                                                                                                                         |
| `NFTokenBrokerFee` | [화폐 금액](https://xrpl.org/basic-data-types.html#specifying-currency-amounts) | 금액                                           | (선택 사항) 이 필드는 중개 모드에서만 유효하며, 중개자가 두 오퍼를 합치기 위해 수수료의 일부로 보관하는 금액을 지정하고 나머지 금액은 구매 중인 NFToken의 판매자에게 전송됩니다. 지정된 경우, 수수료는 전송 수수료를 적용하기 전에 판매자가 받게 되는 금액이 판매 오퍼에 표시된 금액 이상이 되도록 설정해야 합니다. |

직접 모드에서는 NFTokenSellOffer 또는 NFTokenBuyOffer 필드를 지정해야 합니다. 중개 모드에서는 두 필드를 모두 지정해야 합니다.

이 기능은 NFT 토큰 소유자가 제3자 중개인에게 토큰을 판매할 수 있도록 하기 위한 것으로, 중개인은 NFT 토큰이나 커스터디 펀드를 소유하지 않고도 더 높은 금액에 NFT 토큰 판매를 시도할 수 있습니다.

두 제안이 동일한 자산에 대한 것이라면 자금이 이체되는 순서에 따라 자금 부족으로 인해 성공할 수 있는 트랜잭션이 실패할 수 있습니다. 확정적인 트랜잭션 체결을 보장하고 성공적인 체결 가능성을 극대화하기 위해 NFT 토큰을 구매하려는 계좌에서 먼저 인출됩니다. 브로커의 자금이 판매자에게 입금되기 전에 먼저 입금됩니다.

중개 모드에서 NFTokenBuyOffer와 NFTokenSellOffer가 참조하는 제안은 모두 동일한 NFTokenID를 지정해야 합니다. 즉, 둘 다 동일한 NFToken에 대한 것이어야 합니다.

## 에러 사례

모든 트랜잭션에서 발생할 수 있는 오류 외에도 NFTokenAcceptOffer 트랜잭션은 다음과 같은 트랜잭션 결과 코드를 발생시킬 수 있습니다:

| 에러 코드                              | 설명                                                                                                                             |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `temDISABLED`                      | NonFungibleTokensV1 수정안이 활성화되지 않았습니다.                                                                                          |
| `temMALFORMED`                     | 트랜잭션의 형식이 올바르지 않습니다. 예를 들어, NFTokenSellOffer 또는 NFTokenBuyOffer를 지정하지 않았거나 음수 NFTokenBrokerFee를 지정했습니다.                        |
| `tecCANT_ACCEPT_OWN_NFTOKEN_OFFER` | 구매자와 판매자는 같은 계정입니다.                                                                                                            |
| `tecEXPIRED`                       | 트랜잭션에 지정된 오퍼가 이미 만료되었습니다.                                                                                                      |
| `tecINSUFFICIENT_FUNDS`            | 구매자는 제안하는 전체 금액이 없습니다. 구매 금액이 XRP에 지정되어 있으면 준비금 요구 사항 때문일 수 있습니다 . 구매 금액이 토큰인 경우 토큰이 동결되었기 때문일 수 있습니다.                         |
| `tecINSUFFICIENT_PAYMENT`          | 중개 모드에서 제공되는 매수 금액은 브로커 수수료와 NFToken의 매도 비용을 지불할 만큼 충분히 높지 않습니다.                                                               |
| `tecOBJECT_NOT_FOUND`              | 트랜잭션에 지정된 오퍼 중 하나가 원장에 존재하지 않습니다.                                                                                              |
| `tecNFTOKEN_BUY_SELL_MISMATCH`     | 중개 모드에서 두 제안은 유효한 일치가 아닙니다. 예를 들어, 판매자가 구매자가 제공하는 것보다 더 많은 것을 요구하거나, 구매 및 판매 제안이 다른 자산으로 표시되거나, 판매자가 구매자나 중개인이 아닌 목적지를 지정했습니다. |
| `tecNFTOKEN_OFFER_TYPE_MISMATCH`   | NFTokenBuyOffer로 식별되는 객체가 실제로는 매수 오퍼가 아니거나, NFTokenSellOffer로 식별되는 객체가 실제로는 매도 오퍼가 아닌 경우입니다.                                   |
| `tecNO_PERMISSION`                 | 판매자가 판매되는 NFToken을 소유하지 않거나, 일치하는 오퍼가 오퍼를 수락하는 계정과 다른 대상 계정을 지정합니다.                                                            |
