Skip to content

Commit b67f93e

Browse files
committed
feat: refactor background service and handlers for Kaspa integration
1 parent 78e0b74 commit b67f93e

27 files changed

+105
-109
lines changed

api/background/background-service.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import { connectHandler } from "@/api/background/handlers/connect";
2-
import { getAccountHandler } from "@/api/background/handlers/getAccount";
3-
import { signAndBroadcastTxHandler } from "@/api/background/handlers/signAndBroadcastTx";
4-
import { signTxHandler } from "@/api/background/handlers/signTx";
1+
import { connectHandler } from "@/api/background/handlers/kaspa/connect";
2+
import { getAccountHandler } from "@/api/background/handlers/kaspa/getAccount";
3+
import { signAndBroadcastTxHandler } from "@/api/background/handlers/kaspa/signAndBroadcastTx";
4+
import { signTxHandler } from "@/api/background/handlers/kaspa/signTx";
55
import {
66
Action,
77
ApiRequestWithHostSchema,
88
ApiResponseSchema,
99
} from "@/api/message";
1010
import { getNetwork } from "@/api/background/handlers/get-network.ts";
1111
import { ethereumRequestHandler } from "@/api/background/handlers/ethereum/request";
12-
import { signMessageHandler } from "@/api/background/handlers/signMessage";
12+
import { signMessageHandler } from "@/api/background/handlers/kaspa/signMessage";
1313

