Skip to content

Commit 50cb213

Browse files
committed
fix: accept non-checksummed addresses in voter import and manual entry
1 parent 62db790 commit 50cb213

3 files changed

Lines changed: 16 additions & 5 deletions

File tree

src/app/flow-councils/membership/VoterTable.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ export default function VoterTable(props: VoterTableProps) {
302302
const addr = row.address.trim().toLowerCase();
303303

304304
if (
305-
!isAddress(row.address.trim()) ||
305+
!isAddress(row.address.trim(), { strict: false }) ||
306306
!isValidVotes(row.votes) ||
307307
existingOnchainSet.has(addr) ||
308308
seen.has(addr)
@@ -331,7 +331,7 @@ export default function VoterTable(props: VoterTableProps) {
331331
continue;
332332
}
333333

334-
if (!isAddress(address)) {
334+
if (!isAddress(address, { strict: false })) {
335335
errors[row.id] = "Invalid address";
336336
} else if (existingOnchainSet.has(addr)) {
337337
errors[row.id] = "Already a voter";
@@ -341,7 +341,7 @@ export default function VoterTable(props: VoterTableProps) {
341341
errors[row.id] = "Votes must be 1–1M";
342342
}
343343

344-
if (isAddress(address)) {
344+
if (isAddress(address, { strict: false })) {
345345
seen.add(addr);
346346
}
347347
}
@@ -654,7 +654,7 @@ export default function VoterTable(props: VoterTableProps) {
654654
// so a paused/failed queue never resets the council-wide spread.
655655
const entries = [
656656
...validNewRows.map((row) => ({
657-
account: row.address as Address,
657+
account: row.address.toLowerCase() as Address,
658658
votingPower: BigInt(row.votes),
659659
votes: [] as [],
660660
})),

src/app/flow-councils/membership/voterCsv.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ describe("computeCsvSync", () => {
7070
expect(result.nextNew).toEqual([{ address: C.toLowerCase(), votes: "5" }]);
7171
expect(result.skipped).toBe(2);
7272
});
73+
74+
it("accepts well-formed addresses regardless of EIP-55 checksum casing", () => {
75+
const nonChecksummed = "0x388C818CA8B9251B393131C08A736A67CCB19297";
76+
77+
const result = computeCsvSync([[nonChecksummed, "5"]], [], new Set(), 10);
78+
79+
expect(result.nextNew).toEqual([
80+
{ address: nonChecksummed.toLowerCase(), votes: "5" },
81+
]);
82+
expect(result.skipped).toBe(0);
83+
});
7384
});
7485

7586
describe("buildCsvRows", () => {

src/app/flow-councils/membership/voterCsv.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export function computeCsvSync(
4242
continue;
4343
}
4444

45-
if (!isAddress(address)) {
45+
if (!isAddress(address, { strict: false })) {
4646
skipped++;
4747
continue;
4848
}

0 commit comments

Comments
 (0)