diff --git a/src/components/AddressDisplay.test.tsx b/src/components/AddressDisplay.test.tsx
index ed5a5ec..a35ab64 100644
--- a/src/components/AddressDisplay.test.tsx
+++ b/src/components/AddressDisplay.test.tsx
@@ -66,6 +66,75 @@ describe("AddressDisplay", () => {
});
});
+ // ── Copied state reset (#556) ───────────────────────────────────────────
+ describe("copied state reset (#556)", () => {
+ it("keeps 'Address copied' until the 2s timeout, then resets", async () => {
+ vi.useFakeTimers();
+ render();
+ await act(async () => {
+ fireEvent.click(screen.getByRole("button", { name: "Copy address to clipboard" }));
+ });
+
+ // Immediately after a successful copy the label flips to "Copied".
+ expect(
+ screen.getByRole("button", { name: "Address copied" }),
+ ).toBeInTheDocument();
+
+ // Still copied just before the 2s window elapses…
+ act(() => {
+ vi.advanceTimersByTime(1999);
+ });
+ expect(
+ screen.getByRole("button", { name: "Address copied" }),
+ ).toBeInTheDocument();
+
+ // …and back to the resting label the moment it elapses.
+ act(() => {
+ vi.advanceTimersByTime(1);
+ });
+ expect(
+ screen.getByRole("button", { name: "Copy address to clipboard" }),
+ ).toBeInTheDocument();
+
+ vi.useRealTimers();
+ });
+
+ it("resets the 2s window when copy is triggered again mid-window", async () => {
+ vi.useFakeTimers();
+ render();
+
+ await act(async () => {
+ fireEvent.click(screen.getByRole("button", { name: "Copy address to clipboard" }));
+ });
+ act(() => {
+ vi.advanceTimersByTime(1500);
+ });
+ expect(
+ screen.getByRole("button", { name: "Address copied" }),
+ ).toBeInTheDocument();
+
+ // Copy again — the label must stay "Address copied" for a fresh full 2s.
+ await act(async () => {
+ fireEvent.click(screen.getByRole("button", { name: "Address copied" }));
+ });
+ act(() => {
+ vi.advanceTimersByTime(1500);
+ });
+ expect(
+ screen.getByRole("button", { name: "Address copied" }),
+ ).toBeInTheDocument();
+
+ act(() => {
+ vi.advanceTimersByTime(500);
+ });
+ expect(
+ screen.getByRole("button", { name: "Copy address to clipboard" }),
+ ).toBeInTheDocument();
+
+ vi.useRealTimers();
+ });
+ });
+
describe("masked prop", () => {
it("shows GBAM···QQQQ format when masked is true", () => {
render();