@rubanrubi/hardhat-dashboard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createDashboardServer = createDashboardServer;
7
+ const node_http_1 = require("node:http");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const cors_1 = __importDefault(require("cors"));
11
+ const express_1 = __importDefault(require("express"));
12
+ const ws_1 = require("ws");
13
+ const artifacts_1 = require("./artifacts");
14
+ const queue_1 = require("./queue");
15
+ const rpc_1 = require("../types/rpc");
16
+ function buildErrorResponse(id, error) {
17
+ return {
18
+ jsonrpc: '2.0',
19
+ id,
20
+ error,
21
+ };
22
+ }
23
+ function buildSuccessResponse(id, result) {
24
+ return {
25
+ jsonrpc: '2.0',
26
+ id,
27
+ result,
28
+ };
29
+ }
30
+ function normalizeError(error, fallbackMessage) {
31
+ if (error && typeof error === 'object') {
32
+ const candidate = error;
33
+ if (typeof candidate.code === 'number' && typeof candidate.message === 'string') {
34
+ return {
35
+ code: candidate.code,
36
+ message: candidate.message,
37
+ data: candidate.data,
38
+ };
39
+ }
40
+ }
41
+ if (error instanceof Error) {
42
+ return {
43
+ code: -32000,
44
+ message: error.message,
45
+ };
46
+ }
47
+ return {
48
+ code: -32000,
49
+ message: fallbackMessage,
50
+ };
51
+ }
52
+ function isLocalAddress(address) {
53
+ return (address === '127.0.0.1' ||
54
+ address === '::1' ||
55
+ address === '::ffff:127.0.0.1' ||
56
+ address === undefined);
57
+ }
58
+ function isAllowedOrigin(origin) {
59
+ if (!origin) {
60
+ return true;
61
+ }
62
+ try {
63
+ const url = new URL(origin);
64
+ return ['localhost', '127.0.0.1', '::1'].includes(url.hostname);
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ function isJsonRpcRequest(body) {
71
+ if (!body || typeof body !== 'object') {
72
+ return false;
73
+ }
74
+ const candidate = body;
75
+ return candidate.jsonrpc === '2.0' && typeof candidate.method === 'string' && 'id' in candidate;
76
+ }
77
+ function createDashboardServer(options) {
78
+ const host = options.host ?? '127.0.0.1';
79
+ const uiDir = options.uiDir ?? node_path_1.default.resolve(__dirname, '../ui');
80
+ const app = (0, express_1.default)();
81
+ const httpServer = (0, node_http_1.createServer)(app);
82
+ const wsServer = new ws_1.WebSocketServer({ server: httpServer, path: '/ws' });
83
+ const queue = new queue_1.PendingRequestQueue({ timeoutMs: options.requestTimeoutMs });
84
+ const artifacts = new artifacts_1.ArtifactRegistry();
85
+ const sockets = new Set();
86
+ const walletStates = new Map();
87
+ let started = false;
88
+ const getAggregateWalletState = () => {
89
+ for (const wallet of walletStates.values()) {
90
+ if (wallet.connected) {
91
+ return wallet;
92
+ }
93
+ }
94
+ if (walletStates.size > 0) {
95
+ return Array.from(walletStates.values())[0];
96
+ }
97
+ return rpc_1.EMPTY_WALLET_STATE;
98
+ };
99
+ const broadcastSnapshot = (socket) => {
100
+ const message = {
101
+ type: 'snapshot',
102
+ payload: queue.createSnapshot(getAggregateWalletState(), sockets.size > 0),
103
+ };
104
+ const serialized = JSON.stringify(message);
105
+ if (socket) {
106
+ socket.send(serialized);
107
+ return;
108
+ }
109
+ for (const client of sockets) {
110
+ if (client.readyState === ws_1.WebSocket.OPEN) {
111
+ client.send(serialized);
112
+ }
113
+ }
114
+ };
115
+ const handleClientMessage = (socket, raw) => {
116
+ let message;
117
+ try {
118
+ const serialized = Array.isArray(raw)
119
+ ? Buffer.concat(raw).toString()
120
+ : Buffer.isBuffer(raw)
121
+ ? raw.toString()
122
+ : typeof raw === 'string'
123
+ ? raw
124
+ : Buffer.from(raw).toString();
125
+ message = JSON.parse(serialized);
126
+ }
127
+ catch {
128
+ return;
129
+ }
130
+ switch (message.type) {
131
+ case 'hello':
132
+ broadcastSnapshot(socket);
133
+ return;
134
+ case 'wallet_status':
135
+ walletStates.set(socket, message.payload);
136
+ broadcastSnapshot();
137
+ return;
138
+ case 'request_processing':
139
+ queue.markProcessing(message.payload.queueId);
140
+ return;
141
+ case 'rpc_result':
142
+ queue.resolve(message.payload.queueId, message.payload.result);
143
+ return;
144
+ case 'rpc_error':
145
+ queue.reject(message.payload.queueId, message.payload.error);
146
+ return;
147
+ case 'reject_request':
148
+ queue.reject(message.payload.queueId, message.payload.error ?? {
149
+ code: 4001,
150
+ message: 'The request was rejected from the dashboard.',
151
+ });
152
+ return;
153
+ default:
154
+ return;
155
+ }
156
+ };
157
+ const assertLocalRequest = (request, response) => {
158
+ if (!isLocalAddress(request.socket.remoteAddress) || !isAllowedOrigin(request.headers.origin)) {
159
+ response.status(403).json({
160
+ error: 'hardhat-dashboard only accepts localhost traffic.',
161
+ });
162
+ return false;
163
+ }
164
+ return true;
165
+ };
166
+ queue.subscribe(() => {
167
+ broadcastSnapshot();
168
+ });
169
+ wsServer.on('connection', (socket) => {
170
+ sockets.add(socket);
171
+ walletStates.set(socket, rpc_1.EMPTY_WALLET_STATE);
172
+ broadcastSnapshot();
173
+ socket.on('message', (data) => {
174
+ handleClientMessage(socket, data);
175
+ });
176
+ socket.on('close', () => {
177
+ sockets.delete(socket);
178
+ walletStates.delete(socket);
179
+ broadcastSnapshot();
180
+ });
181
+ });
182
+ app.disable('x-powered-by');
183
+ app.use((0, cors_1.default)({
184
+ origin(origin, callback) {
185
+ callback(null, isAllowedOrigin(origin));
186
+ },
187
+ }));
188
+ app.use(express_1.default.json({ limit: '1mb' }));
189
+ app.get('/health', (_request, response) => {
190
+ response.json({
191
+ ok: true,
192
+ pending: queue.size(),
193
+ });
194
+ });
195
+ app.get('/state', (_request, response) => {
196
+ response.json(queue.createSnapshot(getAggregateWalletState(), sockets.size > 0));
197
+ });
198
+ app.post('/artifacts', (request, response) => {
199
+ if (!assertLocalRequest(request, response)) {
200
+ return;
201
+ }
202
+ const payload = request.body;
203
+ const artifactList = Array.isArray(payload?.artifacts) ? payload.artifacts : [];
204
+ artifacts.upsertArtifacts(artifactList);
205
+ queue.decoratePending((pendingRequest) => artifacts.decodeRequest(pendingRequest));
206
+ response.status(202).json({ accepted: artifactList.length });
207
+ });
208
+ const handleRpcRequest = async (requestBody) => {
209
+ if (!requestBody.method) {
210
+ return buildErrorResponse(requestBody.id, {
211
+ code: -32600,
212
+ message: 'Invalid JSON-RPC request.',
213
+ });
214
+ }
215
+ const enqueued = queue.enqueue({
216
+ rpcId: requestBody.id,
217
+ method: requestBody.method,
218
+ params: requestBody.params,
219
+ requiresApproval: (0, queue_1.requiresExplicitApproval)(requestBody.method),
220
+ decodedCall: artifacts.decodeRequest(requestBody),
221
+ });
222
+ const outcome = await enqueued.promise;
223
+ if (outcome.kind === 'result') {
224
+ return buildSuccessResponse(requestBody.id, outcome.result);
225
+ }
226
+ return buildErrorResponse(requestBody.id, outcome.error);
227
+ };
228
+ app.post('/rpc', async (request, response) => {
229
+ if (!assertLocalRequest(request, response)) {
230
+ return;
231
+ }
232
+ const payload = request.body;
233
+ const requests = Array.isArray(payload) ? payload : [payload];
234
+ if (!requests.every(isJsonRpcRequest)) {
235
+ response.status(400).json(buildErrorResponse(null, {
236
+ code: -32600,
237
+ message: 'Invalid JSON-RPC request payload.',
238
+ }));
239
+ return;
240
+ }
241
+ try {
242
+ const results = await Promise.all(requests.map((rpcRequest) => handleRpcRequest(rpcRequest)));
243
+ response.json(Array.isArray(payload) ? results : results[0]);
244
+ }
245
+ catch (error) {
246
+ response.status(500).json(buildErrorResponse(null, normalizeError(error, 'Unexpected proxy failure.')));
247
+ }
248
+ });
249
+ app.use(express_1.default.static(uiDir));
250
+ app.get('*', (_request, response) => {
251
+ response.sendFile(node_path_1.default.join(uiDir, 'index.html'));
252
+ });
253
+ return {
254
+ async start() {
255
+ if (started) {
256
+ return;
257
+ }
258
+ await new Promise((resolve, reject) => {
259
+ httpServer.once('error', reject);
260
+ httpServer.listen(options.port, host, () => {
261
+ httpServer.off('error', reject);
262
+ resolve();
263
+ });
264
+ });
265
+ started = true;
266
+ // Keep startup output succinct but explicit, since users rely on this from CLI runs.
267
+ // eslint-disable-next-line no-console
268
+ console.log(`${chalk_1.default.cyan('hardhat-dashboard')} listening at ${chalk_1.default.bold(`http://${host}:${options.port}`)}`);
269
+ },
270
+ async stop() {
271
+ if (!started) {
272
+ return;
273
+ }
274
+ for (const socket of sockets) {
275
+ socket.close();
276
+ }
277
+ await new Promise((resolve, reject) => {
278
+ wsServer.close((wsError) => {
279
+ if (wsError) {
280
+ reject(wsError);
281
+ return;
282
+ }
283
+ httpServer.close((httpError) => {
284
+ if (httpError) {
285
+ reject(httpError);
286
+ return;
287
+ }
288
+ resolve();
289
+ });
290
+ });
291
+ });
292
+ started = false;
293
+ },
294
+ getOrigin() {
295
+ return `http://${host}:${options.port}`;
296
+ },
297
+ getRpcUrl() {
298
+ return `http://${host}:${options.port}/rpc`;
299
+ },
300
+ pushArtifacts(artifactList) {
301
+ artifacts.upsertArtifacts(artifactList);
302
+ queue.decoratePending((pendingRequest) => artifacts.decodeRequest(pendingRequest));
303
+ },
304
+ };
305
+ }
306
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/server/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { DashboardSnapshot, DecodedContractCall, HistoryRpcEntry, JsonRpcErrorObject, JsonRpcId, PendingRpcRequest, WalletConnectionState } from '../types/rpc';
2
+ export interface QueueOutcomeSuccess {
3
+ kind: 'result';
4
+ result: unknown;
5
+ }
6
+ export interface QueueOutcomeError {
7
+ kind: 'error';
8
+ error: JsonRpcErrorObject;
9
+ status: HistoryRpcEntry['status'];
10
+ }
11
+ export type QueueOutcome = QueueOutcomeSuccess | QueueOutcomeError;
12
+ export interface EnqueuePendingRequest {
13
+ rpcId: JsonRpcId;
14
+ method: string;
15
+ params: unknown[] | Record<string, unknown> | undefined;
16
+ requiresApproval: boolean;
17
+ decodedCall?: DecodedContractCall;
18
+ }
19
+ export interface EnqueuedRequest {
20
+ queueId: string;
21
+ promise: Promise<QueueOutcome>;
22
+ }
23
+ interface QueueOptions {
24
+ timeoutMs?: number;
25
+ maxHistory?: number;
26
+ }
27
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS: number;
28
+ export declare const SIGNING_METHODS: Set<string>;
29
+ export declare function requiresExplicitApproval(method: string): boolean;
30
+ export declare class PendingRequestQueue {
31
+ private readonly timeoutMs;
32
+ private readonly maxHistory;
33
+ private readonly pending;
34
+ private readonly history;
35
+ private readonly waiters;
36
+ private readonly listeners;
37
+ constructor(options?: QueueOptions);
38
+ enqueue(request: EnqueuePendingRequest): EnqueuedRequest;
39
+ markProcessing(queueId: string): void;
40
+ updateDecodedCall(queueId: string, decodedCall?: DecodedContractCall): void;
41
+ decoratePending(decorate: (request: PendingRpcRequest) => DecodedContractCall | undefined): void;
42
+ resolve(queueId: string, result: unknown): void;
43
+ reject(queueId: string, error: JsonRpcErrorObject): void;
44
+ createSnapshot(wallet: WalletConnectionState, browserConnected: boolean): DashboardSnapshot;
45
+ size(): number;
46
+ subscribe(listener: () => void): () => void;
47
+ private addHistoryEntry;
48
+ private emit;
49
+ }
50
+ export {};
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PendingRequestQueue = exports.SIGNING_METHODS = exports.DEFAULT_REQUEST_TIMEOUT_MS = void 0;
4
+ exports.requiresExplicitApproval = requiresExplicitApproval;
5
+ const node_crypto_1 = require("node:crypto");
6
+ exports.DEFAULT_REQUEST_TIMEOUT_MS = 5 * 60 * 1000;
7
+ const DEFAULT_HISTORY_LIMIT = 100;
8
+ exports.SIGNING_METHODS = new Set([
9
+ 'eth_sendTransaction',
10
+ 'eth_sign',
11
+ 'personal_sign',
12
+ 'eth_signTypedData',
13
+ 'eth_signTypedData_v1',
14
+ 'eth_signTypedData_v3',
15
+ 'eth_signTypedData_v4',
16
+ ]);
17
+ function requiresExplicitApproval(method) {
18
+ return exports.SIGNING_METHODS.has(method);
19
+ }
20
+ function deriveHistoryStatus(error) {
21
+ if (error.code === 4001) {
22
+ return 'rejected';
23
+ }
24
+ if (error.code === -32001) {
25
+ return 'expired';
26
+ }
27
+ return 'failed';
28
+ }
29
+ class PendingRequestQueue {
30
+ timeoutMs;
31
+ maxHistory;
32
+ pending = new Map();
33
+ history = [];
34
+ waiters = new Map();
35
+ listeners = new Set();
36
+ constructor(options = {}) {
37
+ this.timeoutMs = options.timeoutMs ?? exports.DEFAULT_REQUEST_TIMEOUT_MS;
38
+ this.maxHistory = options.maxHistory ?? DEFAULT_HISTORY_LIMIT;
39
+ }
40
+ enqueue(request) {
41
+ const queueId = (0, node_crypto_1.randomUUID)();
42
+ const createdAt = new Date();
43
+ const timeoutAt = new Date(createdAt.getTime() + this.timeoutMs);
44
+ const pendingRequest = {
45
+ queueId,
46
+ rpcId: request.rpcId,
47
+ method: request.method,
48
+ params: request.params,
49
+ requiresApproval: request.requiresApproval,
50
+ status: 'pending',
51
+ createdAt: createdAt.toISOString(),
52
+ timeoutAt: timeoutAt.toISOString(),
53
+ decodedCall: request.decodedCall,
54
+ };
55
+ const promise = new Promise((resolve) => {
56
+ const timeout = setTimeout(() => {
57
+ this.reject(queueId, {
58
+ code: -32001,
59
+ message: `The dashboard request timed out after waiting ${Math.max(1, Math.round(this.timeoutMs / 1000))} seconds for approval.`,
60
+ });
61
+ }, this.timeoutMs);
62
+ this.waiters.set(queueId, { resolve, timeout });
63
+ });
64
+ this.pending.set(queueId, pendingRequest);
65
+ this.emit();
66
+ return { queueId, promise };
67
+ }
68
+ markProcessing(queueId) {
69
+ const request = this.pending.get(queueId);
70
+ if (!request) {
71
+ return;
72
+ }
73
+ if (request.status !== 'processing') {
74
+ request.status = 'processing';
75
+ this.emit();
76
+ }
77
+ }
78
+ updateDecodedCall(queueId, decodedCall) {
79
+ const request = this.pending.get(queueId);
80
+ if (!request) {
81
+ return;
82
+ }
83
+ request.decodedCall = decodedCall;
84
+ this.emit();
85
+ }
86
+ decoratePending(decorate) {
87
+ let changed = false;
88
+ for (const request of this.pending.values()) {
89
+ if (request.decodedCall?.matched) {
90
+ continue;
91
+ }
92
+ const decodedCall = decorate(request);
93
+ if (!decodedCall) {
94
+ continue;
95
+ }
96
+ request.decodedCall = decodedCall;
97
+ changed = true;
98
+ }
99
+ if (changed) {
100
+ this.emit();
101
+ }
102
+ }
103
+ resolve(queueId, result) {
104
+ const request = this.pending.get(queueId);
105
+ const waiter = this.waiters.get(queueId);
106
+ if (!request || !waiter) {
107
+ return;
108
+ }
109
+ clearTimeout(waiter.timeout);
110
+ waiter.resolve({ kind: 'result', result });
111
+ this.waiters.delete(queueId);
112
+ this.pending.delete(queueId);
113
+ this.addHistoryEntry({
114
+ queueId,
115
+ rpcId: request.rpcId,
116
+ method: request.method,
117
+ createdAt: request.createdAt,
118
+ completedAt: new Date().toISOString(),
119
+ status: 'confirmed',
120
+ decodedCall: request.decodedCall,
121
+ result,
122
+ });
123
+ this.emit();
124
+ }
125
+ reject(queueId, error) {
126
+ const request = this.pending.get(queueId);
127
+ const waiter = this.waiters.get(queueId);
128
+ if (!request || !waiter) {
129
+ return;
130
+ }
131
+ const status = deriveHistoryStatus(error);
132
+ clearTimeout(waiter.timeout);
133
+ waiter.resolve({ kind: 'error', error, status });
134
+ this.waiters.delete(queueId);
135
+ this.pending.delete(queueId);
136
+ this.addHistoryEntry({
137
+ queueId,
138
+ rpcId: request.rpcId,
139
+ method: request.method,
140
+ createdAt: request.createdAt,
141
+ completedAt: new Date().toISOString(),
142
+ status,
143
+ decodedCall: request.decodedCall,
144
+ error,
145
+ });
146
+ this.emit();
147
+ }
148
+ createSnapshot(wallet, browserConnected) {
149
+ return {
150
+ pending: Array.from(this.pending.values()).sort((left, right) => left.createdAt.localeCompare(right.createdAt)),
151
+ history: [...this.history],
152
+ wallet,
153
+ browserConnected,
154
+ updatedAt: new Date().toISOString(),
155
+ };
156
+ }
157
+ size() {
158
+ return this.pending.size;
159
+ }
160
+ subscribe(listener) {
161
+ this.listeners.add(listener);
162
+ return () => {
163
+ this.listeners.delete(listener);
164
+ };
165
+ }
166
+ addHistoryEntry(entry) {
167
+ this.history.unshift(entry);
168
+ if (this.history.length > this.maxHistory) {
169
+ this.history.length = this.maxHistory;
170
+ }
171
+ }
172
+ emit() {
173
+ for (const listener of this.listeners) {
174
+ listener();
175
+ }
176
+ }
177
+ }
178
+ exports.PendingRequestQueue = PendingRequestQueue;
179
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/server/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const DEFAULT_DASHBOARD_PORT = 24012;
2
+ export declare const DEFAULT_DASHBOARD_NETWORK = "dashboard";
3
+ export interface DashboardPluginConfig {
4
+ port?: number;
5
+ networkName?: string;
6
+ autoOpen?: boolean;
7
+ }
8
+ export interface ResolvedDashboardPluginConfig {
9
+ port: number;
10
+ networkName: string;
11
+ autoOpen: boolean;
12
+ }
13
+ export declare function resolveDashboardPluginConfig(config?: DashboardPluginConfig): ResolvedDashboardPluginConfig;
14
+ declare module 'hardhat/types/config' {
15
+ interface HardhatUserConfig {
16
+ dashboardPlugin?: DashboardPluginConfig;
17
+ }
18
+ interface HardhatConfig {
19
+ dashboardPlugin: ResolvedDashboardPluginConfig;
20
+ }
21
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_DASHBOARD_NETWORK = exports.DEFAULT_DASHBOARD_PORT = void 0;
4
+ exports.resolveDashboardPluginConfig = resolveDashboardPluginConfig;
5
+ exports.DEFAULT_DASHBOARD_PORT = 24012;
6
+ exports.DEFAULT_DASHBOARD_NETWORK = 'dashboard';
7
+ function resolveDashboardPluginConfig(config) {
8
+ return {
9
+ port: config?.port ?? exports.DEFAULT_DASHBOARD_PORT,
10
+ networkName: config?.networkName ?? exports.DEFAULT_DASHBOARD_NETWORK,
11
+ autoOpen: config?.autoOpen ?? true,
12
+ };
13
+ }
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":";;;AAeA,oEAQC;AAvBY,QAAA,sBAAsB,GAAG,KAAK,CAAC;AAC/B,QAAA,yBAAyB,GAAG,WAAW,CAAC;AAcrD,SAAgB,4BAA4B,CAC1C,MAA8B;IAE9B,OAAO;QACL,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,8BAAsB;QAC5C,WAAW,EAAE,MAAM,EAAE,WAAW,IAAI,iCAAyB;QAC7D,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI;KACnC,CAAC;AACJ,CAAC"}