"use client";
import { Connector } from "wagmi";
import { SignInWithBaseButton } from "@base-org/account-ui/react";
import { useState } from "react";
interface SignInWithBaseProps {
connector: Connector;
}
export function SignInWithBase({ connector }: SignInWithBaseProps) {
const [verificationResult, setVerificationResult] = useState<string>("");
async function handleBaseAccountConnect() {
const provider = await connector.getProvider();
if (provider) {
try {
// 새로운 nonce 생성 (백엔드 nonce로 덮어씌워질 예정)
const clientNonce =
Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15);
console.log("clientNonce", clientNonce);
// 서명, 메시지, 주소를 가져오기 위해 SIWE로 연결
const accounts = await (provider as any).request({
method: "wallet_connect",
params: [
{
version: "1",
capabilities: {
signInWithEthereum: {
nonce: clientNonce,
chainId: "0x2105", // Base 메인넷 - 8453
},
},
},
],
});
// 백엔드에서 서명 검증
/*
const walletAddress = accounts.accounts[0].address;
const signature =
accounts.accounts[0].capabilities.signInWithEthereum.signature;
const message =
accounts.accounts[0].capabilities.signInWithEthereum.message;
const verifyResponse = await fetch("/api/auth/verify", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
address: walletAddress,
message,
signature,
}),
});
const result = await verifyResponse.json();
*/
const result={success:true, address:accounts[0].address} // 목업 응답
if (result.success) {
setVerificationResult(`검증 완료! 주소: ${result.address}`);
} else {
setVerificationResult(`검증 실패: ${result.error}`);
}
} catch (err) {
console.error("Error:", err);
setVerificationResult(
`오류: ${err instanceof Error ? err.message : "알 수 없는 오류"}`
);
}
} else {
console.error("No provider");
}
}
return (
<div>
<div style={{ width: "300px" }}>
<SignInWithBaseButton
onClick={handleBaseAccountConnect}
variant="solid"
colorScheme="system"
align="center"
/>
</div>
{verificationResult && (
<div style={{ marginTop: "10px" }}>{verificationResult}</div>
)}
</div>
);
}