> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Travel Rule 샌드박스 테스트 가이드

> Didit 테스트 VASP로 샌드박스에서 Travel Rule의 모든 결과를 끝까지 테스트하세요. 수락, 거부, 이름 불일치, 연결 불가, 시간 초과, 자체 보관 지갑을 다룹니다.

샌드박스 애플리케이션은 플랫폼에 내장된 테스트 VASP인 **Didit Test VASP** 한 곳과만 Travel Rule 데이터를 주고받습니다. 이 테스트 VASP는 실제 거래 상대방을 처리하는 것과 동일한 코드를 통해 사용자가 요청한 방식으로 각 전송에 응답하므로, 프로덕션 환경으로 전환하기 전에 교환의 모든 상태, 타임라인 항목 및 webhook을 확인할 수 있습니다.

샌드박스에서 전송하는 어떤 데이터도 Didit 외부로 나가지 않습니다. 네트워크, 이메일 수신자 또는 다른 Didit 고객에게 연락하지 않으며, 요금도 청구되지 않습니다.

## 시작하기 전에

1. **샌드박스** 애플리케이션의 API 키를 사용하십시오. 실서비스 애플리케이션은 테스트 VASP에 도달하지 않습니다.
2. 법적 명칭을 입력하여 Travel Rule을 켜십시오:

```bash theme={null}
curl -X PUT https://verification.didit.me/v3/travel-rule/settings/ \
  -H "x-api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"is_enabled": true, "legal_name": "Example CASP Sandbox"}'
```

3. 선택 사항으로 webhook 대상을 `travel_rule.status.updated`에 구독할 수 있습니다. 샌드박스는 `"environment": "sandbox"`로 표시하여 이 이벤트를 전송합니다.

## Didit Test VASP

`GET /v1/sandbox/scenarios/`는 테스트 VASP의 프로필과 `travel_rule` 객체 안의 모든 시나리오를 반환합니다. 따라서 테스트에서 트리거 값을 하드코딩하지 않고 이 응답에서 읽을 수 있습니다:

| 필드 | 값 |
| - | - |
| `legal_name` | `Didit Test VASP` |
| `lei` | `DIDITESTVASP00000001`, 형식은 올바르지만 등록되지 않음 |
| `jurisdiction` | `GB` |
| `compliance_email` | `didit.test` 하위 주소이며 발송되지 않음 |
| `travel_address` | `.test` 호스트 하위의 Travel Address이며 연결할 수 없음 |
| `network_codes` | 실제로 호출되지 않는 테스트 코드 |
| `default_scenario` | `accept` |
| `inbound_scenarios` | `["accept", "name_mismatch"]` |

모든 값은 테스트 데이터입니다. 테스트 VASP는 어떤 Travel Rule 네트워크의 구성원도 아니며, 샌드박스의 어떤 결과도 실제 거래 상대방이나 네트워크에 도달할 수 있음을 보여주지 않습니다.

## 발신 시나리오

교환이 필요한 샌드박스 애플리케이션의 모든 발신 `travelRule` 거래는 테스트 VASP로 보내집니다. 수취 지갑 주소(대소문자 구분 없음) 또는 수취인 이름을 `Didit Test VASP <suffix>` 형식으로 입력하여 결과를 선택합니다. 둘 다 설정하면 지갑이 우선합니다. 둘 다 없거나 표에 없는 접미사를 사용하면 전송은 완료됩니다(`accept`).

교환이 필요 없는 전송은 테스트 VASP에 도달하지 않습니다. 여기에는 `threshold_amount` 미만 금액의 전송, 사용자 본인의 인증된 지갑으로의 전송, 수취 지갑을 자체 보관 지갑으로 신고한 전송이 포함됩니다. 귀하 또는 최종 사용자가 디렉터리에서 직접 고른 거래 상대방 VASP는 실서비스 애플리케이션이 따르는 경로로 판단합니다. 항목에 경로(검증된 `TRP` 엔드포인트, 애플리케이션이 전송하는 네트워크, 컴플라이언스 연락처 중 하나)가 있으면 전송은 테스트 VASP로 보내집니다. 경로가 없으면 실서비스 애플리케이션에서와 마찬가지로 전송은 `COUNTERPARTY_VASP_NOT_FOUND`로 끝납니다.

