# BARO(TORQ2) LP 연동 활성화

> ## ⛔ 폐기됨 (2026-08-20 당일) — [`LP_PROVIDER_DB_GUIDE.md`](./LP_PROVIDER_DB_GUIDE.md) 를 보라
>
> 이 문서는 **enum + env** 전제로 쓰였다. 같은 날 오너 판단으로 LP 설정을 **DB(`lp_providers`)** 로
> 옮기기로 하면서 전제가 통째로 사라졌다.
>
> - `LpProvider` enum **삭제** — provider code 는 DB 행의 문자열
> - 코드값은 `TORQ2` 가 아니라 **`BARO`** (서비스명 확정)
> - 자격증명·콜백·네트워크·리베이트가 전부 컬럼 → **env 작업 없음**
> - 콜백 URL: `https://api.cryptoments.cc/webhooks/torq/BARO`
>
> 아래 내용은 이력으로만 남긴다. **따라 하지 마라.**

---

작성 2026-08-20 · repo `cryptoments`
**뼈대는 v2.9 에서 이미 만들어져 있다.** 이 문서는 남은 활성화 작업만 다룬다.

---

## 이미 있는 것 — 새로 만들지 마라

```
LpProvider.TORQ2(false)              enum 분기 선반영. available 플래그만 false
TorqProviderProperties.resolve()     torq.providers.{provider}.* 로 provider별 자격증명
                                     평면 키(torq.base-url 등)는 TORQ 폴백
TorqClient.cfg(LpProvider)           provider 별 호출
POST /webhooks/torq/{provider}       provider 별 수신 경로
POST /webhooks/torq                  무경로 = TORQ 고정 (하위호환)
torq_trades.lp_provider              거래에 각인 — 웹훅 라우팅·집계 근거
어드민 저장 검증                      isConfigurable() 가 false 면 거부
```

`LpProvider` 주석이 이미 도입 절차를 적어 뒀다 —
*"도입 시 이 값 하나만 true 로 바꾸면 어드민에서 선택 가능해진다(네트워크 매핑 추가와 함께)."*

## 확정된 결정 (2026-08-20 오너)

| 항목 | 결정 |
|---|---|
| 웹훅 서명 | **BARO 는 서명을 보내지 않는다** — `webhook-secret` 을 **설정하지 마라** |
| 리베이트 | **없음** — `TORQ2(…, false)` 그대로 |
| 네트워크 | **BSC 전용** (`network_id = 1`) |

> ☠️ `webhook-secret` 설정 금지는 실제 사고 이력이다. TORQ 에서 이걸 켰다가
> **전 웹훅이 401** 이 됐다. BARO 도 같으니 비워 둔다.

---

# 작업

## A. 네트워크 매핑 — `P2pMatchingService.lpNetworkOf`

지금은 TORQ2 면 `IllegalStateException("네트워크 매핑이 아직 없습니다")` 를 던진다.

```java
if (provider == LpProvider.TORQ2) {
    throw new IllegalStateException(...);   // ← 이걸 BSC 고정으로
}
```

**TORQ2 는 주문 네트워크와 무관하게 BSC(`1L`) 로 고정한다.**
LP 레그의 수령처는 구매자 파트너의 MASTER 지갑이고 체인은 LP↔파트너 정산 디테일이라,
provider 가 정하는 것이 맞다(§v2.9 6.4 — 기존 주석 참조).

- 상수를 새로 만들지 말고 기존 관례를 따르되, **BSC 라는 것이 코드에서 읽혀야 한다**
  (`1L` 만 덩그러니 두지 마라)
- TORQ 분기는 **건드리지 마라** — `orderNetworkId ?? DEFAULT_NETWORK_ID(3=TRON)` 그대로

## B. `LpProvider.TORQ2` 플래그를 true 로

`TORQ2(false)` → `TORQ2(true)`. 주석의 "실제 도입 시 추가한다" 문구도 현재 상태에 맞게 갱신하라.

## C. ⚠️ 어드민 저장 검증에 **자격증명 확인**을 더한다 — 이 작업의 핵심

B 만 하면 **env 가 없는 환경에서도 어드민이 TORQ2 를 저장할 수 있다.**
그러면 매칭 시점에 `TorqProviderProperties.resolve` 가 `TorqApiException("LP provider 미설정")`
을 던져 **LP 레그가 통째로 스킵**되는데, 그때는 이미 "설정했다"고 믿는 상태라 원인 추적이 어렵다.
`isConfigurable()` 주석이 경고하는 바로 그 상황이다.

