From 83c583c04d77d8ad923af6d5ab17f16ee0845749 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Thu, 19 Mar 2026 11:28:38 +0900 Subject: [PATCH] =?UTF-8?q?Fix:=20=EC=A7=80=EA=B0=91=20=EB=AF=B8=EB=B0=9C?= =?UTF-8?q?=EA=B2=AC=20=EC=8B=9C=20=EC=9E=90=EB=8F=99=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20fallback=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolveUsername()에서 user_wallets 레코드가 없는 유저(레거시/마이그레이션 누락)에 대해 CreateWallet을 자동 호출하여 지갑을 즉시 생성. unique constraint 충돌 시 재조회로 동시성 안전 처리. Co-Authored-By: Claude Opus 4.6 (1M context) --- internal/chain/service.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/internal/chain/service.go b/internal/chain/service.go index ef75e4a..111128d 100644 --- a/internal/chain/service.go +++ b/internal/chain/service.go @@ -34,6 +34,8 @@ func (s *Service) SetUserResolver(fn func(username string) (uint, error)) { } // resolveUsername converts a username to the user's on-chain pubKeyHex. +// If the user exists but has no wallet (e.g. legacy user or failed creation), +// a wallet is auto-created on the fly. func (s *Service) resolveUsername(username string) (string, error) { if s.userResolver == nil { return "", fmt.Errorf("user resolver not configured") @@ -44,7 +46,17 @@ func (s *Service) resolveUsername(username string) (string, error) { } uw, err := s.repo.FindByUserID(userID) if err != nil { - return "", fmt.Errorf("wallet not found") + // 지갑이 없으면 자동 생성 시도 + uw, err = s.CreateWallet(userID) + if err != nil { + // unique constraint 위반 — 다른 고루틴이 먼저 생성 완료 + uw, err = s.repo.FindByUserID(userID) + if err != nil { + return "", fmt.Errorf("wallet auto-creation failed: %w", err) + } + } else { + log.Printf("INFO: auto-created wallet for userID=%d (username=%s)", userID, username) + } } return uw.PubKeyHex, nil }