diff --git a/app/src/components/ClaimSection.tsx b/app/src/components/ClaimSection.tsx
index bc8905f..c405081 100644
--- a/app/src/components/ClaimSection.tsx
+++ b/app/src/components/ClaimSection.tsx
@@ -21,15 +21,16 @@ export function ClaimSection({
real member without revealing which one.
diff --git a/app/src/components/MemberRing.tsx b/app/src/components/MemberRing.tsx
index 86e21f4..3e0387f 100644
--- a/app/src/components/MemberRing.tsx
+++ b/app/src/components/MemberRing.tsx
@@ -2,11 +2,13 @@
// as "the one that claimed" — that's the point. From outside the ring, all
// five remain equally plausible; only the demo operator (via the radio
// picker below) ever knows which one actually did.
+import type { Member } from "../types.js";
+
export function MemberRing({
members,
revealed,
}: {
- members: { funded: boolean }[];
+ members: Member[];
revealed: boolean;
}) {
const radius = 100;
@@ -21,10 +23,11 @@ export function MemberRing({
return (
- {i + 1}
+ {m.ineligible ? "×" : i + 1}
);
})}
diff --git a/app/src/types.ts b/app/src/types.ts
index a269d26..4ff49c6 100644
--- a/app/src/types.ts
+++ b/app/src/types.ts
@@ -6,6 +6,8 @@ export interface Member {
identity: Identity;
funded: boolean;
fundHash?: string;
+ ineligible?: boolean;
+ ineligibleReason?: string;
}
export interface ClaimResult {
diff --git a/packages/client/src/contract.ts b/packages/client/src/contract.ts
index 5fe4149..e838c07 100644
--- a/packages/client/src/contract.ts
+++ b/packages/client/src/contract.ts
@@ -246,10 +246,12 @@ export async function hasClaimed(
circleId: bigint,
nullifierHash: bigint,
): Promise {
- const tx = await withRetry(() => client.has_claimed({
+ // `has_claimed` is a pure read — don't submit or force a transaction.
+ // The SDK returns the raw result for read-only contract calls, so just
+ // invoke it and return the boolean directly.
+ const res = await withRetry(() => client.has_claimed({
circle_id: circleId,
nullifier_hash: nullifierHash,
}));
- const sent = await tx.signAndSend({ force: true });
- return sent.result;
+ return res as boolean;
}