## 대납 민팅(메타트랜잭션) 추가 개발 정리

### 목표
- 사용자는 지갑(MetaMask, Coinbase Wallet 등)에서 민팅 호출에 EIP-712 서명만 하고, 가스는 서비스(기업) 지갑이 대납한다.
- 기존 forwarder/relayer 인프라(전송 대납에 사용 중)를 재활용하여 민팅에도 적용한다.

### 현황/전제
- Forwarder(예: MinimalForwarder) 배포 및 relayer 키, nonce 관리, Bull 큐 파이프라인이 전송 대납에 이미 존재.
- `deployedcontracts` 컬렉션을 사용하여 forwarder 배포 이력도 함께 저장(`ercStandard` = forwarder 등으로 필터링 가능).
- certificate 템플릿은 ERC2771 지원 포함. standard 721/1155 템플릿의 ERC2771 지원 여부는 확인/확장 필요.
- mint 함수 권한: 현재 onlyOwner 모델. “사용자 민팅 + 우리가 가스 대납”을 하려면 권한 설계(예: MINTER_ROLE, permit 형태) 재검토 필요.

### 요구/작업 항목
1) 컨트랙트
- standard 721/1155 템플릿에 ERC2771Context/TrustedForwarder 지원 추가 여부 확인, 필요 시 확장.
- 배포 시 `trustedForwarder`를 constructor에 주입. (forwarder 미주입 배포본은 재배포 없이는 메타Tx 불가)
- 민팅 권한 정책 결정:
  - onlyOwner 유지 시: 오너가 외부 지갑이고, 그 지갑이 서명 → 우리는 가스 대납(가능).
  - 일반 사용자 민팅 허용: 역할 기반(MINTER_ROLE), permit-like allowlist 등 별도 권한 부여 설계 필요.

2) 서버(API)
- 민팅 메타Tx 전용 API/DTO 추가(EIP-712 ForwardRequest 기반). 필드: chainId, contractAddress, ercStandard, 민팅 파라미터, signature, forwarderNonce(optional), deadline(optional), forwarderAddress(or forwarderId).
- 검증 로직: 도메인/타입 일치, 서명자 복구 == from, chainId·contract 매칭, forwarderNonce/replay 방지, 허용 메서드 화이트리스트(safeMint/mintCertificate 등), certificate일 때 tokenUri/metadataHash 필수 확인.
- 큐/Processor: `minting-queue` 신설, relayer signer로 `forwarder.execute` 호출 후 상태/txHash/webhook 갱신. 가스비/nonce는 내부 지갑이 관리.
- forwarder 선택: corp 헤더 기준으로 `deployedcontracts`에서 forwarder 목록 조회(필터: corporateId, chainId, ercStandard=forwarder). 배포/민팅 시 명시 주소 또는 ID로 지정하도록 지원.
- webhook/응답: mint.* 이벤트에 relayed 여부, forwarder txHash(및 내부 txHash) 포함하도록 확장.

3) 문서
- 배포 시 forwarder 선택/주입 방법: corp가 소유한 forwarder 목록 조회 API(`GET /contracts/forwarders`) 사용 예시 추가.
- 메타Tx 민팅 플로우: 사용자 서명 → 백엔드 → forwarder.execute → 온체인, EIP-712 예제, certificate 주의사항(전송 불가, tokenUri/metadataHash 불변) 포함.
- 오류 케이스: 도메인 불일치, nonce 불일치, 허용되지 않은 메서드, 서명자 mismatch 등 응답 예시.

### 보안/검증 포인트
- EIP-712 도메인(이름/버전/chainId/verifyingContract) 고정 및 체인별 forwarder 주소 검증.
- 허용 메서드/파라미터 화이트리스트, deadline/nonce로 replay 방지.
- corp 소유 forwarder만 사용 가능하도록 조회/선택 시 corpId 검증.

### 테스트 시나리오(요약)
- happy path: forwarder 주입된 컨트랙트 + 오너 서명 메타Tx 민팅 성공, webhook 전송.
- 권한 실패: onlyOwner 컨트랙트에 일반 사용자 서명 → revert 확인.
- 도메인/체인 불일치, 잘못된 forwarder, 잘못된 nonce, 만료(deadline)로 실패 검증.
- certificate: tokenUri/metadataHash 누락 시 거부, 정상 시 getMetadataHash 대조.