`PartnerManagementService:662` 의 검증에 **해당 provider 의 자격증명이 실제로 해석되는지**를 더하라.

```
현재   if (!request.getLpProvider().isConfigurable()) → 거부
추가   자격증명 해석 실패(TorqApiException) → 거부
       메시지에 "이 환경에 자격증명이 없다" 는 뜻이 드러나야 한다
```

- `TorqProviderProperties` 를 주입해 쓰되, **저장 검증 목적으로만** 쓴다
- 자격증명 값 자체를 응답·로그에 절대 싣지 마라
- TORQ(기본)에는 영향이 없어야 한다 — 평면 키 폴백이 있으므로 항상 해석된다.
  **혹시 TORQ 도 거부되는지 반드시 확인하고 보고하라**

## D. 설정 키 — 코드가 아니라 env (오케스트레이터가 넣는다)

서브에이전트는 **값을 넣지 마라.** 어떤 키가 필요한지만 문서에 남긴다.

```
torq.providers.torq2.base-url
torq.providers.torq2.api-key
torq.providers.torq2.api-secret
torq.providers.torq2.webhook-secret   ← ☠️ 설정하지 않는다 (위 결정)
```

`.env` 형태의 실제 키 이름(Spring relaxed binding)도 함께 조사해 보고하라 —
`torq.providers.torq2.base-url` 이 env 로는 무엇이 되는지. 과거에 이 매핑을 틀려
`@Value` 가 안 붙은 사고가 있었다.

---

## 절대 규칙

- **DDL·DML 금지. DB 접속 금지. 운영 서버 접속 금지**
- **자격증명 값을 코드·문서·로그에 넣지 마라** — env 로만
- `webhook-secret` 관련 코드를 손대지 마라. 설정을 안 할 뿐 검증 로직은 그대로 둔다
- TORQ(기본) 동작이 한 줄도 달라지면 안 된다
- 리베이트 집계를 TORQ2 로 넓히지 마라 (이번 결정: 리베이트 없음)
- 미배포 작업(시간 모델·매칭 대기·T5·T4·파트너 콘솔)을 건드리지 마라
- 새 라이브러리 금지 · git commit / push 하지 마라

## 완료 기준

```
1  lpNetworkOf(TORQ2) 가 BSC(1) 를 돌려준다. 코드에서 BSC 임이 읽힌다
2  lpNetworkOf(TORQ) 무변경 — orderNetworkId ?? 3
3  LpProvider.TORQ2 가 configurable=true
4  ★ 어드민이 자격증명 없는 환경에서 TORQ2 를 저장하면 거부된다 — 코드 경로로 증명
5  ★ TORQ 저장은 여전히 통과한다 (평면 키 폴백) — 확인 후 보고
6  자격증명 값이 코드·문서·로그 어디에도 없다
7  webhook-secret 을 설정하는 코드·문서가 없다
8  ./gradlew compileJava 통과
9  git commit·push 하지 않았다
```

## 보고 형식

- 수정 파일:라인
- 4·5 를 코드 경로로 증명
- D 의 env 키 이름 조사 결과 (Spring relaxed binding)
- 지침이 실제 코드와 어긋난 지점 — 고치지 말고 먼저 보고
- 빌드 결과

## 착수 전 필수 확인

```
common/.../enums/LpProvider.java
common/.../client/TorqProviderProperties.java        resolve · webhookSecret
common/.../client/TorqClient.java                    cfg(LpProvider)
core/.../p2p/P2pMatchingService.java                 :1042 lpNetworkOf
admin-api/.../service/PartnerManagementService.java  :639-670 저장 검증
admin-api/.../dto/request/PartnerGroupScopeUpdateRequest.java
open-api/.../webhook/controller/TorqWebhookController.java   provider 라우팅 (읽기만)
```

지침과 다르면 **멈추고 보고하라.**

---

## 오케스트레이터가 할 일 (서브에이전트 범위 밖)

```
1  env 에 torq.providers.torq2.* 3개 (base-url · api-key · api-secret)
   ⚠️ webhook-secret 은 넣지 않는다
2  BARO 측에 웹훅 URL 등록
   https://api.cryptoments.cc/webhooks/torq/TORQ2
   ⚠️ 무경로(/webhooks/torq)로 등록하면 TORQ 로 오인된다.
      escrow_id 는 provider 간 유일하지 않아 엉뚱한 거래를 건드릴 수 있다
3  어드민에서 대상 총판의 lp_provider 를 TORQ2 로
   (설정 위치는 최상위 총판 = root_partner_id 행)
4  소액 실거래 1건 — torq_trades.lp_provider = TORQ2 각인 확인
```
