8383
8484<script setup lang="ts">
8585import { InformationCircleIcon } from " @heroicons/vue/20/solid" ;
86- import type { Hex } from " viem" ;
86+ import type { Address , Hex } from " viem" ;
8787import { listActiveSessions } from " zksync-sso-4337" ;
88- import type { SessionConfig } from " zksync-sso-4337/client" ;
88+ import { LimitType , type SessionConfig } from " zksync-sso-4337/client" ;
8989
9090const { defaultChain } = useClientStore ();
9191const { address } = storeToRefs (useAccountStore ());
9292
93+ // Types for WASM-returned session data (snake_case with string values)
94+ interface WasmUsageLimit {
95+ limitType: string ;
96+ limit: string ;
97+ period: string ;
98+ }
99+
100+ interface WasmConstraint {
101+ condition: string ;
102+ index: string ;
103+ refValue: Hex ;
104+ limit: WasmUsageLimit ;
105+ }
106+
107+ interface WasmCallPolicy {
108+ target: Address ;
109+ selector: Hex ;
110+ maxValuePerUse: string ;
111+ valueLimit: WasmUsageLimit ;
112+ constraints? : WasmConstraint [];
113+ }
114+
115+ interface WasmTransferPolicy {
116+ target: Address ;
117+ maxValuePerUse: string ;
118+ valueLimit: WasmUsageLimit ;
119+ }
120+
121+ interface WasmSessionSpec {
122+ signer: Address ;
123+ expiresAt: string ;
124+ feeLimit: WasmUsageLimit ;
125+ callPolicies? : WasmCallPolicy [];
126+ transferPolicies? : WasmTransferPolicy [];
127+ }
128+
129+ // Helper to convert WASM session spec format to proper TypeScript types
130+ const convertSessionSpec = (wasmSpec : WasmSessionSpec ): SessionConfig => {
131+ const convertLimit = (limit : WasmUsageLimit ) => {
132+ // Map string limitType to enum value
133+ let limitType: LimitType ;
134+ if (limit .limitType === " Unlimited" ) limitType = LimitType .Unlimited ;
135+ else if (limit .limitType === " Lifetime" ) limitType = LimitType .Lifetime ;
136+ else if (limit .limitType === " Allowance" ) limitType = LimitType .Allowance ;
137+ else limitType = Number (limit .limitType ) as LimitType ;
138+
139+ return {
140+ limitType ,
141+ limit: BigInt (limit .limit ),
142+ period: BigInt (limit .period ),
143+ };
144+ };
145+
146+ return {
147+ signer: wasmSpec .signer ,
148+ expiresAt: BigInt (wasmSpec .expiresAt ),
149+ feeLimit: convertLimit (wasmSpec .feeLimit ),
150+ callPolicies: (wasmSpec .callPolicies || []).map ((policy : WasmCallPolicy ) => ({
151+ target: policy .target ,
152+ selector: policy .selector ,
153+ maxValuePerUse: BigInt (policy .maxValuePerUse ),
154+ valueLimit: convertLimit (policy .valueLimit ),
155+ constraints: (policy .constraints || []).map ((constraint : WasmConstraint ) => ({
156+ condition: constraint .condition ,
157+ index: BigInt (constraint .index ),
158+ refValue: constraint .refValue ,
159+ limit: convertLimit (constraint .limit ),
160+ })),
161+ })),
162+ transferPolicies: (wasmSpec .transferPolicies || []).map ((policy : WasmTransferPolicy ) => ({
163+ target: policy .target ,
164+ maxValuePerUse: BigInt (policy .maxValuePerUse ),
165+ valueLimit: convertLimit (policy .valueLimit ),
166+ })),
167+ };
168+ };
169+
93170const {
94171 result : sessions,
95172 inProgress : sessionsInProgress,
@@ -115,10 +192,22 @@ const {
115192 },
116193 });
117194
118- return activeSessions .map ((item : { sessionHash: Hex ; sessionSpec: SessionConfig }) => ({
119- sessionHash: item .sessionHash ,
120- sessionSpec: item .sessionSpec ,
121- }));
195+ // Map snake_case properties from WASM to camelCase and convert types
196+ const filtered = activeSessions
197+ .filter ((item : { session_hash? : Hex ; session_spec? : WasmSessionSpec }) => {
198+ const isValid = item ?.session_hash && item ?.session_spec && item ?.session_spec ?.signer ;
199+ if (! isValid ) {
200+ // eslint-disable-next-line no-console
201+ console .warn (" [sessions.vue] Filtering out invalid session:" , item );
202+ }
203+ return isValid ;
204+ })
205+ .map ((item : { session_hash: Hex ; session_spec: WasmSessionSpec }) => ({
206+ sessionHash: item .session_hash ,
207+ sessionSpec: convertSessionSpec (item .session_spec ),
208+ }));
209+
210+ return filtered ;
122211});
123212
124213sessionsFetch ();
0 commit comments