1414
export class BackgroundService {
1515
public listen(): void {

api/background/handlers/ethereum/sendTransaction.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,28 @@ import {
33
RpcError,
44
RPC_ERRORS,
55
RpcRequestSchema,
6-
ethereumTransactionRequestSchema,
76
} from "@/api/message";
87
import { ApiUtils } from "@/api/background/utils";
98
import { isMatchCurrentAddress, isUserDeniedResponse } from "./utils";
9+
import { isAddress, isHex } from "viem";
10+
import { z } from "zod";
11+
12+
export const ethereumTransactionRequestSchema = z.object({
13+
from: z.string().refine(isAddress, "Must be a valid Ethereum address"),
14+
to: z.string().refine(isAddress, "Must be a valid Ethereum address"),
15+
value: z.string().refine(isHex, "Value must be a hex string").optional(),
16+
data: z.string().refine(isHex, "Data must be a hex string").optional(),
17+
maxFeePerGas: z
18+
.string()
19+
.refine(isHex, "Max fee per gas must be a hex string")
20+
.optional(),
21+
maxPriorityFeePerGas: z
22+
.string()
23+
.refine(isHex, "Max priority fee must be a hex string")
24+
.optional(),
25+
});
26+
27+
// ================================================================================
1028

1129
export const sendTransactionHandler = async (
1230
tabId: number,
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
1-
import { ApiRequestWithHost, ConnectPayloadSchema } from "@/api/message";
1+
import { ApiRequestWithHost } from "@/api/message";
22
import { ApiUtils, Handler } from "@/api/background/utils";
3+
import { NetworkType } from "@/contexts/SettingsContext";
4+
import { z } from "zod";
5+
6+
export const ConnectPayloadSchema = z.object({
7+
networkId: z.nativeEnum(NetworkType),
8+
name: z.string(),
9+
icon: z.string().optional(),
10+
});
11+
12+
export type ConnectPayload = z.infer<typeof ConnectPayloadSchema>;
313

414
/** Connect handler to serve BrowserMessageType.CONNECT message */
515
export const connectHandler: Handler = async (
File renamed without changes.

api/background/handlers/signAndBroadcastTx.ts renamed to api/background/handlers/kaspa/signAndBroadcastTx.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { Handler } from "@/api/background/utils";
2-
import { ApiRequestWithHost, SignTxPayloadSchema } from "@/api/message";
2+
import { ApiRequestWithHost } from "@/api/message";
33
import { ApiUtils } from "@/api/background/utils";
4+
import { SignTxPayloadSchema } from "./utils";
5+
46
/** signAndBroadcastTx handler to serve BrowserMessageType.SIGN_AND_BROADCAST_TX message */
57
export const signAndBroadcastTxHandler: Handler = async (
68
tabId: number,

api/background/handlers/signMessage.ts renamed to api/background/handlers/kaspa/signMessage.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import { Handler } from "@/api/background/utils";
2-
import {
3-
ApiRequestWithHost,
4-
ApiResponse,
5-
SignMessagePayloadSchema,
6-
} from "@/api/message";
2+
import { ApiRequestWithHost, ApiResponse } from "@/api/message";
73
import { ApiUtils } from "@/api/background/utils";
4+
import { z } from "zod";
5+
6+
export const SignMessagePayloadSchema = z.object({
7+
message: z.string(),
8+
});
9+
10+
export type SignMessagePayload = z.infer<typeof SignMessagePayloadSchema>;
11+
12+
// ================================================================================
813

914
/** signMessageHandler to serve BrowserMessageType.SIGN_MESSAGE message */
1015
export const signMessageHandler: Handler = async (
Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import { Handler } from "@/api/background/utils";
2-
import {
3-
ApiRequestWithHost,
4-
ApiResponse,
5-
SignTxPayloadSchema,
6-
} from "@/api/message";
2+
import { ApiRequestWithHost } from "@/api/message";
73
import { ApiUtils } from "@/api/background/utils";
4+
import { SignTxPayloadSchema } from "./utils";
85

96
/** signTxHandler to serve BrowserMessageType.SIGN_TX message */
107
export const signTxHandler: Handler = async (
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { z } from "zod";
2+
import { ScriptOption } from "@/lib/wallet/wallet-interface.ts";
3+
4+
export const SignTxPayloadSchema = z.object({
5+
networkId: z.string(),
6+
txJson: z.string(),
7+
scripts: z.array(z.custom<ScriptOption>()).optional(),
8+
});
9+
10+
export type SignTxPayload = z.infer<typeof SignTxPayloadSchema>;

api/browser.ts

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
import { v4 as uuid } from "uuid";
2-
import {
3-
Action,
4-
ApiRequest,
5-
ApiResponseSchema,
6-
ConnectPayloadSchema,
7-
SignTxPayloadSchema,
8-
SignMessagePayloadSchema,
9-
} from "@/api/message";
2+
import { Action, ApiRequest, ApiResponseSchema } from "@/api/message";
103
import { ScriptOption } from "@/lib/wallet/wallet-interface.ts";
114
import { EthereumBrowserAPI } from "./ethereum";
12-
import { ApiUtils } from "@/api/background/utils.ts";
5+
import { ConnectPayloadSchema } from "@/api/background/handlers/kaspa/connect";
6+
import { SignTxPayloadSchema } from "@/api/background/handlers/kaspa/utils";
7+
import { SignMessagePayloadSchema } from "@/api/background/handlers/kaspa/signMessage";
138

149
function createApiRequest(
1510
action: Action,
@@ -28,12 +23,7 @@ function createApiRequest(
2823
export class KastleBrowserAPI {
2924
public readonly ethereum = new EthereumBrowserAPI();
3025

31-
constructor() {
32-
window.postMessage(
33-
ApiUtils.createApiResponse("kastle_installed", []),
34-
window.location.origin,
35-
);
36-
}
26+
constructor() {}
3727

3828
async connect(
3929
networkId: "mainnet" | "testnet-10" = "mainnet",

api/message.ts

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
import { ScriptOption } from "@/lib/wallet/wallet-interface.ts";
21
import { z } from "zod";
3-
import { NetworkType } from "@/contexts/SettingsContext.tsx";
4-
import { isAddress, isHex } from "viem";
52

63
export enum Action {
74
CONNECT,
@@ -15,31 +12,11 @@ export enum Action {
1512

1613
// ================================================================================================
1714

18-
export const SignMessagePayloadSchema = z.object({
19-
message: z.string(),
20-
});
21-
22-
export type SignMessagePayload = z.infer<typeof SignMessagePayloadSchema>;
23-
24-
// ================================================================================================
25-
26-
export const SignTxPayloadSchema = z.object({
27-
networkId: z.string(),
28-
txJson: z.string(),
29-
scripts: z.array(z.custom<ScriptOption>()).optional(),
30-
});
31-
32-
export type SignTxPayload = z.infer<typeof SignTxPayloadSchema>;
33-
34-
// ================================================================================================
35-
3615
export const RpcRequestSchema = z.object({
3716
method: z.string(),
3817
params: z.array(z.unknown()).optional(),
3918
});
4019

41-
// ================================================================================================
42-
4320
export type RpcRequest = z.infer<typeof RpcRequestSchema>;
4421

4522
export const RpcErrorSchema = z.object({
@@ -96,31 +73,6 @@ export enum ETHEREUM_METHODS {
9673
WALLET_SWITCH_ETHEREUM_NETWORK = "wallet_switchEthereumChain",
9774
}
9875

99-
export const ethereumTransactionRequestSchema = z.object({
100-
from: z.string().refine(isAddress, "Must be a valid Ethereum address"),
101-
to: z.string().refine(isAddress, "Must be a valid Ethereum address"),
102-
value: z.string().refine(isHex, "Value must be a hex string").optional(),
103-
data: z.string().refine(isHex, "Data must be a hex string").optional(),
104-
maxFeePerGas: z
105-
.string()
106-
.refine(isHex, "Max fee per gas must be a hex string")
107-
.optional(),
108-
maxPriorityFeePerGas: z
109-
.string()
110-
.refine(isHex, "Max priority fee must be a hex string")
111-
.optional(),
112-
});
113-
114-
// ================================================================================================
115-
116-
export const ConnectPayloadSchema = z.object({
117-
networkId: z.nativeEnum(NetworkType),
118-
name: z.string(),
119-
icon: z.string().optional(),
120-
});
121-
122-
export type ConnectPayload = z.infer<typeof ConnectPayloadSchema>;
123-
12476
// ================================================================================================
12577

12678
export const ApiRequestSchema = z.object({

0 commit comments

Comments
 (0)