From 18c191ba550a108f76981daf33b90b8f12e7b4b7 Mon Sep 17 00:00:00 2001 From: Nasr Date: Tue, 23 Dec 2025 13:13:05 -0600 Subject: [PATCH 1/2] feat(session): spending limit step for register session --- .../components/connect/RegisterSession.tsx | 84 +++++++++++++++---- 1 file changed, 67 insertions(+), 17 deletions(-) diff --git a/packages/keychain/src/components/connect/RegisterSession.tsx b/packages/keychain/src/components/connect/RegisterSession.tsx index 2a8f1d47e..e07f1cfc1 100644 --- a/packages/keychain/src/components/connect/RegisterSession.tsx +++ b/packages/keychain/src/components/connect/RegisterSession.tsx @@ -9,6 +9,7 @@ import { type ContractType, type ParsedSessionPolicies, useCreateSession, + hasApprovalPolicies, } from "@/hooks/session"; import { Button, LayoutContent, SliderIcon } from "@cartridge/ui"; import { useCallback, useEffect, useMemo, useState } from "react"; @@ -18,6 +19,7 @@ import { TransactionExecutionStatus, TransactionFinalityStatus, } from "starknet"; +import { SpendingLimitPage } from "./SpendingLimitPage"; const requiredPolicies: Array = ["VRF"]; @@ -52,9 +54,28 @@ const RegisterSessionLayout = ({ const [transactions, setTransactions] = useState( undefined, ); + const [isConnecting, setIsConnecting] = useState(false); + const [error, setError] = useState(); const { duration, isEditable, onToggleEditable } = useCreateSession(); + const hasTokenApprovals = useMemo( + () => hasApprovalPolicies(policies), + [policies], + ); + + const defaultStep = useMemo<"summary" | "spending-limit">(() => { + return policies?.verified && hasTokenApprovals + ? "spending-limit" + : "summary"; + }, [policies?.verified, hasTokenApprovals]); + + const [step, setStep] = useState<"summary" | "spending-limit">(defaultStep); + + useEffect(() => { + setStep(defaultStep); + }, [defaultStep]); + const expiresAt = useMemo(() => { return duration + now(); }, [duration]); @@ -83,31 +104,60 @@ const RegisterSessionLayout = ({ return; } - const { transaction_hash } = await controller.registerSession( - origin, - expiresAt, - policies, - publicKey, - maxFee, - ); - - await controller.provider.waitForTransaction(transaction_hash, { - retryInterval: 1000, - successStates: [ - TransactionExecutionStatus.SUCCEEDED, - TransactionFinalityStatus.ACCEPTED_ON_L2, - ], - }); - - onConnect(transaction_hash, expiresAt); + try { + setError(undefined); + setIsConnecting(true); + + const { transaction_hash } = await controller.registerSession( + origin, + expiresAt, + policies, + publicKey, + maxFee, + ); + + await controller.provider.waitForTransaction(transaction_hash, { + retryInterval: 1000, + successStates: [ + TransactionExecutionStatus.SUCCEEDED, + TransactionFinalityStatus.ACCEPTED_ON_L2, + ], + }); + + onConnect(transaction_hash, expiresAt); + } catch (e) { + setError(e as Error); + } finally { + setIsConnecting(false); + } }, [controller, expiresAt, policies, publicKey, onConnect, origin], ); + // Handler for the spending limit page to proceed to registration + const handleSpendingLimitConfirm = useCallback(() => { + if (hasTokenApprovals && step === "spending-limit") { + setStep("summary"); + } + }, [hasTokenApprovals, step]); + if (!transactions) { return
Loading
; } + // Show spending limit page for verified sessions with token approvals + if (hasTokenApprovals && step === "spending-limit") { + return ( + setStep("summary")} + onConnect={handleSpendingLimitConfirm} + /> + ); + } + return ( Date: Thu, 8 Jan 2026 13:40:18 -0600 Subject: [PATCH 2/2] tool versions --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 7e8570371..18e382571 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ scarb 2.9.4 starknet-foundry 0.38.3 -nodejs v20.11.1 +nodejs 20.19.5