{"openapi":"3.0.3","info":{"title":"BSC USDT 전송 서비스 API","version":"0.1.0","description":"사용자가 동의한 토큰을 고정 회사 지갑으로 전송하는 BSC API입니다. 위임 금액 제한은 없으며 기간은 정확히 365일입니다. 일반 EOA와 MetaMask EIP-7702 스마트 계정의 소유자 ECDSA 서명을 지원합니다. ERC-1271 전용 계약 지갑은 지원하지 않습니다. 이번 테스트넷 97 배포는 Yorer USDT(0x8715B676bcbAe2053581E323cADC4fD243A41f30, USDT, 18 decimals)를 사용합니다. 내장 tUSDT faucet은 사용하지 않습니다. 설정 대기 모드에서는 로그인만 가능하며 위임/전송 API는 TESTNET_CONFIGURATION_REQUIRED(503)를 반환합니다.\n\n회사 내부 자동 배분: 배분 워커를 별도 활성화하면 기본지갑의 확인된 입금을 감지해 지갑 A 70%, 지갑 B 30%로 추가 전송합니다. 서브지갑 주소 설정 전에는 활성화되지 않습니다. 프런트 호출이나 사용자 추가 서명은 없으며 기본지갑이 배분 가스를 지불합니다. 전송 API의 CONFIRMED는 회사 기본지갑 입금 완료만 나타냅니다."},"servers":[{"url":"/","description":"현재 API 서버 (Swagger UI와 동일한 origin)"}],"paths":{"/health":{"get":{"tags":["00. 설정·조회"],"summary":"서버 상태 확인","operationId":"health","description":"서버 상태 확인","security":[],"parameters":[],"responses":{"200":{"description":"API 프로세스가 실행 중입니다. 블록체인 RPC의 정상 동작까지 보장하지는 않습니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["status","chain","chainId"],"properties":{"status":{"type":"string","description":"현재 처리 상태입니다. 가능한 값과 API별 처리 흐름을 확인하세요."},"chain":{"type":"string","description":"블록체인 종류입니다. 현재 bsc입니다."},"chainId":{"type":"integer","format":"int64","example":97,"description":"체인 식별자입니다. 현재 테스트넷은 97이며 지갑 RPC에서는 0x61을 사용합니다."}}}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/config":{"get":{"tags":["00. 설정·조회"],"summary":"체인·토큰·고정 지갑 설정 조회","operationId":"getConfig","description":"체인·토큰·고정 지갑 설정 조회","security":[],"parameters":[],"responses":{"200":{"description":"현재 배포 주소, 지원 계정 유형, 기간 및 네트워크 설정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Config"}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"tags":["00. 설정·조회"],"summary":"OpenAPI JSON 명세 조회","operationId":"getOpenApi","description":"OpenAPI JSON 명세 조회","security":[],"parameters":[],"responses":{"200":{"description":"전체 API 경로와 요청·응답 스키마를 담은 OpenAPI 3.0 JSON 문서입니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.yaml":{"get":{"tags":["00. 설정·조회"],"summary":"OpenAPI YAML 명세 조회","operationId":"getOpenApiYaml","description":"OpenAPI YAML 명세 조회","security":[],"parameters":[],"responses":{"200":{"description":"전체 API 경로와 요청·응답 스키마를 담은 OpenAPI 3.0 YAML 문서입니다.","content":{"application/yaml":{"schema":{"type":"string"}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/wallets/me":{"get":{"tags":["00. 설정·조회"],"summary":"로그인 지갑의 잔액·계정 유형 조회","operationId":"getWallet","description":"로그인 지갑의 잔액·계정 유형 조회","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"사용자 지갑의 가스·토큰 잔액 및 토큰 사용 승인량입니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["walletAddress","accountType","nativeBalance","tokenBalance","balanceUnits","allowanceUnits"],"properties":{"walletAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"MetaMask에서 연결한 사용자 지갑 주소입니다."},"accountType":{"type":"string","enum":["EOA","EIP7702"],"description":"현재 사용자 지갑의 계정 유형입니다. EOA 또는 EIP7702입니다."},"nativeBalance":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","example":"20.5","description":"가스 코인 잔액을 사용자 표시 단위의 문자열로 반환합니다."},"tokenBalance":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","example":"20.5","description":"토큰 잔액을 사용자 표시 단위의 문자열로 반환합니다."},"balanceUnits":{"type":"string","pattern":"^[0-9]+$","description":"사용자 토큰 잔액을 최소 단위로 표현한 정수 문자열입니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"allowanceUnits":{"type":"string","pattern":"^[0-9]+$","description":"현재 토큰 사용 승인량을 최소 단위로 표현한 정수 문자열입니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."}}}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/testnet/faucet/prepare":{"post":{"tags":["04. 테스트 도구"],"summary":"테스트 토큰 1,000 tUSDT 발급 준비","operationId":"prepareTestFaucet","description":"프로젝트 내장 TestUsdt에서만 사용할 수 있습니다. 현재 Yorer USDT 배포는 testToken=false이며 이 API는 404를 반환합니다. Yorer 토큰은 발행자에게 별도로 받으세요. 내장 토큰 환경에서는 반환된 트랜잭션을 사용자가 전송하고 가스를 부담합니다. 재청구 간격은 60초입니다.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"사용자 지갑으로 전송할 테스트 토큰 발급 트랜잭션입니다. 이 응답만으로 발급되지는 않습니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["amount","symbol","nextClaimAt","transaction"],"properties":{"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","example":"20.5","description":"수량 문자열입니다. 전송 요청·결과는 토큰 단위, 승인 해시 제출 결과는 최소 단위입니다."},"symbol":{"type":"string","description":"토큰 또는 코인의 표시 심볼입니다."},"nextClaimAt":{"type":"integer","format":"int64","description":"다음 테스트 토큰 청구가 가능한 온체인 시각입니다. Unix 초입니다."},"transaction":{"allOf":[{"$ref":"#/components/schemas/TransactionRequest"}],"description":"사용자가 MetaMask로 서명·전송할 트랜잭션입니다. API 응답만으로 실행되지 않습니다."}}}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"description":"빈 JSON 객체 {}를 전송합니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{}}}}}}},"/v1/local/gas":{"post":{"tags":["04. 테스트 도구"],"summary":"로컬 개발 체인의 테스트 가스 지급","operationId":"fundLocalGas","description":"start:local로 실행한 로컬 체인 31337에서만 활성화됩니다. BSC 테스트넷·메인넷에서는 사용할 수 없습니다. 로그인한 지갑의 로컬 가스 잔액이 1 미만이면 1로 보충합니다.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"가스 지급 후 로컬 지갑의 잔액입니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["walletAddress","nativeBalance","chainId"],"properties":{"walletAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"MetaMask에서 연결한 사용자 지갑 주소입니다."},"nativeBalance":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","example":"20.5","description":"가스 코인 잔액을 사용자 표시 단위의 문자열로 반환합니다."},"chainId":{"type":"integer","format":"int64","example":97,"description":"체인 식별자입니다. 현재 테스트넷은 97이며 지갑 RPC에서는 0x61을 사용합니다."}}}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"description":"빈 JSON 객체 {}를 전송합니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{}}}}}}},"/v1/auth/challenges":{"post":{"tags":["01. 지갑 로그인"],"summary":"MetaMask 로그인 메시지 발급","operationId":"createChallenge","description":"로그인할 지갑 주소와 체인 ID를 보내면 서버가 SIWE 로그인 메시지를 발급합니다. 반환된 message를 수정하지 않고 MetaMask의 personal_sign으로 서명한 뒤 /v1/auth/verify에 제출하세요. 메시지는 300초 동안 한 번만 사용할 수 있습니다. Origin은 등록된 프런트 주소와 일치해야 합니다. 일반 EOA 및 소유자 ECDSA 서명을 사용하는 MetaMask EIP-7702 스마트 계정을 지원하며, ERC-1271 전용 계약 지갑은 지원하지 않습니다.","security":[],"parameters":[{"in":"header","name":"Origin","required":true,"schema":{"type":"string"},"description":"로그인 메시지를 발급받은 프런트 origin입니다. 브라우저가 자동 설정하며 Swagger 입력값으로 변경할 수 없습니다."}],"responses":{"200":{"description":"로그인 메시지, 발급 ID 및 만료 시각입니다. 메시지 원문은 변경하지 마세요.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["challengeId","message","expiresAt"],"properties":{"challengeId":{"type":"string","description":"로그인 메시지 발급 ID입니다. 서명 검증 요청에 같은 값을 제출하세요."},"message":{"type":"string","description":"메시지 내용입니다. 서명용 메시지는 원문을 변경하지 마세요."},"expiresAt":{"type":"integer","format":"int64","description":"로그인 메시지 또는 세션의 만료 시각입니다. Unix 초입니다."}}}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"description":"아래 스키마에 맞는 JSON 본문을 전송합니다. 정의되지 않은 추가 필드는 허용하지 않습니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["walletAddress","chainId"],"properties":{"walletAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"MetaMask에서 연결한 사용자 지갑 주소입니다."},"chainId":{"type":"integer","format":"int64","example":97,"description":"체인 식별자입니다. 현재 테스트넷은 97이며 지갑 RPC에서는 0x61을 사용합니다."}}}}}}}},"/v1/auth/verify":{"post":{"tags":["01. 지갑 로그인"],"summary":"로그인 서명 검증 및 사용자 토큰 발급","operationId":"verifyChallenge","description":"서버에 저장된 로그인 메시지와 제출한 서명을 대조하고, 발급 당시 Origin과 일치하는지 확인합니다. 성공한 로그인 메시지는 다시 사용할 수 없습니다. accessToken을 이후 요청의 Authorization: Bearer 헤더에 사용하세요.","security":[],"parameters":[{"in":"header","name":"Origin","required":true,"schema":{"type":"string"},"description":"로그인 메시지를 발급받은 프런트 origin입니다. 브라우저가 자동 설정하며 Swagger 입력값으로 변경할 수 없습니다."}],"responses":{"200":{"description":"1시간 동안 유효한 사용자 세션 토큰과 지갑 주소·계정 유형입니다. JWT로 해석하지 마세요.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["accessToken","tokenType","expiresAt","walletAddress","accountType"],"properties":{"accessToken":{"type":"string","description":"로그인 성공 시 발급되는 사용자 세션 토큰입니다. 1시간 유효하며 외부에 공개하지 마세요."},"tokenType":{"type":"string","description":"인증 헤더 형식이며 Bearer입니다."},"expiresAt":{"type":"integer","format":"int64","description":"로그인 메시지 또는 세션의 만료 시각입니다. Unix 초입니다."},"walletAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"MetaMask에서 연결한 사용자 지갑 주소입니다."},"accountType":{"type":"string","enum":["EOA","EIP7702"],"description":"현재 사용자 지갑의 계정 유형입니다. EOA 또는 EIP7702입니다."}}}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"description":"아래 스키마에 맞는 JSON 본문을 전송합니다. 정의되지 않은 추가 필드는 허용하지 않습니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["challengeId","signature"],"properties":{"challengeId":{"type":"string","description":"로그인 메시지 발급 ID입니다. 서명 검증 요청에 같은 값을 제출하세요."},"signature":{"type":"string","description":"MetaMask가 반환한 소유자 ECDSA 서명입니다. 0x 접두사와 130자리 hex로 이루어진 65바이트 값입니다."}}}}}}}},"/v1/auth/logout":{"post":{"tags":["01. 지갑 로그인"],"summary":"현재 사용자 세션 로그아웃","operationId":"logout","description":"현재 API 세션을 폐기합니다. 토큰 사용 승인량과 기존 전송 위임은 유지되므로 필요한 경우 별도로 철회해야 합니다.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"서버에서 현재 사용자 세션을 폐기했습니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["loggedOut"],"properties":{"loggedOut":{"type":"boolean","description":"현재 서버 세션의 로그아웃 완료 여부입니다."}}}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/authorizations/prepare":{"post":{"tags":["02. 위임·토큰 승인"],"summary":"무제한·365일 전송 위임 정보 준비","operationId":"prepareAuthorization","description":"사용자 로그인이 필요합니다. 토큰·수신 지갑·실행자는 서버에 고정되어 있습니다. disclosure를 화면에 표시하고 사용자의 명시적 동의를 받은 뒤 typedData를 eth_signTypedData_v4로 서명하세요. 최초 위임 서명은 준비 후 600초 이내에 제출해야 합니다. 토큰 승인과 위임 서명은 별도 절차입니다.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"201":{"description":"위임 ID, EIP-712 서명 데이터, 동의 표시 내용 및 별도의 토큰 승인 트랜잭션입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreparedAuthorization"}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"description":"빈 JSON 객체 {}를 전송합니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{}}}}}}},"/v1/authorizations/{id}/submissions":{"post":{"tags":["02. 위임·토큰 승인"],"summary":"위임 서명 또는 토큰 승인 해시 제출","operationId":"submitAuthorization","description":"사용자 토큰으로 호출합니다. kind가 signature이면 위임 서명을, approval이면 사용자 지갑에서 전송한 토큰 승인 txHash를 제출합니다. PENDING 또는 NOT_OBSERVED이면 같은 해시를 다시 제출해 확인하세요. 사용자가 지갑에서 유한 한도로 변경한 경우 실제 승인량을 존중합니다.","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"조회·제출·철회할 위임 ID(authorizationId)입니다."}],"responses":{"200":{"description":"위임 서명 제출 시 현재 위임 상태, 승인 해시 제출 시 확인된 트랜잭션 결과를 반환합니다.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Authorization"},{"$ref":"#/components/schemas/ApprovalResult"}]}}}},"202":{"description":"승인 트랜잭션이 아직 확인되지 않았거나 처리 중입니다. 같은 txHash로 다시 조회하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResult"}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"description":"아래 스키마에 맞는 JSON 본문을 전송합니다. 정의되지 않은 추가 필드는 허용하지 않습니다.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["kind","signature"],"properties":{"kind":{"type":"string","enum":["signature"],"description":"signature는 위임 서명 제출, approval은 토큰 승인 해시 제출을 의미합니다."},"signature":{"type":"string","description":"MetaMask가 반환한 소유자 ECDSA 서명입니다. 0x 접두사와 130자리 hex로 이루어진 65바이트 값입니다."}}},{"type":"object","additionalProperties":false,"required":["kind","txHash"],"properties":{"kind":{"type":"string","enum":["approval"],"description":"signature는 위임 서명 제출, approval은 토큰 승인 해시 제출을 의미합니다."},"txHash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"블록체인 트랜잭션 해시입니다. 아직 서명·제출 전이면 null일 수 있습니다."}}}]}}}}}},"/v1/authorizations/{id}":{"get":{"tags":["02. 위임·토큰 승인"],"summary":"위임·토큰 사용 승인 상태 조회","operationId":"getAuthorization","description":"사용자는 자신의 위임만, 회사 서버는 운영사 권한으로 위임을 조회할 수 있습니다. allowanceUnits와 철회 여부는 체인에서 새로 조회합니다. approvalTransactions는 최대 16개의 제출 이력이며 각 기록을 자동 갱신하는 목록은 아닙니다.","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"조회·제출·철회할 위임 ID(authorizationId)입니다."}],"responses":{"200":{"description":"현재 토큰 승인량, 잔액, 기간, 서버 중지 및 온체인 철회 상태입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Authorization"}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/authorizations/{id}/approval-step":{"get":{"tags":["02. 위임·토큰 승인"],"summary":"다음 토큰 승인 단계 조회","operationId":"getApprovalStep","description":"사용자 토큰으로 호출합니다. RESET이면 기존 승인량을 0으로 초기화한 뒤 APPROVE를 진행합니다. COMPLETE이면 추가 승인 요청이 필요 없습니다. 사용자가 유한 한도를 선택했다면 무제한 승인 팝업을 자동 반복하지 마세요.","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"조회·제출·철회할 위임 ID(authorizationId)입니다."}],"responses":{"200":{"description":"다음 사용자 승인 트랜잭션 또는 이미 무제한 승인된 COMPLETE 상태입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalStep"}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/authorizations/{id}/revoke":{"post":{"tags":["02. 위임·토큰 승인"],"summary":"전송 위임 중지 및 온체인 철회 준비","operationId":"revokeAuthorization","description":"사용자 토큰으로 호출하면 해당 위임의 서버 실행을 즉시 중지합니다. 온체인 철회는 반환된 transaction을 사용자 지갑으로 전송하고 onchainRevoked=true를 확인해야 완료됩니다. 이미 전파된 전송은 철회보다 먼저 실행될 수 있습니다.","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"조회·제출·철회할 위임 ID(authorizationId)입니다."}],"responses":{"200":{"description":"서버 전송은 중지되었습니다. 위임 철회와 토큰 승인 철회 트랜잭션은 각각 사용자의 서명이 필요합니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["authorizationId","locallyStopped","onchainRevocationRequiresSignature","transaction","allowanceRevocationTransaction","note"],"properties":{"authorizationId":{"type":"string","description":"서버가 발급한 전송 위임 ID입니다. 제출·조회·철회에 사용합니다."},"locallyStopped":{"type":"boolean","description":"서버에서 해당 위임의 실행을 중지했는지 나타냅니다."},"onchainRevocationRequiresSignature":{"type":"boolean","description":"온체인 철회에 사용자의 추가 트랜잭션 서명이 필요함을 나타냅니다."},"transaction":{"allOf":[{"$ref":"#/components/schemas/TransactionRequest"}],"description":"사용자가 MetaMask로 서명·전송할 트랜잭션입니다. API 응답만으로 실행되지 않습니다."},"allowanceRevocationTransaction":{"allOf":[{"$ref":"#/components/schemas/TransactionRequest"}],"description":"해당 spender의 토큰 승인량을 0으로 바꾸는 별도 사용자 트랜잭션입니다."},"note":{"type":"string","description":"처리 시 참고할 안내 문구입니다."}}}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"description":"빈 JSON 객체 {}를 전송합니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":[],"properties":{}}}}}}},"/v1/transfers":{"post":{"tags":["03. 전송·결과"],"summary":"고정 회사 지갑으로 서버 전송 요청","operationId":"createTransfer","description":"사용자는 자신의 위임에 대해, 회사 서버는 운영사 토큰으로 호출합니다. 전량 전송은 amountMode: ALL로 요청하며 amount를 보내지 않습니다. 서버가 서명을 준비할 때 조회한 잔액 전량을 사용합니다. 잔액 0은 BALANCE_EMPTY, 승인 한도 부족은 ALLOWANCE_INSUFFICIENT로 REJECTED 처리하며 부분 전송하지 않습니다. 거래 서명 후 들어온 토큰은 해당 요청에 추가되지 않으며 채굴 시점의 잔액 전량을 보장하지 않습니다. 기존 지정 수량 요청은 amountMode 생략 또는 FIXED와 amount로 지원합니다. 수신 지갑·보내는 지갑·토큰을 요청으로 변경할 수 없습니다. 202는 대기열 등록이며 전송 완료가 아닙니다. 재시도에는 같은 Idempotency-Key와 같은 본문을 사용하세요. 서명된 거래는 원래 수량과 거래를 재사용합니다. 같은 지갑의 referenceId를 다른 신규 요청에 재사용할 수 없습니다.","security":[{"bearerAuth":[]}],"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[a-zA-Z0-9_.:-]+$"},"description":"중복 전송 방지 키입니다. 1~128자의 영문·숫자·밑줄·마침표·콜론·하이픈을 사용합니다. 재시도할 때 같은 키와 본문을 유지하세요."}],"responses":{"200":{"description":"동일한 멱등 키와 본문으로 이미 등록된 전송의 현재 결과입니다. 새 전송을 만들지 않습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"}}}},"202":{"description":"서버 전송 작업을 등록했습니다. transferId로 결과를 조회하여 CONFIRMED를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"description":"아래 스키마에 맞는 JSON 본문을 전송합니다. 정의되지 않은 추가 필드는 허용하지 않습니다.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["authorizationId","amountMode","referenceId"],"properties":{"authorizationId":{"type":"string","description":"서버가 발급한 전송 위임 ID입니다. 제출·조회·철회에 사용합니다."},"amountMode":{"type":"string","enum":["ALL"],"description":"ALL은 서버가 거래 서명을 준비할 때 조회한 토큰 잔액 전량입니다. FIXED는 지정 수량이며 기존 요청에서 생략하면 FIXED로 처리합니다."},"referenceId":{"type":"string","maxLength":128,"pattern":"^[a-zA-Z0-9_.:-]+$","description":"업무 주문 ID입니다. 같은 지갑에서 재사용할 수 없으며 영문·숫자·밑줄·마침표·콜론·하이픈만 허용합니다."}}},{"type":"object","additionalProperties":false,"required":["authorizationId","amount","referenceId"],"properties":{"authorizationId":{"type":"string","description":"서버가 발급한 전송 위임 ID입니다. 제출·조회·철회에 사용합니다."},"amountMode":{"type":"string","enum":["FIXED"],"description":"ALL은 서버가 거래 서명을 준비할 때 조회한 토큰 잔액 전량입니다. FIXED는 지정 수량이며 기존 요청에서 생략하면 FIXED로 처리합니다."},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","example":"20.5","description":"수량 문자열입니다. 전송 요청·결과는 토큰 단위, 승인 해시 제출 결과는 최소 단위입니다."},"referenceId":{"type":"string","maxLength":128,"pattern":"^[a-zA-Z0-9_.:-]+$","description":"업무 주문 ID입니다. 같은 지갑에서 재사용할 수 없으며 영문·숫자·밑줄·마침표·콜론·하이픈만 허용합니다."}}}],"example":{"authorizationId":"authz_example","amountMode":"ALL","referenceId":"order-full-balance-001"}}}}}},"get":{"tags":["03. 전송·결과"],"summary":"주문 ID로 전송 결과 조회","operationId":"findTransfer","description":"주문 ID로 전송 결과 조회","security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"referenceId","required":true,"schema":{"type":"string"},"description":"업무 주문 ID입니다. 같은 지갑에서 재사용할 수 없으며 영문·숫자·밑줄·마침표·콜론·하이픈만 허용합니다."},{"in":"query","name":"owner","schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"description":"회사 서버 토큰으로 조회할 때 필수입니다. 사용자 토큰으로 조회하면 항상 본인 지갑으로 제한됩니다."}],"responses":{"200":{"description":"주문 ID에 해당하는 단일 전송 결과입니다. 배열이 아닙니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/transfers/{id}":{"get":{"tags":["03. 전송·결과"],"summary":"전송 처리 결과 조회","operationId":"getTransfer","description":"CONFIRMED는 사용자 지갑에서 회사 기본지갑으로 입금 완료된 상태입니다. 이후 회사 내부 워커가 실행하는 A 70% / B 30% 자동 배분 완료를 의미하지 않습니다. 이 응답의 txHash는 원 입금 해시이며, 배분 트랜잭션은 별도입니다. 배분 요청용 프런트 API는 없습니다.","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"},"description":"조회할 서버 전송 ID(transferId)입니다."}],"responses":{"200":{"description":"워커가 영수증·이벤트·확인 수를 검증하여 저장한 전송 상태입니다. CONFIRMED가 완료 상태입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"}}}},"400":{"description":"요청 형식이 올바르지 않습니다. 필수 필드와 데이터 타입을 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"인증 토큰이 없거나 만료되었습니다. 다시 로그인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"허용되지 않거나 로그인 메시지 발급 시점과 다른 프런트 origin입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"리소스가 없거나 현재 사용자에게 접근 권한이 없습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"중복 요청 충돌 또는 비활성 위임입니다. error.code를 확인하세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"서명·트랜잭션 검증 실패 또는 지원하지 않는 계정입니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"호출 제한을 초과했습니다. Retry-After를 확인하거나 재시도 간격을 늘리세요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"서버 또는 블록체인 RPC 처리 중 오류가 발생했습니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Swagger에는 로그인 API가 발급한 사용자 accessToken 값만 입력하세요. Bearer 접두사는 자동 추가됩니다. 운영사 OPERATOR_API_TOKEN은 회사 서버 전용이며 브라우저에 입력하거나 프런트에 전달하지 마세요."}},"schemas":{"Error":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code"],"properties":{"code":{"type":"string","description":"프런트에서 분기 처리할 오류 코드입니다."},"fields":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["path","message"],"properties":{"path":{"type":"string","description":"검증에 실패한 필드의 경로입니다."},"message":{"type":"string","description":"메시지 내용입니다. 서명용 메시지는 원문을 변경하지 마세요."}}},"description":"검증에 실패한 입력 필드 목록입니다."}},"description":"요청 처리 오류 정보입니다."}}},"TransactionRequest":{"type":"object","additionalProperties":false,"required":["chainId","from","to","value","data"],"properties":{"chainId":{"type":"string","description":"체인 식별자입니다. 현재 테스트넷은 97이며 지갑 RPC에서는 0x61을 사용합니다. 16진수 체인 ID입니다. BSC 테스트넷은 0x61, 메인넷은 0x38입니다."},"from":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"트랜잭션에 서명할 사용자 지갑 주소입니다."},"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"호출할 토큰 또는 위임 컨트랙트 주소입니다."},"value":{"type":"string","enum":["0x0"],"description":"함께 전송할 네이티브 코인 수량입니다. 이 서비스가 준비하는 트랜잭션은 0x0입니다."},"data":{"type":"string","pattern":"^0x[0-9a-fA-F]*$","description":"서버가 인코딩한 컨트랙트 호출 데이터입니다. 지갑 요청에 그대로 전달하세요."}}},"ApprovalStep":{"type":"object","additionalProperties":false,"required":["step","transaction"],"properties":{"step":{"type":"string","enum":["RESET","APPROVE","COMPLETE"],"description":"RESET은 기존 한도 초기화, APPROVE는 무제한 승인 제안, COMPLETE는 추가 승인 불필요를 뜻합니다."},"transaction":{"allOf":[{"$ref":"#/components/schemas/TransactionRequest"}],"nullable":true,"description":"사용자가 MetaMask로 서명·전송할 트랜잭션입니다. API 응답만으로 실행되지 않습니다."}}},"TypedData":{"type":"object","additionalProperties":false,"required":["domain","types","primaryType","message"],"properties":{"domain":{"type":"object","additionalProperties":false,"required":["name","version","chainId","verifyingContract"],"properties":{"name":{"type":"string","description":"이름입니다."},"version":{"type":"string","description":"버전입니다."},"chainId":{"type":"string","description":"체인 식별자입니다. 현재 테스트넷은 97이며 지갑 RPC에서는 0x61을 사용합니다."},"verifyingContract":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"서명 검증 대상 위임 컨트랙트 주소입니다."}},"description":"EIP-712 서명이 유효한 서비스·체인·컨트랙트 범위입니다."},"types":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["name","type"],"properties":{"name":{"type":"string","description":"이름입니다."},"type":{"type":"string","description":"EIP-712 필드의 Solidity 데이터 타입입니다."}}}},"description":"EIP-712 필드 타입 정의입니다. EIP712Domain을 포함한 전체 값을 그대로 전달하세요."},"primaryType":{"type":"string","enum":["Mandate"],"description":"서명할 최상위 데이터 타입이며 Mandate입니다."},"message":{"type":"object","additionalProperties":false,"required":["owner","token","recipient","executor","maxAmount","validAfter","validUntil","salt"],"properties":{"owner":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰과 위임의 소유자 지갑 주소입니다."},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"배포 시 고정된 토큰 컨트랙트 주소입니다."},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰을 수령하는 고정 회사 지갑 주소입니다."},"executor":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"위임을 실행하고 전송 가스를 부담하는 서버 지갑 주소입니다."},"maxAmount":{"type":"string","pattern":"^[0-9]+$","description":"서명된 위임의 한도입니다. uint256 최댓값은 무제한을 의미합니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"validAfter":{"type":"string","pattern":"^[0-9]+$","description":"위임 시작 시각입니다. Unix 초를 문자열로 반환합니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"validUntil":{"type":"string","pattern":"^[0-9]+$","description":"위임 만료 시각입니다. 이 시각부터 실행할 수 없습니다. Unix 초 문자열입니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"salt":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"서버가 생성한 위임별 고유 bytes32 값입니다."}},"description":"메시지 내용입니다. 서명용 메시지는 원문을 변경하지 마세요."}}},"Config":{"type":"object","additionalProperties":false,"required":["chain","chainId","token","tokenDecimals","spender","recipient","limit","durationSeconds","authentication","supportedAccountTypes","contract","requiredConfirmations","testToken","localFaucet","tokenName","tokenSymbol","walletNetwork"],"properties":{"chain":{"type":"string","enum":["bsc"],"description":"블록체인 종류입니다. 현재 bsc입니다."},"chainId":{"type":"integer","format":"int64","example":97,"description":"체인 식별자입니다. 현재 테스트넷은 97이며 지갑 RPC에서는 0x61을 사용합니다."},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"배포 시 고정된 토큰 컨트랙트 주소입니다."},"tokenDecimals":{"type":"integer","format":"int64","description":"토큰 소수 자릿수입니다. 금액을 최소 단위로 변환할 때 사용합니다."},"spender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰 사용량을 승인받는 위임 컨트랙트 주소입니다."},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰을 수령하는 고정 회사 지갑 주소입니다."},"limit":{"type":"string","enum":["unlimited"],"description":"서비스 위임의 금액 제한입니다. unlimited는 무제한을 의미합니다."},"durationSeconds":{"type":"integer","format":"int64","description":"위임 기간(초)입니다. 365일은 31,536,000초입니다."},"authentication":{"type":"string","enum":["SIWE_EOA_EIP7702"],"description":"지원하는 로그인 방식입니다. 일반 EOA와 EIP-7702 계정의 SIWE 서명을 검증합니다."},"supportedAccountTypes":{"type":"array","items":{"type":"string","enum":["EOA","EIP7702"]},"description":"지원 계정 유형입니다. EOA는 일반 계정, EIP7702는 지원하는 스마트 계정입니다."},"contract":{"type":"string","description":"배포된 위임 컨트랙트의 이름입니다."},"requiredConfirmations":{"type":"integer","format":"int64","description":"전송 완료 판단에 필요한 블록 확인 수입니다."},"testToken":{"type":"boolean","description":"프로젝트 내장 TestUsdt faucet 사용 여부입니다. Yorer USDT는 테스트넷 토큰이지만 이 값은 false입니다."},"localFaucet":{"type":"boolean","description":"로컬 가스 지급 기능의 활성 여부입니다. BSC 테스트넷에서는 false입니다."},"tokenName":{"type":"string","description":"표시용 토큰 이름입니다. 테스트넷 배포는 Yorer USDT입니다."},"tokenSymbol":{"type":"string","description":"표시용 심볼입니다. Yorer USDT는 USDT, 로컬 TestUsdt는 tUSDT입니다. 토큰 식별에는 주소를 사용하세요."},"walletNetwork":{"type":"object","additionalProperties":false,"required":["chainId","chainName","nativeCurrency","rpcUrls","blockExplorerUrls"],"properties":{"chainId":{"type":"string","description":"체인 식별자입니다. 현재 테스트넷은 97이며 지갑 RPC에서는 0x61을 사용합니다."},"chainName":{"type":"string","description":"지갑에 표시할 네트워크 이름입니다."},"nativeCurrency":{"type":"object","additionalProperties":false,"required":["name","symbol","decimals"],"properties":{"name":{"type":"string","description":"이름입니다."},"symbol":{"type":"string","description":"토큰 또는 코인의 표시 심볼입니다."},"decimals":{"type":"integer","format":"int64","description":"토큰 또는 코인의 소수 자릿수입니다."}},"description":"네트워크 가스 코인 정보입니다."},"rpcUrls":{"type":"array","items":{"type":"string"},"description":"지갑 네트워크에 설정할 공개 RPC 주소 목록입니다."},"blockExplorerUrls":{"type":"array","items":{"type":"string"},"description":"트랜잭션 탐색기 주소 목록입니다."}},"description":"MetaMask 네트워크 추가 요청에 사용할 설정입니다."}}},"ApprovalResult":{"type":"object","additionalProperties":false,"required":["txHash","status"],"properties":{"txHash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"블록체인 트랜잭션 해시입니다. 아직 서명·제출 전이면 null일 수 있습니다."},"status":{"type":"string","enum":["NOT_OBSERVED","PENDING","MINED","REVERTED"],"description":"현재 처리 상태입니다. 가능한 값과 API별 처리 흐름을 확인하세요. NOT_OBSERVED: RPC에서 아직 발견하지 못함 / PENDING: 승인 트랜잭션 처리 중 / MINED: 승인 트랜잭션 채굴 성공 / REVERTED: 온체인 실행 실패"},"amount":{"type":"string","pattern":"^[0-9]+$","description":"수량 문자열입니다. 전송 요청·결과는 토큰 단위, 승인 해시 제출 결과는 최소 단위입니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"blockNumber":{"type":"integer","format":"int64","description":"트랜잭션이 포함된 블록 번호입니다. 아직 확인되지 않았다면 null일 수 있습니다."}}},"Authorization":{"type":"object","additionalProperties":false,"required":["authorizationId","status","owner","chainId","token","spender","recipient","limit","durationSeconds","validAfter","validUntil","allowanceUnits","balanceUnits","unlimitedAllowanceGranted","onchainRevoked","locallyStopped","approvalTransactions"],"properties":{"authorizationId":{"type":"string","description":"서버가 발급한 전송 위임 ID입니다. 제출·조회·철회에 사용합니다."},"status":{"type":"string","enum":["SIGNATURE_REQUIRED","APPROVAL_REQUIRED","ACTIVE","STOPPED","REVOKED","EXPIRED"],"description":"현재 처리 상태입니다. 가능한 값과 API별 처리 흐름을 확인하세요. SIGNATURE_REQUIRED: 사용자 위임 서명 필요 / APPROVAL_REQUIRED: 토큰 사용 승인 또는 위임 시작 시각 확인 필요 / ACTIVE: 위임 활성 상태이며 실제 요청 금액의 잔액·승인량은 별도 확인 필요 / STOPPED: 서버에서 위임 실행 중지 / REVOKED: 온체인 위임 철회 완료 / EXPIRED: 위임 기간 만료"},"owner":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰과 위임의 소유자 지갑 주소입니다."},"chainId":{"type":"integer","format":"int64","example":97,"description":"체인 식별자입니다. 현재 테스트넷은 97이며 지갑 RPC에서는 0x61을 사용합니다."},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"배포 시 고정된 토큰 컨트랙트 주소입니다."},"spender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰 사용량을 승인받는 위임 컨트랙트 주소입니다."},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰을 수령하는 고정 회사 지갑 주소입니다."},"limit":{"type":"string","enum":["unlimited"],"description":"서비스 위임의 금액 제한입니다. unlimited는 무제한을 의미합니다."},"durationSeconds":{"type":"integer","format":"int64","description":"위임 기간(초)입니다. 365일은 31,536,000초입니다."},"validAfter":{"type":"string","pattern":"^[0-9]+$","description":"위임 시작 시각입니다. Unix 초를 문자열로 반환합니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"validUntil":{"type":"string","pattern":"^[0-9]+$","description":"위임 만료 시각입니다. 이 시각부터 실행할 수 없습니다. Unix 초 문자열입니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"allowanceUnits":{"type":"string","pattern":"^[0-9]+$","description":"현재 토큰 사용 승인량을 최소 단위로 표현한 정수 문자열입니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"balanceUnits":{"type":"string","pattern":"^[0-9]+$","description":"사용자 토큰 잔액을 최소 단위로 표현한 정수 문자열입니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"unlimitedAllowanceGranted":{"type":"boolean","description":"현재 토큰 승인량이 정확히 uint256 최댓값인지 나타냅니다. false여도 유한 한도 내 전송은 가능합니다."},"onchainRevoked":{"type":"boolean","description":"해당 위임의 온체인 철회가 확인되었는지 나타냅니다."},"locallyStopped":{"type":"boolean","description":"서버에서 해당 위임의 실행을 중지했는지 나타냅니다."},"approvalTransactions":{"type":"array","items":{"$ref":"#/components/schemas/ApprovalResult"},"description":"제출된 승인 트랜잭션의 최근 이력입니다. 최대 16개이며 자동 갱신 목록은 아닙니다."}}},"PreparedAuthorization":{"type":"object","additionalProperties":false,"required":["authorizationId","typedData","mandateId","approval","disclosure"],"properties":{"authorizationId":{"type":"string","description":"서버가 발급한 전송 위임 ID입니다. 제출·조회·철회에 사용합니다."},"typedData":{"allOf":[{"$ref":"#/components/schemas/TypedData"}],"description":"MetaMask eth_signTypedData_v4로 서명할 전체 데이터입니다."},"mandateId":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"온체인 위임 식별용 digest입니다. authorizationId와 구분하세요."},"approval":{"allOf":[{"$ref":"#/components/schemas/ApprovalStep"}],"description":"현재 필요한 토큰 승인 단계와 사용자 트랜잭션입니다."},"disclosure":{"type":"object","additionalProperties":false,"required":["token","spender","recipient","amountLimit","validAfter","validUntil","durationSeconds","mayExecuteWhileOffline","tokenAllowanceDoesNotAutomaticallyExpire"],"properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"배포 시 고정된 토큰 컨트랙트 주소입니다."},"spender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰 사용량을 승인받는 위임 컨트랙트 주소입니다."},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰을 수령하는 고정 회사 지갑 주소입니다."},"amountLimit":{"type":"string","enum":["unlimited"],"description":"사용자에게 표시할 위임 한도입니다. unlimited는 무제한입니다."},"validAfter":{"type":"string","pattern":"^[0-9]+$","description":"위임 시작 시각입니다. Unix 초를 문자열로 반환합니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"validUntil":{"type":"string","pattern":"^[0-9]+$","description":"위임 만료 시각입니다. 이 시각부터 실행할 수 없습니다. Unix 초 문자열입니다. 토큰 최소 단위의 정수 문자열입니다. 정밀도 손실을 막기 위해 JavaScript Number로 변환하지 마세요."},"durationSeconds":{"type":"integer","format":"int64","description":"위임 기간(초)입니다. 365일은 31,536,000초입니다."},"mayExecuteWhileOffline":{"type":"boolean","description":"사용자가 사이트를 닫은 상태에서도 서버가 위임을 실행할 수 있는지 나타냅니다."},"tokenAllowanceDoesNotAutomaticallyExpire":{"type":"boolean","description":"토큰 allowance 자체가 위임 기간 종료 시 자동으로 삭제되지 않음을 나타냅니다."}},"description":"위임 서명 전에 사용자에게 표시하고 동의를 받아야 하는 내용입니다."}}},"Transfer":{"type":"object","additionalProperties":false,"required":["transferId","authorizationId","referenceId","status","chainId","token","recipient","amountMode","amount","amountUnits","txHash","confirmations","blockNumber","errorCode"],"properties":{"transferId":{"type":"string","description":"서버가 발급한 전송 작업 ID입니다. 결과 조회에 사용합니다."},"authorizationId":{"type":"string","description":"서버가 발급한 전송 위임 ID입니다. 제출·조회·철회에 사용합니다."},"referenceId":{"type":"string","description":"업무 주문 ID입니다. 같은 지갑에서 재사용할 수 없으며 영문·숫자·밑줄·마침표·콜론·하이픈만 허용합니다."},"status":{"type":"string","enum":["QUEUED","SIGNED","SUBMITTED","CONFIRMING","RECONCILING","CONFIRMED","REJECTED","REVERTED"],"description":"현재 처리 상태입니다. 가능한 값과 API별 처리 흐름을 확인하세요. QUEUED: 서버 전송 대기 / SIGNED: 서버 서명 저장 완료 / SUBMITTED: 체인에 전송 제출 / CONFIRMING: 블록 확인 수 대기 / RECONCILING: 불확실한 제출·결과 재확인 중 / CONFIRMED: 전송 완료 / REJECTED: 전송 제출 전 거절 / REVERTED: 온체인 실행 실패"},"chainId":{"type":"integer","format":"int64","example":97,"description":"체인 식별자입니다. 현재 테스트넷은 97이며 지갑 RPC에서는 0x61을 사용합니다."},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"배포 시 고정된 토큰 컨트랙트 주소입니다."},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"토큰을 수령하는 고정 회사 지갑 주소입니다."},"amountMode":{"type":"string","enum":["ALL","FIXED"],"description":"ALL은 서버가 거래 서명을 준비할 때 조회한 토큰 잔액 전량입니다. FIXED는 지정 수량이며 기존 요청에서 생략하면 FIXED로 처리합니다."},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","example":"20.5","nullable":true,"description":"수량 문자열입니다. 전송 요청·결과는 토큰 단위, 승인 해시 제출 결과는 최소 단위입니다. ALL 요청의 수량 결정 전에는 null입니다. 서명된 거래의 수량은 재시도 시 유지됩니다."},"amountUnits":{"type":"string","pattern":"^[0-9]+$","description":"전송 수량을 토큰 최소 단위로 표현한 정수 문자열입니다. ALL 요청의 수량 결정 전에는 null입니다.","nullable":true},"txHash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","nullable":true,"description":"블록체인 트랜잭션 해시입니다. 아직 서명·제출 전이면 null일 수 있습니다."},"confirmations":{"type":"integer","format":"int64","description":"현재까지 확인한 블록 수입니다."},"blockNumber":{"type":"integer","format":"int64","nullable":true,"description":"트랜잭션이 포함된 블록 번호입니다. 아직 확인되지 않았다면 null일 수 있습니다."},"errorCode":{"type":"string","nullable":true,"description":"비동기 전송 오류 코드입니다. 오류가 없으면 null입니다."}}}}}}