| 시나리오 | 이름 접미사 | 지갑(ETH) | 종료 상태 |
| - | - | - | - |
| `accept` | 없음 | `0xc00c4cd93ff83953ce3347b33656d68ab8f35cfb` | `COMPLETED`, 이후 `payment_txn_id`를 보고하면 `FINISHED` |
| `decline` | `Decline` | `0x7694c5b0213859ef409107853a36ff7c85835f18` | `COUNTERPARTY_VASP_GENERAL_DECLINE` |
| `name_mismatch` | `Name Mismatch` | `0x501b7a0886e31f516aaf54fa99107d2377bd2d3e` | 이름 규칙에 따라 `COUNTERPARTY_MISMATCHED_DATA` (`NONE`이면 완료됨) |
| `not_reachable` | `Not Reachable` | `0xf0e986c1a1c3ae41629bf5cdcee0a67dd1eb0cce` | 실제 재시도 일정(30초, 이후 2분, 10분, 30분, 60분, 총 약 1시간 45분) 후 `COUNTERPARTY_VASP_NOT_REACHABLE`, 이후 재전송 가능 |
| `timeout` | `Timeout` | `0xb63a1b1d4bee82d109332187cbf5b657eb7da498` | 1분 기한 이후 첫 지연 확인 시 `EXPIRED`, 즉 약 15분 이내; 이후 `timeout_outcome` 적용 |
| `self_hosted` | `Self Hosted` | `0x33dcc2a7e69cf965f7f4eaf6ba657bcb078a2b65` | `UNCONFIRMED_OWNERSHIP`, 지갑 소유권 증명이 기록되면 `COMPLETED` |

```bash theme={null}
curl -X POST https://verification.didit.me/v3/transactions/ \
  -H "x-api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "transaction_id": "sbx-tr-accept-001",
    "transaction_category": "travelRule",
    "transaction_details": {
      "direction": "outbound",
      "action_type": "transfer",
      "amount": "0.25",
      "currency": "ETH",
      "currency_kind": "crypto"
    },
    "subject": { "entity_type": "individual", "vendor_data": "user-042", "full_name": "Jane Doe" },
    "travel_rule_details": {
      "status": "AWAITING_COUNTERPARTY",
      "beneficiary_data": {
        "wallet_address": "0xc00c4cd93ff83953ce3347b33656d68ab8f35cfb",
        "name": "Carlos Ruiz"
      }
    }
  }'
```

전송의 `rail`은 `TEST_VASP`이며, 전송 목록은 `Didit Test VASP`를 수취인 VASP로 표시합니다. `travel_rule.status.updated` webhook에서 이 전송을 추적하거나 `GET /v3/transactions/{transaction_id}/`를 읽어 확인하십시오.

