sigild 0.0.1

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.
Files changed (97) hide show
  1. package/CONTRIBUTING.md +39 -0
  2. package/LICENSE +202 -0
  3. package/README.md +70 -0
  4. package/THREAT_MODEL.md +84 -0
  5. package/dist/src/audit/index.d.ts +2 -0
  6. package/dist/src/audit/index.d.ts.map +1 -0
  7. package/dist/src/audit/index.js +2 -0
  8. package/dist/src/audit/index.js.map +1 -0
  9. package/dist/src/audit/log.d.ts +96 -0
  10. package/dist/src/audit/log.d.ts.map +1 -0
  11. package/dist/src/audit/log.js +229 -0
  12. package/dist/src/audit/log.js.map +1 -0
  13. package/dist/src/bin/sigild.d.ts +3 -0
  14. package/dist/src/bin/sigild.d.ts.map +1 -0
  15. package/dist/src/bin/sigild.js +30 -0
  16. package/dist/src/bin/sigild.js.map +1 -0
  17. package/dist/src/crypto/aead.d.ts +9 -0
  18. package/dist/src/crypto/aead.d.ts.map +1 -0
  19. package/dist/src/crypto/aead.js +38 -0
  20. package/dist/src/crypto/aead.js.map +1 -0
  21. package/dist/src/crypto/index.d.ts +5 -0
  22. package/dist/src/crypto/index.d.ts.map +1 -0
  23. package/dist/src/crypto/index.js +5 -0
  24. package/dist/src/crypto/index.js.map +1 -0
  25. package/dist/src/crypto/kdf.d.ts +10 -0
  26. package/dist/src/crypto/kdf.d.ts.map +1 -0
  27. package/dist/src/crypto/kdf.js +27 -0
  28. package/dist/src/crypto/kdf.js.map +1 -0
  29. package/dist/src/crypto/keyfile.d.ts +12 -0
  30. package/dist/src/crypto/keyfile.d.ts.map +1 -0
  31. package/dist/src/crypto/keyfile.js +114 -0
  32. package/dist/src/crypto/keyfile.js.map +1 -0
  33. package/dist/src/crypto/secret-buffer.d.ts +19 -0
  34. package/dist/src/crypto/secret-buffer.d.ts.map +1 -0
  35. package/dist/src/crypto/secret-buffer.js +48 -0
  36. package/dist/src/crypto/secret-buffer.js.map +1 -0
  37. package/dist/src/daemon/handles.d.ts +51 -0
  38. package/dist/src/daemon/handles.d.ts.map +1 -0
  39. package/dist/src/daemon/handles.js +140 -0
  40. package/dist/src/daemon/handles.js.map +1 -0
  41. package/dist/src/daemon/index.d.ts +5 -0
  42. package/dist/src/daemon/index.d.ts.map +1 -0
  43. package/dist/src/daemon/index.js +5 -0
  44. package/dist/src/daemon/index.js.map +1 -0
  45. package/dist/src/daemon/methods.d.ts +20 -0
  46. package/dist/src/daemon/methods.d.ts.map +1 -0
  47. package/dist/src/daemon/methods.js +221 -0
  48. package/dist/src/daemon/methods.js.map +1 -0
  49. package/dist/src/daemon/passphrase.d.ts +14 -0
  50. package/dist/src/daemon/passphrase.d.ts.map +1 -0
  51. package/dist/src/daemon/passphrase.js +49 -0
  52. package/dist/src/daemon/passphrase.js.map +1 -0
  53. package/dist/src/daemon/rpc.d.ts +61 -0
  54. package/dist/src/daemon/rpc.d.ts.map +1 -0
  55. package/dist/src/daemon/rpc.js +76 -0
  56. package/dist/src/daemon/rpc.js.map +1 -0
  57. package/dist/src/daemon/runtime.d.ts +40 -0
  58. package/dist/src/daemon/runtime.d.ts.map +1 -0
  59. package/dist/src/daemon/runtime.js +61 -0
  60. package/dist/src/daemon/runtime.js.map +1 -0
  61. package/dist/src/daemon/server.d.ts +53 -0
  62. package/dist/src/daemon/server.d.ts.map +1 -0
  63. package/dist/src/daemon/server.js +103 -0
  64. package/dist/src/daemon/server.js.map +1 -0
  65. package/dist/src/eth/address.d.ts +13 -0
  66. package/dist/src/eth/address.d.ts.map +1 -0
  67. package/dist/src/eth/address.js +51 -0
  68. package/dist/src/eth/address.js.map +1 -0
  69. package/dist/src/eth/index.d.ts +8 -0
  70. package/dist/src/eth/index.d.ts.map +1 -0
  71. package/dist/src/eth/index.js +8 -0
  72. package/dist/src/eth/index.js.map +1 -0
  73. package/dist/src/eth/keccak.d.ts +2 -0
  74. package/dist/src/eth/keccak.d.ts.map +1 -0
  75. package/dist/src/eth/keccak.js +5 -0
  76. package/dist/src/eth/keccak.js.map +1 -0
  77. package/dist/src/eth/rlp.d.ts +16 -0
  78. package/dist/src/eth/rlp.d.ts.map +1 -0
  79. package/dist/src/eth/rlp.js +99 -0
  80. package/dist/src/eth/rlp.js.map +1 -0
  81. package/dist/src/eth/secp.d.ts +17 -0
  82. package/dist/src/eth/secp.d.ts.map +1 -0
  83. package/dist/src/eth/secp.js +43 -0
  84. package/dist/src/eth/secp.js.map +1 -0
  85. package/dist/src/eth/sign-message.d.ts +18 -0
  86. package/dist/src/eth/sign-message.d.ts.map +1 -0
  87. package/dist/src/eth/sign-message.js +42 -0
  88. package/dist/src/eth/sign-message.js.map +1 -0
  89. package/dist/src/eth/sign-tx.d.ts +38 -0
  90. package/dist/src/eth/sign-tx.d.ts.map +1 -0
  91. package/dist/src/eth/sign-tx.js +92 -0
  92. package/dist/src/eth/sign-tx.js.map +1 -0
  93. package/dist/src/eth/sign-typed.d.ts +33 -0
  94. package/dist/src/eth/sign-typed.d.ts.map +1 -0
  95. package/dist/src/eth/sign-typed.js +142 -0
  96. package/dist/src/eth/sign-typed.js.map +1 -0
  97. package/package.json +59 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * JSON-RPC 2.0 over newline-delimited JSON (NDJSON).
