@frak-labs/core-sdk
Version:
Core SDK of the Frak wallet, low level library to interact directly with the frak ecosystem.
165 lines (139 loc) • 5.48 kB
text/typescript
import { vi } from "vitest";
vi.mock("../displayModal", () => ({
displayModal: vi.fn(),
}));
import type { Address, Hex } from "viem";
import { describe, expect, it } from "../../../tests/vitest-fixtures";
import type { FrakClient } from "../../types";
import { sendTransaction } from "./sendTransaction";
describe("sendTransaction", () => {
const mockClient = {
config: {
metadata: {
name: "Test App",
},
},
request: vi.fn(),
} as unknown as FrakClient;
describe("basic usage", () => {
it("should call displayModal with correct params for single tx", async () => {
const { displayModal } = await import("../displayModal");
const mockTxHash =
"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890" as Hex;
vi.mocked(displayModal).mockResolvedValue({
login: {
wallet: "0x1234567890123456789012345678901234567890" as Address,
},
sendTransaction: { hash: mockTxHash },
} as any);
const txParams = {
to: "0x1234567890123456789012345678901234567890" as Address,
data: "0xdeadbeef" as Hex,
};
await sendTransaction(mockClient, { tx: txParams });
expect(displayModal).toHaveBeenCalledWith(mockClient, {
metadata: undefined,
steps: {
login: {},
sendTransaction: { tx: txParams },
},
});
});
it("should return transaction hash", async () => {
const { displayModal } = await import("../displayModal");
const mockTxHash =
"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890" as Hex;
vi.mocked(displayModal).mockResolvedValue({
login: {
wallet: "0x1234567890123456789012345678901234567890" as Address,
},
sendTransaction: { hash: mockTxHash },
} as any);
const result = await sendTransaction(mockClient, {
tx: {
to: "0x1234567890123456789012345678901234567890" as Address,
},
});
expect(result).toEqual({ hash: mockTxHash });
});
});
describe("batched transactions", () => {
it("should handle multiple transactions", async () => {
const { displayModal } = await import("../displayModal");
const mockTxHash =
"0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890" as Hex;
vi.mocked(displayModal).mockResolvedValue({
login: {},
sendTransaction: { hash: mockTxHash },
} as any);
const txParams = [
{
to: "0x1234567890123456789012345678901234567890" as Address,
data: "0xdata1" as Hex,
},
{
to: "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd" as Address,
data: "0xdata2" as Hex,
},
];
await sendTransaction(mockClient, { tx: txParams });
expect(displayModal).toHaveBeenCalledWith(mockClient, {
metadata: undefined,
steps: {
login: {},
sendTransaction: { tx: txParams },
},
});
});
});
describe("with metadata", () => {
it("should pass metadata to displayModal", async () => {
const { displayModal } = await import("../displayModal");
vi.mocked(displayModal).mockResolvedValue({
login: {},
sendTransaction: { hash: "0x123" as Hex },
} as any);
const metadata = {
header: {
title: "Send ETH",
icon: "https://example.com/icon.png",
},
context: "Send 100 wei to recipient",
};
await sendTransaction(mockClient, {
tx: {
to: "0x1234567890123456789012345678901234567890" as Address,
value: "0x64" as Hex,
},
metadata,
});
expect(displayModal).toHaveBeenCalledWith(mockClient, {
metadata,
steps: {
login: {},
sendTransaction: {
tx: {
to: "0x1234567890123456789012345678901234567890",
value: "0x64",
},
},
},
});
});
});
describe("error handling", () => {
it("should propagate errors from displayModal", async () => {
const { displayModal } = await import("../displayModal");
vi.mocked(displayModal).mockRejectedValue(
new Error("Transaction rejected")
);
await expect(
sendTransaction(mockClient, {
tx: {
to: "0x1234567890123456789012345678901234567890" as Address,
},
})
).rejects.toThrow("Transaction rejected");
});
});
});