* **`name_mismatch`**는 보낸 수취인 이름을 테스트 VASP가 응답하는 보유자 이름과 비교합니다. 비교는 수취인 주체 유형에 맞는 이름 규칙에 따라 이루어집니다(`matching_rules.individual.name` 또는 `matching_rules.company.name`이며, 직접 설정하기 전까지는 `name_matching_strictness`를 따릅니다). 전송과 이를 결정한 타임라인 항목에는 `name_match`(`compared_with: "counterparty_vasp"` 포함)와 `mismatched_fields: ["name"]`이 포함된 `data_match`가 기록됩니다.
* **`not_reachable`**은 재시도하는 동안 전송을 `AWAITING_COUNTERPARTY`로 유지하며, `delivery.status`는 `RETRYING`, `last_error`는 `test VASP is not answering`으로 설정됩니다. 이후 전송을 `COUNTERPARTY_VASP_NOT_REACHABLE`로 바꿉니다. 다시 실행하려면 `{"action": "resend"}`를 보내십시오.
* **`self_hosted`**에서 테스트 VASP는 해당 지갑이 자체 보관 지갑이라고 응답합니다. `auto_wallet_verification`이 켜져 있으면 생성되는 [지갑 소유권 위젯](https://docs.didit.me/ko/transaction-monitoring/wallet-ownership-widget.md)이나 [`POST .../travel-rule/ownership/`](https://docs.didit.me/ko/management-api/travel-rule/confirm-ownership)에 `{"confirmed": true}`를 보내 증명을 기록하십시오. 그러면 지갑이 수취인 이름으로 주소록에 추가되고, 이름 일치 여부가 전송을 결정합니다. 일치하면 전송이 완료되고 지갑은 검증된 것으로 표시됩니다. `{"confirmed": false}`를 보내면 전송이 거부됩니다.

## 샌드박스에서 수신 거래 테스트하기

수신 측을 테스트하려면 테스트 VASP가 `POST /v3/travel-rule/test-vasp/inbound/`로 거래를 보내도록 하세요. 애플리케이션이 직접 등록한 [주소록](https://docs.didit.me/ko/transaction-monitoring/travel-rule.md#지갑-주소록) 지갑 하나를 지정하면, 해당 거래는 실제 거래와 같은 수신 경로에서 주소록, 소유권 모드, 이름 규칙에 따라 결정됩니다.

```bash theme={null}
curl -X POST https://verification.didit.me/v3/travel-rule/test-vasp/inbound/ \
  -H "x-api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "beneficiary_wallet_address": "0xYourDepositWallet",
    "scenario": "accept",
    "reference": "sbx-inbound-001"
  }'
```

| 필드 | 설명 |
| - | - |
| `beneficiary_wallet_address` | 필수, 최대 128자. 본인의 주소록 지갑 중 하나를 사용하세요. 다른 지갑은 `ON_HOLD`로 기록됩니다. |
| `scenario` | `accept`(기본값): 테스트 VASP가 지갑의 실제 소유자를 수취인으로 지정합니다. `name_mismatch`: 어떤 소유자와도 일치하지 않는 사람을 수취인으로 지정합니다. |
| `chain`, `amount`, `currency` | 선택 사항. 기본값은 `ETH`, `1`, `ETH`입니다. |
| `reference` | 선택 사항, 최대 128자. 같은 `reference`로 다시 보내면 처음 응답(`201`)이 반환되며 새 거래는 기록되지 않습니다. |

`201` 응답에는 `transaction_id`, `txn_id`, `scenario`, `travel_rule_status`, `detail`, `test_vasp: true`, 그리고 `travel_rule` 전송 정보가 포함됩니다. 라이브 애플리케이션에서 요청하면 `400`(`"The Didit Test VASP is only available on sandbox applications."`)이 반환되고, 지원되지 않는 `scenario` 값을 보내면 `400`이, Travel Rule이 꺼져 있는 애플리케이션에서 요청하면 `409`가 반환됩니다.

| 지갑 항목 | `accept` | `name_mismatch` |
| - | - | - |
| 해당 체인에 항목 없음 | `ON_HOLD` | `ON_HOLD` |
| [소유권 모드](https://docs.didit.me/ko/transaction-monitoring/travel-rule.md#소유권-검증-모드)에서 소유권이 입증되지 않음 | `UNCONFIRMED_OWNERSHIP` | `UNCONFIRMED_OWNERSHIP` |
| 인증됨 | `inbound_auto_accept`가 켜져 있으면 `COMPLETED`, 그렇지 않으면 `ON_HOLD` | `COUNTERPARTY_MISMATCHED_DATA` (이름 규칙이 `NONE`인 경우 `accept`와 동일) |

대기 중인 거래는 실제 거래와 마찬가지로 [`POST .../travel-rule/ownership/`](https://docs.didit.me/ko/management-api/travel-rule/confirm-ownership)로 결정하세요. `{"confirmed": true}`는 거래를 완료하고, `{"confirmed": false}`는 거래를 거부합니다.

`POST /v3/transactions/`로 직접 보고한 입금은 테스트 VASP가 보낸 거래가 아닙니다. 이 입금은 발신 VASP의 응답을 기다리며 `AWAITING_COUNTERPARTY` 상태에 머물고, 타임라인에는 위 엔드포인트가 표시됩니다. `confirmation_timeout_hours`가 지나 만료되기 전까지는 웹훅도 전송되지 않습니다. [`POST /v3/travel-rule/inbound/`](https://docs.didit.me/ko/management-api/travel-rule/register-inbound)는 라이브 애플리케이션에서와 마찬가지로, 입금 후 등록된 건을 주소록에 대해 정산합니다.

## 샌드박스의 웹훅

`travel_rule.status.updated`는 샌드박스 애플리케이션에서 상태가 바뀔 때마다 `"environment": "sandbox"`와 함께 전송됩니다. 테스트 VASP가 응답한 거래에는 `rail: "TEST_VASP"`, `test_vasp: true`, `test_vasp_scenario`도 함께 포함됩니다. 그 밖의 샌드박스 동작은 [샌드박스의 거래 모니터링](https://docs.didit.me/ko/integration/sandbox-testing.md#샌드박스의-거래-모니터링)에 설명된 대로 유지됩니다. 규칙은 평가되지 않고, `transaction.created`와 `transaction.status.updated`는 전송되지 않으며, 요금도 청구되지 않습니다.

## 샌드박스로 증명되지 않는 것

* 실제 상대 VASP, 네트워크 멤버십, 또는 Didit의 공개 TRP 호스트가 작동한다는 사실. 이들 중 어느 것도 접촉하지 않습니다.
* 네트워크 자격 증명이 유효하다는 사실. 연결된 멤버십은 첫 번째 실제 교환을 통해 검증됩니다.
* 실제 VASP의 [디렉터리](https://docs.didit.me/ko/transaction-monitoring/travel-rule.md#디렉터리) 경로. 샌드박스 애플리케이션에서는 모든 경로가 `reason: sandbox_application`과 함께 `unavailable`로 표시되며, 모든 행은 `reachable: false`로 표시됩니다.

각 레일이 현재 프로덕션에서 도달할 수 있는 범위는 [Travel Rule 네트워크](https://docs.didit.me/ko/transaction-monitoring/travel-rule-networks.md)를 참고하세요.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.