1. 사용자 관리

sequenceDiagram
    actor User
    participant Client
    participant MetaMask
    participant Server

    User->>Client: 로그인 시도
    Client->>MetaMask: MetaMask 연결 요청
    MetaMask-->>Client: 연결 승인

    alt 자동 로그인
        Client->>Server: 자동 로그인 요청
        Server-->>Client: 로그인 성공 (Access Token, Refresh Token 발급)
    else 계정 확인
        Client->>Server: 계정 존재 확인
        alt 계정 존재
            Server-->>Client: 계정 확인됨
            Client->>Server: 로그인 요청
            Server-->>Client: Access Token, Refresh Token 발급
        else 계정 미존재
            Server-->>Client: 계정 없음
            Client->>Client: 회원가입 화면으로 이동
            User->>Client: 프로필 사진, 닉네임 입력
            Client->>Server: 회원가입 요청
            Server-->>Client: 회원가입 완료 및 Access Token, Refresh Token 발급
        end
    end

    Client-->>User: 로그인/회원가입 완료

    Note over User,Server: Access Token 만료 시

    Client->>Server: 리소스 요청 (만료된 Access Token 사용)
    Server-->>Client: 401 Unauthorized
    Client->>Server: Refresh Token으로 새 Access Token 요청
    Server-->>Client: 새 Access Token 발급

    Note over User,Server: 로그아웃 프로세스

    User->>Client: 로그아웃 요청
    Client->>Server: 로그아웃 요청 (Refresh Token 무효화)
    Server-->>Client: 로그아웃 확인
    Client->>Client: MetaMask 계정 정보 삭제
    Client->>Client: Access Token, Refresh Token 삭제
    Client-->>User: 로그아웃 완료

2. 경매

sequenceDiagram
    actor U as 경매등록 사용자
    participant S as Server
    actor V as 투표자 (일반 사용자)
    actor B as 입찰자 (경매 참가자)
		
    S->>U: 1. 단기경매 후보 등록 시작 (24시간)
    
    loop 1일차 00:00 ~ 24:00
        U->>S: 단기경매 후보 등록
    end
    
    S->>V: 2. 투표 시작 (24시간)
    
    loop 2일차 00:00 ~ 24:00
        V->>S: 투표 진행
    end
    
    S->>S: 득표 상위 5개 후보 선정
 
    loop
		    S->>B: 5. 경매 시작 (16:00 ~ 21:00) (1시간 단위로 15분씩)
		    loop 15분    
			    alt 충분한 코인 보유
					    B->>S: 6. 가격 입찰 (코인 지불)
			        S->>S: 입찰가 갱신
			        alt 마지막 10초 동안 새 입찰 있음
			            S->>S: 7. 시간 10초로 리셋
			        else 마지막 10초 동안 새 입찰 없음
			            S->>S: 8. 경매 종료
			        end
			    else 코인 부족
					    S->>B: 입찰 실패
			    end
		    end
    end
    S->>B: 낙찰자 선정 및 NFT 전송
    S->>U: 입찰 코인 전송

2-2. 장기 경매

sequenceDiagram
    actor U as 경매등록 사용자
    participant S as Server
    actor B as 입찰자

    U->>S: 1. 장기경매 등록 (경매 기간 선택 (1일/3일/7일))
    S->>B: 경매 시작
    
    loop 경매 기간
		    alt 충분한 코인 보유
				    B->>S: 2. 언제든지 가격 입찰
		        S->>S: 입찰가 갱신
		    
				    alt 마지막 1분 동안 새 입찰 있음
		            S->>S: 3. 시간 1분으로 리셋
		        else 마지막 1분 동안 새 입찰 없음
		            S->>S: 4. 경매 종료
		        end
		    else 코인 부족
				    S->>B: 입찰 실패
		    end
    end
    
    S->>B: 5. 낙찰자 선정 및 NFT 전송
    S->>U: 입찰 코인 전송

3. NFT 제작