3
+ * Pure functions only — no IO. The server in server.ts wires this onto sockets.
4
+ *
5
+ * We use the strict JSON-RPC 2.0 envelope: every request has `jsonrpc: "2.0"`,
6
+ * a method, and either an id (for requests expecting a response) or no id (for
7
+ * notifications, which sigil currently rejects since every sign decision needs
8
+ * to round-trip through the audit log).
9
+ */
10
+ export const RPC_VERSION = '2.0';
11
+ // Standard JSON-RPC 2.0 error codes.
12
+ export const RPC_PARSE_ERROR = -32700;
13
+ export const RPC_INVALID_REQUEST = -32600;
14
+ export const RPC_METHOD_NOT_FOUND = -32601;
15
+ export const RPC_INVALID_PARAMS = -32602;
16
+ export const RPC_INTERNAL_ERROR = -32603;
17
+ // Reserved range for sigil-specific errors: -32000 .. -32099.
18
+ export const RPC_PORTAL_NOT_FOUND = -32000;
19
+ export const RPC_POLICY_DENIED = -32001;
20
+ export const RPC_INVALID_PAYLOAD = -32002;
21
+ /**
22
+ * Parse a single NDJSON line into a JSON-RPC request.
23
+ * Returns either a valid request, a parse_error (if the line is not JSON), or
24
+ * an invalid envelope along with the id that should be echoed in the error
25
+ * response (which is null if the id couldn't be extracted).
26
+ */
27
+ export function parseRequest(line) {
28
+ let parsed;
29
+ try {
30
+ parsed = JSON.parse(line);
31
+ }
32
+ catch {
33
+ return { kind: 'parse_error' };
34
+ }
35
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
36
+ return { kind: 'invalid', id: null, reason: 'request must be a JSON object' };
37
+ }
38
+ const obj = parsed;
39
+ // Try to extract an id even if the rest is malformed, so the error
40
+ // response can be correlated.
41
+ const rawId = obj['id'];
42
+ const id = typeof rawId === 'string' || typeof rawId === 'number' || rawId === null ? rawId : null;
43
+ if (obj['jsonrpc'] !== RPC_VERSION) {
44
+ return { kind: 'invalid', id, reason: 'jsonrpc must be "2.0"' };
45
+ }
46
+ if (typeof obj['method'] !== 'string' || obj['method'].length === 0) {
47
+ return { kind: 'invalid', id, reason: 'method must be a non-empty string' };
48
+ }
49
+ // Notifications (no id) are not supported — every call must be acknowledged
50
+ // because every sign call needs an audit-log roundtrip.
51
+ if (!('id' in obj)) {
52
+ return { kind: 'invalid', id: null, reason: 'notifications are not supported' };
53
+ }
54
+ if (typeof rawId !== 'string' && typeof rawId !== 'number' && rawId !== null) {
55
+ return { kind: 'invalid', id: null, reason: 'id must be string, number, or null' };
56
+ }
57
+ return {
58
+ kind: 'request',
59
+ request: {
60
+ jsonrpc: '2.0',
61
+ id,
62
+ method: obj['method'],
63
+ params: obj['params'],
64
+ },
65
+ };
66
+ }
67
+ export function encodeResponse(id, result) {
68
+ const r = { jsonrpc: RPC_VERSION, id, result };
69
+ return JSON.stringify(r);
70
+ }
71
+ export function encodeError(id, code, message, data) {
72
+ const error = data === undefined ? { code, message } : { code, message, data };
73
+ const r = { jsonrpc: RPC_VERSION, id, error };
74
+ return JSON.stringify(r);
75
+ }
76
+ //# sourceMappingURL=rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/daemon/rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type DaemonServerHandle, type LogEvent } from './server.js';
2
+ export interface DaemonRuntimeOpts {
3
+ /** Sigil home directory. Defaults to $SIGIL_HOME or ~/.sigil. */
4
+ sigilHome: string;
5
+ /** Returns the unlock passphrase. Called once at startup; the runtime zeroes it after use. */
6
+ passphrase: () => Promise<Buffer> | Buffer;
7
+ /** Optional log sink for daemon and server events. */
8
+ onLog?: (event: LogEvent | RuntimeEvent) => void;
9
+ }
10
+ export type RuntimeEvent = {
11
+ kind: 'runtime_starting';
12
+ sigilHome: string;
13
+ } | {
14
+ kind: 'runtime_ready';
15
+ portals: number;
16
+ socketPath: string;
17
+ } | {
18
+ kind: 'runtime_shutdown_begin';
19
+ } | {
20
+ kind: 'runtime_shutdown_complete';
21
+ };
22
+ export interface DaemonRuntimeHandle {
23
+ readonly socketPath: string;
24
+ readonly auditPath: string;
25
+ readonly portals: number;
26
+ readonly server: DaemonServerHandle;
27
+ shutdown: () => Promise<void>;
28
+ }
29
+ /**
30
+ * Bring up the daemon: ensure directories exist, prompt for the passphrase,
31
+ * load every keyfile from <sigilHome>/keys, open the audit log, and start
32
+ * the Unix-socket server. The returned handle exposes a single `shutdown`
33
+ * function that closes the server, closes the audit writer, and zeroes
34
+ * every key in memory.
35
+ *
36
+ * The runtime is testable end-to-end by passing a `passphrase` callback that
37
+ * returns a known buffer and pointing `sigilHome` at a tmpdir.
38
+ */
39
+ export declare function runDaemon(opts: DaemonRuntimeOpts): Promise<DaemonRuntimeHandle>;
40
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/daemon/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,KAAK,kBAAkB,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExF,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC3C,sDAAsD;IACtD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,YAAY,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,wBAAwB,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,2BAA2B,CAAA;CAAE,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiDrF"}
@@ -0,0 +1,61 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { AuditWriter } from '../audit/index.js';
4
+ import { HandleTable } from './handles.js';
5
+ import { startDaemonServer } from './server.js';
6
+ /**
7
+ * Bring up the daemon: ensure directories exist, prompt for the passphrase,
8
+ * load every keyfile from <sigilHome>/keys, open the audit log, and start
9
+ * the Unix-socket server. The returned handle exposes a single `shutdown`
10
+ * function that closes the server, closes the audit writer, and zeroes
11
+ * every key in memory.
12
+ *
13
+ * The runtime is testable end-to-end by passing a `passphrase` callback that
14
+ * returns a known buffer and pointing `sigilHome` at a tmpdir.
15
+ */
16
+ export async function runDaemon(opts) {
17
+ const log = (e) => opts.onLog?.(e);
18
+ const sigilHome = opts.sigilHome;
19
+ const keysDir = join(sigilHome, 'keys');
20
+ const auditPath = join(sigilHome, 'audit.log');
21
+ const socketPath = join(sigilHome, 'sock');
22
+ log({ kind: 'runtime_starting', sigilHome });
23
+ mkdirSync(sigilHome, { recursive: true, mode: 0o700 });
24
+ mkdirSync(keysDir, { recursive: true, mode: 0o700 });
25
+ const passphrase = await opts.passphrase();
26
+ const handles = new HandleTable();
27
+ try {
28
+ handles.loadFromDir(keysDir, passphrase);
29
+ }
30
+ finally {
31
+ passphrase.fill(0);
32
+ }
33
+ const audit = new AuditWriter(auditPath);
34
+ const server = await startDaemonServer({
35
+ socketPath,
36
+ context: { handles, audit },
37
+ ...(opts.onLog ? { onLog: (e) => opts.onLog(e) } : {}),
38
+ });
39
+ log({ kind: 'runtime_ready', portals: handles.list().length, socketPath });
40
+ let shutdownPromise = null;
41
+ const shutdown = () => {
42
+ if (shutdownPromise)
43
+ return shutdownPromise;
44
+ log({ kind: 'runtime_shutdown_begin' });
45
+ shutdownPromise = (async () => {
46
+ await server.close();
47
+ audit.close();
48
+ handles.dispose();
49
+ log({ kind: 'runtime_shutdown_complete' });
50
+ })();
51
+ return shutdownPromise;
52
+ };
53
+ return {
54
+ socketPath,
55
+ auditPath,
56
+ portals: handles.list().length,
57
+ server,
58
+ shutdown,
59
+ };
60
+ }
61
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/daemon/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAA0C,MAAM,aAAa,CAAC;AAyBxF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAuB;IACrD,MAAM,GAAG,GAAG,CAAC,CAA0B,EAAQ,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE3C,GAAG,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAC;IAE7C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAErD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;QACrC,UAAU;QACV,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAE3E,IAAI,eAAe,GAAyB,IAAI,CAAC;IACjD,MAAM,QAAQ,GAAG,GAAkB,EAAE;QACnC,IAAI,eAAe;YAAE,OAAO,eAAe,CAAC;QAC5C,GAAG,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACxC,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,GAAG,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC;IAEF,OAAO;QACL,UAAU;QACV,SAAS;QACT,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM;QAC9B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { type Server, type Socket } from 'node:net';
2
+ import { type MethodContext } from './methods.js';
3
+ import { type RpcId } from './rpc.js';
4
+ export interface DaemonServerOpts {
5
+ socketPath: string;
6
+ context: MethodContext;
7
+ /**
8
+ * Called for every connection that opens, with the peer socket. Useful for
9
+ * tests; in production we don't need it.
10
+ */
11
+ onConnection?: (socket: Socket) => void;
12
+ /**
13
+ * Called when the server logs an event. Receives a structured payload.
14
+ * Keep this lightweight; production wiring will swap in something real.
15
+ */
16
+ onLog?: (event: LogEvent) => void;
17
+ }
18
+ export type LogEvent = {
19
+ kind: 'listening';
20
+ path: string;
21
+ } | {
22
+ kind: 'connection_open';
23
+ } | {
24
+ kind: 'connection_close';
25
+ } | {
26
+ kind: 'connection_error';
27
+ error: string;
28
+ } | {
29
+ kind: 'request';
30
+ method: string;
31
+ id: RpcId;
32
+ } | {
33
+ kind: 'response';
34
+ id: RpcId;
35
+ ok: boolean;
36
+ } | {
37
+ kind: 'closed';
38
+ };
39
+ export interface DaemonServerHandle {
40
+ readonly server: Server;
41
+ close: () => Promise<void>;
42
+ }
43
+ /**
44
+ * Start a Unix-socket JSON-RPC server. The socket file is created at
45
+ * `socketPath` with mode 0o600 (owner read/write only). If a stale socket
46
+ * file exists at that path we remove it first.
47
+ *
48
+ * Each connection is line-delimited JSON: one request per line, one response
49
+ * per line. Pipelining is supported (multiple requests per connection); they
50
+ * are processed in order.
51
+ */
52
+ export declare function startDaemonServer(opts: DaemonServerOpts): Promise<DaemonServerHandle>;
53
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/daemon/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAElE,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAOL,KAAK,KAAK,EACX,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,KAAK,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiErF"}
@@ -0,0 +1,103 @@
1
+ import { createServer } from 'node:net';
2
+ import { chmodSync, existsSync, unlinkSync } from 'node:fs';
3
+ import { dispatch, RpcMethodError } from './methods.js';
4
+ import { encodeError, encodeResponse, parseRequest, RPC_INTERNAL_ERROR, RPC_INVALID_REQUEST, RPC_PARSE_ERROR, } from './rpc.js';
5
+ /**
6
+ * Start a Unix-socket JSON-RPC server. The socket file is created at
7
+ * `socketPath` with mode 0o600 (owner read/write only). If a stale socket
8
+ * file exists at that path we remove it first.
9
+ *
10
+ * Each connection is line-delimited JSON: one request per line, one response
11
+ * per line. Pipelining is supported (multiple requests per connection); they
12
+ * are processed in order.
13
+ */
14
+ export function startDaemonServer(opts) {
15
+ const { socketPath, context } = opts;
16
+ const log = (e) => opts.onLog?.(e);
17
+ // If a stale file (e.g. from a crashed previous run) sits at the path,
18
+ // remove it before binding. We don't check whether a process is actually
19
+ // listening — that would need OS-specific calls. The 0o600 perms make it
20
+ // impossible for another user to drop a file here.
21
+ if (existsSync(socketPath)) {
22
+ try {
23
+ unlinkSync(socketPath);
24
+ }
25
+ catch { /* let listen() report the bind failure */ }
26
+ }
27
+ const server = createServer((socket) => {
28
+ log({ kind: 'connection_open' });
29
+ opts.onConnection?.(socket);
30
+ let buf = '';
31
+ socket.setEncoding('utf8');
32
+ socket.on('data', (chunk) => {
33
+ buf += chunk;
34
+ let nl;
35
+ while ((nl = buf.indexOf('\n')) !== -1) {
36
+ const line = buf.slice(0, nl);
37
+ buf = buf.slice(nl + 1);
38
+ if (line.length === 0)
39
+ continue;
40
+ const response = handleLine(line, context, log);
41
+ socket.write(response + '\n');
42
+ }
43
+ });
44
+ socket.on('error', (err) => {
45
+ log({ kind: 'connection_error', error: err.message });
46
+ });
47
+ socket.on('close', () => {
48
+ log({ kind: 'connection_close' });
49
+ });
50
+ });
51
+ return new Promise((resolve, reject) => {
52
+ server.once('error', reject);
53
+ server.listen(socketPath, () => {
54
+ // Tighten perms — Node's default may be 0o755 depending on umask.
55
+ try {
56
+ chmodSync(socketPath, 0o600);
57
+ }
58
+ catch (err) {
59
+ server.close();
60
+ reject(err);
61
+ return;
62
+ }
63
+ log({ kind: 'listening', path: socketPath });
64
+ server.removeListener('error', reject);
65
+ resolve({
66
+ server,
67
+ close: () => new Promise((res) => {
68
+ server.close(() => {
69
+ log({ kind: 'closed' });
70
+ res();
71
+ });
72
+ }),
73
+ });
74
+ });
75
+ });
76
+ }
77
+ function handleLine(line, context, log) {
78
+ const parsed = parseRequest(line);
79
+ if (parsed.kind === 'parse_error') {
80
+ log({ kind: 'response', id: null, ok: false });
81
+ return encodeError(null, RPC_PARSE_ERROR, 'parse error');
82
+ }
83
+ if (parsed.kind === 'invalid') {
84
+ log({ kind: 'response', id: parsed.id, ok: false });
85
+ return encodeError(parsed.id, RPC_INVALID_REQUEST, parsed.reason);
86
+ }
87
+ const { request } = parsed;
88
+ log({ kind: 'request', method: request.method, id: request.id });
89
+ try {
90
+ const result = dispatch(request.method, request.params, context);
91
+ log({ kind: 'response', id: request.id, ok: true });
92
+ return encodeResponse(request.id, result);
93
+ }
94
+ catch (err) {
95
+ if (err instanceof RpcMethodError) {
96
+ log({ kind: 'response', id: request.id, ok: false });
97
+ return encodeError(request.id, err.code, err.message, err.data);
98
+ }
99
+ log({ kind: 'response', id: request.id, ok: false });
100
+ return encodeError(request.id, RPC_INTERNAL_ERROR, `internal error: ${err.message}`);
101
+ }
102
+ }
103
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/daemon/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Lowercase 0x-prefixed 20-byte address derived from a private key.
3
+ */
4
+ export declare function addressFromPrivateKey(privateKey: Buffer | Uint8Array): string;
5
+ /**
6
+ * Lowercase 0x-prefixed 20-byte address derived from a 65-byte uncompressed public key.
7
+ */
8
+ export declare function addressFromPublicKey(uncompressedPub: Buffer | Uint8Array): string;
9
+ /**
10
+ * EIP-55 checksummed address (mixed-case 0x-prefixed).
11
+ */
12
+ export declare function toChecksumAddress(address: string): string;
13
+ //# sourceMappingURL=address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../src/eth/address.ts"],"names":[],"mappings":"AAcA;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAK7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CASjF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAazD"}
@@ -0,0 +1,51 @@
1
+ import { keccak256 } from './keccak.js';
2
+ import { getPublicKeyUncompressed } from './secp.js';
3
+ const HEX = '0123456789abcdef';
4
+ function bytesToHex(buf) {
5
+ let out = '';
6
+ for (let i = 0; i < buf.length; i++) {
7
+ const b = buf[i];
8
+ out += HEX[(b >>> 4) & 0xf] + HEX[b & 0xf];
9
+ }
10
+ return out;
11
+ }
12
+ /**
13
+ * Lowercase 0x-prefixed 20-byte address derived from a private key.
14
+ */
15
+ export function addressFromPrivateKey(privateKey) {
16
+ const pub = getPublicKeyUncompressed(privateKey);
17
+ // strip 0x04 prefix; address = last 20 bytes of keccak256(pub[1..])
18
+ const hash = keccak256(pub.subarray(1));
19
+ return '0x' + bytesToHex(hash.subarray(12));
20
+ }
21
+ /**
22
+ * Lowercase 0x-prefixed 20-byte address derived from a 65-byte uncompressed public key.
23
+ */
24
+ export function addressFromPublicKey(uncompressedPub) {
25
+ if (uncompressedPub.length !== 65) {
26
+ throw new Error(`expected 65-byte uncompressed pubkey, got ${uncompressedPub.length}`);
27
+ }
28
+ if (uncompressedPub[0] !== 0x04) {
29
+ throw new Error(`expected 0x04 prefix on uncompressed pubkey, got ${uncompressedPub[0]?.toString(16)}`);
30
+ }
31
+ const hash = keccak256(uncompressedPub.subarray(1));
32
+ return '0x' + bytesToHex(hash.subarray(12));
33
+ }
34
+ /**
35
+ * EIP-55 checksummed address (mixed-case 0x-prefixed).
36
+ */
37
+ export function toChecksumAddress(address) {
38
+ if (!/^0x[0-9a-fA-F]{40}$/.test(address)) {
39
+ throw new Error(`not a 20-byte hex address: ${address}`);
40
+ }
41
+ const lower = address.slice(2).toLowerCase();
42
+ const hash = keccak256(Buffer.from(lower, 'ascii'));
43
+ let out = '0x';
44
+ for (let i = 0; i < lower.length; i++) {
45
+ const c = lower[i];
46
+ const nibble = hash[i >>> 1] >>> (i % 2 === 0 ? 4 : 0) & 0xf;
47
+ out += nibble >= 8 ? c.toUpperCase() : c;
48
+ }
49
+ return out;
50
+ }
51
+ //# sourceMappingURL=address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/eth/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,GAAG,GAAG,kBAAkB,CAAC;AAE/B,SAAS,UAAU,CAAC,GAAwB;IAC1C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QAClB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAE,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAA+B;IACnE,MAAM,GAAG,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;IACjD,oEAAoE;IACpE,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,eAAoC;IACvE,IAAI,eAAe,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oDAAoD,eAAe,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAE,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC9D,GAAG,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { keccak256 } from './keccak.js';
2
+ export { type EthSignature, getPublicKeyUncompressed, signDigest, recoverPublicKey, } from './secp.js';
3
+ export { addressFromPrivateKey, addressFromPublicKey, toChecksumAddress, } from './address.js';
4
+ export { type RlpInput, rlpEncode, rlpDecode, encodeInt, } from './rlp.js';
5
+ export { personalSign, personalSignDigest, serializeEthSignature, deserializeEthSignature, } from './sign-message.js';
6
+ export { type Hex, type LegacyTx, type Eip1559Tx, type SignableTx, type AccessListItem, txDigest, signTransaction, } from './sign-tx.js';
7
+ export { type TypedData, type TypedDataDomain, type TypedDataField, type TypedDataTypes, encodeType, typeHash, hashStruct, typedDataDigest, signTypedData, } from './sign-typed.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/eth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,KAAK,YAAY,EACjB,wBAAwB,EACxB,UAAU,EACV,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,QAAQ,EACb,SAAS,EACT,SAAS,EACT,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,GAAG,EACR,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,QAAQ,EACR,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,UAAU,EACV,QAAQ,EACR,UAAU,EACV,eAAe,EACf,aAAa,GACd,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { keccak256 } from './keccak.js';
2
+ export { getPublicKeyUncompressed, signDigest, recoverPublicKey, } from './secp.js';
3
+ export { addressFromPrivateKey, addressFromPublicKey, toChecksumAddress, } from './address.js';
4
+ export { rlpEncode, rlpDecode, encodeInt, } from './rlp.js';
5
+ export { personalSign, personalSignDigest, serializeEthSignature, deserializeEthSignature, } from './sign-message.js';
6
+ export { txDigest, signTransaction, } from './sign-tx.js';
7
+ export { encodeType, typeHash, hashStruct, typedDataDigest, signTypedData, } from './sign-typed.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/eth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAEL,wBAAwB,EACxB,UAAU,EACV,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,SAAS,EACT,SAAS,EACT,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAML,QAAQ,EACR,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAKL,UAAU,EACV,QAAQ,EACR,UAAU,EACV,eAAe,EACf,aAAa,GACd,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function keccak256(data: Buffer | Uint8Array): Buffer;
2
+ //# sourceMappingURL=keccak.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keccak.d.ts","sourceRoot":"","sources":["../../../src/eth/keccak.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,5 @@
1
+ import { keccak_256 } from '@noble/hashes/sha3.js';
2
+ export function keccak256(data) {
3
+ return Buffer.from(keccak_256(data));
4
+ }
5
+ //# sourceMappingURL=keccak.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keccak.js","sourceRoot":"","sources":["../../../src/eth/keccak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,UAAU,SAAS,CAAC,IAAyB;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Minimal RLP encoder/decoder for transaction signing. Supports byte strings
3
+ * and (nested) lists. No support for other types — we never need them.
4
+ *
5
+ * Ref: https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/
6
+ */
7
+ export type RlpInput = Buffer | Uint8Array | RlpInput[];
8
+ export declare function rlpEncode(input: RlpInput): Buffer;
9
+ /**
10
+ * Encode a non-negative integer as a minimal big-endian byte string,
11
+ * dropping leading zeros. 0 encodes to empty buffer (RLP convention).
12
+ */
13
+ export declare function encodeInt(n: number | bigint): Buffer;
14
+ export type Decoded = Buffer | Decoded[];
15
+ export declare function rlpDecode(buf: Buffer): Decoded;
16
+ //# sourceMappingURL=rlp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlp.d.ts","sourceRoot":"","sources":["../../../src/eth/rlp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,EAAE,CAAC;AAuBxD,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAOpD;AAiDD,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC;AAOzC,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK9C"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Minimal RLP encoder/decoder for transaction signing. Supports byte strings
3
+ * and (nested) lists. No support for other types — we never need them.
4
+ *
5
+ * Ref: https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/
6
+ */
7
+ function encodeLength(len, offset) {
8
+ if (len < 56) {
9
+ return Buffer.from([offset + len]);
10
+ }
11
+ const hex = len.toString(16);
12
+ const lenBytes = Buffer.from(hex.length % 2 ? '0' + hex : hex, 'hex');
13
+ return Buffer.concat([Buffer.from([offset + 55 + lenBytes.length]), lenBytes]);
14
+ }
15
+ function encodeItem(item) {
16
+ if (Array.isArray(item)) {
17
+ const inner = Buffer.concat(item.map(encodeItem));
18
+ return Buffer.concat([encodeLength(inner.length, 0xc0), inner]);
19
+ }
20
+ const buf = item instanceof Buffer ? item : Buffer.from(item);
21
+ if (buf.length === 1 && buf[0] < 0x80) {
22
+ return Buffer.from([buf[0]]);
23
+ }
24
+ return Buffer.concat([encodeLength(buf.length, 0x80), buf]);
25
+ }
26
+ export function rlpEncode(input) {
27
+ return encodeItem(input);
28
+ }
29
+ /**
30
+ * Encode a non-negative integer as a minimal big-endian byte string,
31
+ * dropping leading zeros. 0 encodes to empty buffer (RLP convention).
32
+ */
33
+ export function encodeInt(n) {
34
+ let v = typeof n === 'bigint' ? n : BigInt(n);
35
+ if (v < 0n)
36
+ throw new Error('cannot encode negative integer');
37
+ if (v === 0n)
38
+ return Buffer.alloc(0);
39
+ let hex = v.toString(16);
40
+ if (hex.length % 2)
41
+ hex = '0' + hex;
42
+ return Buffer.from(hex, 'hex');
43
+ }
44
+ function decodeItem(buf, offset) {
45
+ if (offset >= buf.length)
46
+ throw new Error('rlp: unexpected end of input');
47
+ const first = buf[offset];
48
+ if (first < 0x80) {
49
+ return { value: Buffer.from([first]), consumed: 1 };
50
+ }
51
+ if (first < 0xb8) {
52
+ const len = first - 0x80;
53
+ return { value: Buffer.from(buf.subarray(offset + 1, offset + 1 + len)), consumed: 1 + len };
54
+ }
55
+ if (first < 0xc0) {
56
+ const lenOfLen = first - 0xb7;
57
+ const len = parseInt(buf.subarray(offset + 1, offset + 1 + lenOfLen).toString('hex'), 16);
58
+ const start = offset + 1 + lenOfLen;
59
+ return { value: Buffer.from(buf.subarray(start, start + len)), consumed: 1 + lenOfLen + len };
60
+ }
61
+ if (first < 0xf8) {
62
+ const len = first - 0xc0;
63
+ const items = [];
64
+ let p = offset + 1;
65
+ const end = p + len;
66
+ while (p < end) {
67
+ const item = decodeItem(buf, p);
68
+ items.push(item);
69
+ p += item.consumed;
70
+ }
71
+ return { value: items, consumed: 1 + len };
72
+ }
73
+ const lenOfLen = first - 0xf7;
74
+ const len = parseInt(buf.subarray(offset + 1, offset + 1 + lenOfLen).toString('hex'), 16);
75
+ const start = offset + 1 + lenOfLen;
76
+ const items = [];
77
+ let p = start;
78
+ const end = start + len;
79
+ while (p < end) {
80
+ const item = decodeItem(buf, p);
81
+ items.push(item);
82
+ p += item.consumed;
83
+ }
84
+ return { value: items, consumed: 1 + lenOfLen + len };
85
+ }
86
+ function strip(d) {
87
+ if (Array.isArray(d.value))
88
+ return d.value.map(strip);
89
+ return d.value;
90
+ }
91
+ export function rlpDecode(buf) {
92
+ const { value, consumed } = decodeItem(buf, 0);
93
+ if (consumed !== buf.length)
94
+ throw new Error('rlp: extra bytes after item');
95
+ if (Array.isArray(value))
96
+ return value.map(strip);
97
+ return value;
98
+ }
99
+ //# sourceMappingURL=rlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlp.js","sourceRoot":"","sources":["../../../src/eth/rlp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface EthSignature {
2
+ r: Buffer;
3
+ s: Buffer;
4
+ recovery: 0 | 1;
5
+ }
6
+ export declare function getPublicKeyUncompressed(privateKey: Buffer | Uint8Array): Buffer;
7
+ /**
8
+ * Signs a 32-byte digest and returns the Ethereum-shaped components.
9
+ * The noble v3 recovered format is `recovery || r || s` (recovery is byte 0).
10
+ */
11
+ export declare function signDigest(digest: Buffer | Uint8Array, privateKey: Buffer | Uint8Array): EthSignature;
12
+ /**
13
+ * Recover the 65-byte uncompressed public key (with 0x04 prefix) from a digest and signature.
14
+ * Used in tests and address derivation from signature.
15
+ */
16
+ export declare function recoverPublicKey(digest: Buffer | Uint8Array, sig: EthSignature): Buffer;
17
+ //# sourceMappingURL=secp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secp.d.ts","sourceRoot":"","sources":["../../../src/eth/secp.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAEhF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAYrG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GAAG,UAAU,EAC3B,GAAG,EAAE,YAAY,GAChB,MAAM,CAUR"}