Skip to content

Commit fef3614

Browse files
committed
fix: use correct types
still filtering
1 parent 61513a2 commit fef3614

File tree

2 files changed

+101
-8
lines changed

2 files changed

+101
-8
lines changed

packages/auth-server/components/session/row/Row.vue

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22
<div class="session-row">
33
<div class="session-id-container">
44
<div
5+
v-if="sessionHash"
56
:title="sessionHash"
67
class="truncate"
78
>
89
{{ sessionHash.slice(0, 10) }}...{{ sessionHash.slice(-8) }}
910
</div>
10-
<div class="session-signer text-xs text-neutral-500">
11+
<div
12+
v-if="sessionSpec?.signer"
13+
class="session-signer text-xs text-neutral-500"
14+
>
1115
Signer: {{ sessionSpec.signer.slice(0, 6) }}...{{ sessionSpec.signer.slice(-4) }}
1216
</div>
1317
</div>
@@ -91,7 +95,7 @@ const {
9195
} = useAsync(async () => {
9296
const client = getPublicClient({ chainId: defaultChain.id });
9397
const res = await client.readContract({
94-
address: contractsByChain[defaultChain.id].session,
98+
address: contractsByChain[defaultChain.id].sessionValidator,
9599
abi: SessionKeyValidatorAbi,
96100
functionName: "sessionState",
97101
args: [address.value!, props.sessionSpec],

packages/auth-server/pages/dashboard/sessions.vue

Lines changed: 95 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,90 @@
8383

8484
<script setup lang="ts">
8585
import { InformationCircleIcon } from "@heroicons/vue/20/solid";
86-
import type { Hex } from "viem";
86+
import type { Address, Hex } from "viem";
8787
import { 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
9090
const { defaultChain } = useClientStore();
9191
const { 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+
93170
const {
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
124213
sessionsFetch();

0 commit comments

Comments
 (0)