sequenceDiagram
    actor User
    participant Client
    participant AIServer as AI Server
    participant Server
    participant MetaMask
	
    alt AI로 이미지 새로 생성
        User->>Client: 스케치 그리기 및 프롬프트 입력
        Client->>AIServer: 스케치와 프롬프트 전송
        AIServer->>AIServer: AI로 에셋 생성
    else 직접 이미지 선택
        User->>Client: 이미지 선택
        Client->>AIServer: 선택한 이미지 전송
        AIServer->>AIServer: 이미지 편집
    end
    AIServer->>Server: 생성된 에셋 전송
    Server->>Server: 에셋 저장
    Server-->>Client: 저장된 에셋 전송
    User->>Client: 프레임 꾸미기
    Client->>Client: 프레임 생성
    Client->>Server: 프레임 NFT화 요청
    Server->>MetaMask: NFT 생성 트랜잭션 요청
    MetaMask-->>User: 트랜잭션 확인 요청
    User-->>MetaMask: 트랜잭션 승인
    MetaMask->>MetaMask: NFT 생성
    MetaMask-->>User: NFT 생성 완료 알림

4. 코인 거래

sequenceDiagram
    actor 유저
    participant Server
    participant MetaMask
    # participant 은행

    유저->>Server: 코인 구매 요청
    Server->>Server: 결제 확인

    alt 결제 성공
        Server->>MetaMask: MetaMask에 코인 요청
        MetaMask-->>Server: 코인 지급 완료
        Server-->>유저: 구매 완료 알림
    else 결제 실패
        Server-->>유저: 결제 실패 알림
        유저->>Server: 결제 재시도 또는 취소
    end

    유저->>Server: 코인 환급 요청
    Server->>MetaMask: MetaMask에 코인 환수 트랜잭션 요청
    MetaMask-->>유저: 코인 환수 트랜잭션 요청
    유저-->>MetaMask: 코인 환수 트랜잭션 승인
    MetaMask-->>Server: 코인 환수 완료
    Server-->>유저: 현금 지급

5. NFT 거래

5-1. NFT 판매

sequenceDiagram
    actor User
    participant Marketplace as Server
    participant MetaMask

    Note over User,MetaMask: MetaMask 계정이 이미 연결된 상태

    User->>Marketplace: NFT(프레임) 판매 요청
    User->>Marketplace: 프레임 업로드 및 판매 정보 입력 (가격 등)
    Marketplace->>MetaMask: 판매 트랜잭션 서명 요청
    MetaMask-->>User: 트랜잭션 확인 요청
    User-->>MetaMask: 트랜잭션 승인
    MetaMask-->>Marketplace: 서명된 트랜잭션 전송
    Marketplace->>Marketplace: NFT 판매 목록에 등록
    Marketplace-->>User: NFT 판매 등록 완료 확인

5-2. NFT 구매

sequenceDiagram
    actor User
    participant Marketplace as Server
    participant MetaMask

    Note over User,MetaMask: MetaMask 계정이 이미 연결된 상태

    User->>Marketplace: NFT(프레임) 구매 요청
    Marketplace->>MetaMask: 구매 가능 코인 잔액 확인
    MetaMask-->>Marketplace: 코인 잔액 정보 전송
    alt 충분한 코인 잔액
        Marketplace->>MetaMask: 구매 트랜잭션 서명 요청
        MetaMask-->>User: 트랜잭션 확인 요청
        User-->>MetaMask: 트랜잭션 승인
        MetaMask-->>Marketplace: 서명된 트랜잭션 전송
        Marketplace->>Marketplace: NFT 소유권 이전
        Marketplace-->>User: NFT 구매 완료 확인
    else 불충분한 코인 잔액
        Marketplace-->>User: 구매 불가 메시지 (잔액 부족)
    end

6. 에셋 거래

sequenceDiagram
    actor  C as 제작자
    actor  U as 구매자
    participant S as Server
    participant M as MetaMask

    C->>S: 1. 에셋 등록 (가격 지정)
    U->>S: 2. 에셋 검색 및 선택
    U->>S: 3. 에셋 구매 요청
    S->>M: 4. 코인 잔액 확인 요청
    M-->>S: 5. 코인 잔액 정보 전송

    alt 충분한 코인
        S->>M: 6. 코인 전송 요청 (구매자 -> 시스템)
        M-->>U: 7. 거래 승인 요청
        U-->>M: 8. 거래 승인
        M->>S: 9. 코인 전송 완료
        S->>U: 10. 에셋 전달 및 권한 부여
        S->>M: 11. 코인 전송 요청 (시스템 -> 제작자)
        M->>C: 12. 결제 금액 전달
        S-->>U: 13. 구매 완료 알림
        S-->>C: 14. 판매 완료 알림
    else 코인 부족
        S-->>U: 6. 결제 거부 (잔액 부족)
        S-->>U: 7. 구매 실패 알림
    end