B3 글로벌 계정 상호작용을 위한 권한 및 세션 키 관리
interface Permissions {
approvedTargets: string[]; // 계약 주소
startDate: Date; // 권한이 활성화되는 시점
endDate: Date; // 권한이 만료되는 시점
nativeTokenLimitPerTransaction: number; // 거래당 ETH 한도
// 추가 ERC-20 토큰 한도를 추가할 수 있음
}
import { RequestPermissionsButton } from "@b3dotfun/sdk/global-account/react";
const b3Chain = {
id: 8333,
name: "B3",
nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
rpc: "https://mainnet-rpc.b3.fun",
};
function BasicPermissions() {
const permissions = {
approvedTargets: [
"0x9c275ff1634519E9B5449ec79cd939B5F900564d", // 게임 계약
],
startDate: new Date(),
endDate: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // 30일
nativeTokenLimitPerTransaction: 0.01, // 거래당 0.01 ETH
};
return (
<RequestPermissionsButton
chain={b3Chain}
sessionKeyAddress="0x..." // MetaMask 또는 지갑 주소
permissions={permissions}
onSuccess={() => {
console.log("권한이 성공적으로 부여되었습니다!");
}}
onError={(error) => {
console.error("권한 요청 실패:", error);
}}
/>
);
}
function GamePermissions() {
const gamePermissions = {
approvedTargets: [
"0x...", // 게임 계약
"0x...", // NFT 마켓플레이스
"0x...", // 토큰 계약
],
startDate: new Date(),
endDate: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // 7일
nativeTokenLimitPerTransaction: 0.001, // 가스를 위한 작은 ETH 한도
};
return (
<div className="game-permissions">
<h3>게임 권한 부여</h3>
<p>7일 동안 이 게임이 당신을 대신하여 작업을 수행하도록 허용합니다</p>
<RequestPermissionsButton
chain={b3Chain}
sessionKeyAddress="0x..."
permissions={gamePermissions}
onSuccess={() => {
// 게임으로 리디렉션하거나 UI 업데이트
console.log("게임 권한이 부여되었습니다!");
}}
onError={(error) => {
console.error("게임 권한 부여 실패:", error);
}}
/>
</div>
);
}
import { useRequestPermissions } from "@b3dotfun/sdk/global-account/react";
function CustomPermissionFlow() {
const { requestPermissions, isLoading, error } = useRequestPermissions();
const handlePermissionRequest = async () => {
try {
const result = await requestPermissions({
chain: b3Chain,
sessionKeyAddress: "0x...",
permissions: {
approvedTargets: ["0x..."],
startDate: new Date(),
endDate: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24시간
nativeTokenLimitPerTransaction: 0.005,
},
});
if (result.success) {
console.log("권한이 부여되었습니다:", result.data);
}
} catch (err) {
console.error("권한 요청 실패:", err);
}
};
return (
<div>
<button
onClick={handlePermissionRequest}
disabled={isLoading}
>
{isLoading ? "권한 요청 중..." : "권한 부여"}
</button>
{error && (
<div className="error">
오류: {error.message}
</div>
)}
</div>
);
}
import { usePermissions } from "@b3dotfun/sdk/global-account/react";
function PermissionStatus() {
const { permissions, hasPermissions, isExpired } = usePermissions();
return (
<div className="permission-status">
<h3>권한 상태</h3>
{hasPermissions ? (
<div className="permissions-active">
<p>✅ 권한 활성화됨</p>
<p>만료: {permissions?.endDate.toLocaleDateString()}</p>
<p>승인된 계약: {permissions?.approvedTargets.length}</p>
{isExpired && (
<p className="warning">⚠️ 권한이 만료되었습니다</p>
)}
</div>
) : (
<div className="no-permissions">
<p>❌ 활성화된 권한 없음</p>
<RequestPermissionsButton {...permissionConfig} />
</div>
)}
</div>
);
}
import { useRevokePermissions } from "@b3dotfun/sdk/global-account/react";
function RevokePermissions() {
const { revokePermissions, isLoading } = useRevokePermissions();
const handleRevoke = async () => {
try {
await revokePermissions({
sessionKeyAddress: "0x...",
chain: b3Chain,
});
console.log("권한이 성공적으로 철회되었습니다");
} catch (error) {
console.error("권한 철회 실패:", error);
}
};
return (
<button
onClick={handleRevoke}
disabled={isLoading}
className="revoke-button"
>
{isLoading ? "철회 중..." : "권한 철회"}
</button>
);
}
function DynamicPermissions() {
const [permissionLevel, setPermissionLevel] = useState<'basic' | 'advanced'>('basic');
const getPermissions = (level: string) => {
const basePermissions = {
startDate: new Date(),
endDate: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24시간
};
if (level === 'basic') {
return {
...basePermissions,
approvedTargets: ["0x..."], // 제한된 계약
nativeTokenLimitPerTransaction: 0.001,
};
} else {
return {
...basePermissions,
approvedTargets: ["0x...", "0x...", "0x..."], // 더 많은 계약
nativeTokenLimitPerTransaction: 0.01,
};
}
};
return (
<div>
<div className="permission-selector">
<button
onClick={() => setPermissionLevel('basic')}
className={permissionLevel === 'basic' ? 'active' : ''}
>
기본 권한
</button>
<button
onClick={() => setPermissionLevel('advanced')}
className={permissionLevel === 'advanced' ? 'active' : ''}
>
고급 권한
</button>
</div>
<RequestPermissionsButton
chain={b3Chain}
sessionKeyAddress="0x..."
permissions={getPermissions(permissionLevel)}
onSuccess={() => console.log(`${permissionLevel} 권한이 부여되었습니다`)}
/>
</div>
);
}
function PermissionErrorHandling() {
const handlePermissionError = (error: Error) => {
switch (error.message) {
case 'USER_REJECTED':
console.log('사용자가 권한 요청을 거부했습니다');
break;
case 'INSUFFICIENT_PERMISSIONS':
console.log('요청된 권한이 한도를 초과합니다');
break;
case 'EXPIRED_SESSION':
console.log('세션 키가 만료되었습니다');
// 새 권한 요청
break;
default:
console.error('알 수 없는 권한 오류:', error);
}
};
return (
<RequestPermissionsButton
// ... 다른 props
onError={handlePermissionError}
/>
);
}