@oleary-labs/signet-sdk 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.
Files changed (95) hide show
  1. package/dist/admin.d.ts +38 -0
  2. package/dist/admin.d.ts.map +1 -0
  3. package/dist/admin.js +112 -0
  4. package/dist/admin.js.map +1 -0
  5. package/dist/authkey-session.d.ts +64 -0
  6. package/dist/authkey-session.d.ts.map +1 -0
  7. package/dist/authkey-session.js +164 -0
  8. package/dist/authkey-session.js.map +1 -0
  9. package/dist/bootstrap.d.ts +30 -0
  10. package/dist/bootstrap.d.ts.map +1 -0
  11. package/dist/bootstrap.js +60 -0
  12. package/dist/bootstrap.js.map +1 -0
  13. package/dist/bundler.d.ts +85 -0
  14. package/dist/bundler.d.ts.map +1 -0
  15. package/dist/bundler.js +160 -0
  16. package/dist/bundler.js.map +1 -0
  17. package/dist/delegate.d.ts +57 -0
  18. package/dist/delegate.d.ts.map +1 -0
  19. package/dist/delegate.js +111 -0
  20. package/dist/delegate.js.map +1 -0
  21. package/dist/frostVerify.d.ts +23 -0
  22. package/dist/frostVerify.d.ts.map +1 -0
  23. package/dist/frostVerify.js +69 -0
  24. package/dist/frostVerify.js.map +1 -0
  25. package/dist/index.d.ts +32 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +38 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/jwks.d.ts +28 -0
  30. package/dist/jwks.d.ts.map +1 -0
  31. package/dist/jwks.js +81 -0
  32. package/dist/jwks.js.map +1 -0
  33. package/dist/jwt.d.ts +27 -0
  34. package/dist/jwt.d.ts.map +1 -0
  35. package/dist/jwt.js +50 -0
  36. package/dist/jwt.js.map +1 -0
  37. package/dist/keygen.d.ts +26 -0
  38. package/dist/keygen.d.ts.map +1 -0
  39. package/dist/keygen.js +60 -0
  40. package/dist/keygen.js.map +1 -0
  41. package/dist/oauth.d.ts +34 -0
  42. package/dist/oauth.d.ts.map +1 -0
  43. package/dist/oauth.js +119 -0
  44. package/dist/oauth.js.map +1 -0
  45. package/dist/request.d.ts +42 -0
  46. package/dist/request.d.ts.map +1 -0
  47. package/dist/request.js +115 -0
  48. package/dist/request.js.map +1 -0
  49. package/dist/scopedSign.d.ts +82 -0
  50. package/dist/scopedSign.d.ts.map +1 -0
  51. package/dist/scopedSign.js +130 -0
  52. package/dist/scopedSign.js.map +1 -0
  53. package/dist/server-prover.d.ts +29 -0
  54. package/dist/server-prover.d.ts.map +1 -0
  55. package/dist/server-prover.js +54 -0
  56. package/dist/server-prover.js.map +1 -0
  57. package/dist/session.d.ts +14 -0
  58. package/dist/session.d.ts.map +1 -0
  59. package/dist/session.js +29 -0
  60. package/dist/session.js.map +1 -0
  61. package/dist/types.d.ts +56 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +5 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/userop.d.ts +104 -0
  66. package/dist/userop.d.ts.map +1 -0
  67. package/dist/userop.js +212 -0
  68. package/dist/userop.js.map +1 -0
  69. package/dist/x402.d.ts +127 -0
  70. package/dist/x402.d.ts.map +1 -0
  71. package/dist/x402.js +167 -0
  72. package/dist/x402.js.map +1 -0
  73. package/package.json +64 -0
  74. package/src/admin.ts +178 -0
  75. package/src/authkey-session.ts +241 -0
  76. package/src/bootstrap.ts +106 -0
  77. package/src/bundler.ts +256 -0
  78. package/src/delegate.ts +163 -0
  79. package/src/frostVerify.ts +79 -0
  80. package/src/generate-inputs.ts +158 -0
  81. package/src/index.ts +43 -0
  82. package/src/jwks.ts +92 -0
  83. package/src/jwt.ts +74 -0
  84. package/src/keygen.ts +89 -0
  85. package/src/oauth.ts +157 -0
  86. package/src/partial-sha.ts +99 -0
  87. package/src/proof.ts +99 -0
  88. package/src/request.ts +174 -0
  89. package/src/scopedSign.ts +184 -0
  90. package/src/server-prover.ts +76 -0
  91. package/src/session.ts +33 -0
  92. package/src/types.ts +63 -0
  93. package/src/userop.ts +368 -0
  94. package/src/witness.ts +132 -0
  95. package/src/x402.ts +275 -0
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Structured EIP-712 signing for scoped keys.
3
+ *
4
+ * Scoped keys reject raw hash signing — the caller must provide a
5
+ * structured payload that the node verifies against the key's scope
6
+ * before computing the hash and signing.
7
+ */
8
+ import { signKeygenRequest } from "./request";
9
+ // ---------------------------------------------------------------------------
10
+ // Scope construction
11
+ // ---------------------------------------------------------------------------
12
+ /**
13
+ * Build an EIP-712 domain scope (scheme 0x03).
14
+ *
15
+ * Format: 0x03 | chainId (8 bytes, uint64 BE) | verifyingContract (20 bytes)
16
+ * Total: 29 bytes.
17
+ */
18
+ export function buildEIP712Scope(chainId, verifyingContract) {
19
+ const buf = new Uint8Array(29);
20
+ buf[0] = 0x03;
21
+ // chainId as 8-byte big-endian
22
+ const view = new DataView(buf.buffer);
23
+ view.setBigUint64(1, BigInt(chainId));
24
+ // verifyingContract as 20 bytes
25
+ const addr = verifyingContract.startsWith("0x")
26
+ ? verifyingContract.slice(2)
27
+ : verifyingContract;
28
+ for (let i = 0; i < 20; i++) {
29
+ buf[9 + i] = parseInt(addr.slice(i * 2, i * 2 + 2), 16);
30
+ }
31
+ return "0x" + Array.from(buf).map((b) => b.toString(16).padStart(2, "0")).join("");
32
+ }
33
+ // ---------------------------------------------------------------------------
34
+ // Structured signing
35
+ // ---------------------------------------------------------------------------
36
+ /**
37
+ * Sign a structured EIP-712 payload with a scoped key.
38
+ *
39
+ * The node extracts the domain from the typed data, verifies it matches
40
+ * the key's scope, computes hashTypedData, and threshold-signs.
41
+ *
42
+ * @param nodeUrl - Target group node URL
43
+ * @param proxyEndpoint - CORS proxy URL
44
+ * @param groupId - Group contract address
45
+ * @param keyId - The scoped sub-key to sign with
46
+ * @param curve - Key curve (e.g. "ecdsa_secp256k1")
47
+ * @param typedData - Full EIP-712 typed data structure
48
+ * @param sessionKeypair - Active session keypair
49
+ * @param claims - OAuth/identity claims for session auth
50
+ * @param identity - For auth key cert sessions
51
+ */
52
+ export async function signTypedData(nodeUrl, proxyEndpoint, groupId, keyId, curve, typedData, sessionKeypair, claims, identity) {
53
+ // Build session-authenticated request (no message hash — payload is sent separately)
54
+ // The canonical hash must use the full sub-key ID (identity + suffix).
55
+ // Extract suffix from keyId: "oauth:iss:sub:suffix" → suffix is last segment
56
+ // The identity param is "iss:sub", so we need to add the suffix.
57
+ const keyParts = keyId.split(":");
58
+ const keySuffix = keyParts.length > 1 ? keyParts[keyParts.length - 1] : undefined;
59
+ const signReq = await signKeygenRequest(sessionKeypair, claims, groupId, keySuffix, identity);
60
+ const res = await fetch(proxyEndpoint, {
61
+ method: "POST",
62
+ headers: {
63
+ "Content-Type": "application/json",
64
+ "x-node-url": nodeUrl,
65
+ "x-node-path": "/v1/sign",
66
+ },
67
+ body: JSON.stringify({
68
+ group_id: groupId.toLowerCase(),
69
+ key_id: keyId,
70
+ key_suffix: keySuffix,
71
+ curve,
72
+ payload: {
73
+ scheme: "eip712",
74
+ typed_data: typedData,
75
+ },
76
+ session_pub: signReq.session_pub,
77
+ request_sig: signReq.request_sig,
78
+ nonce: signReq.nonce,
79
+ timestamp: signReq.timestamp,
80
+ }),
81
+ });
82
+ if (!res.ok) {
83
+ const body = await res.text();
84
+ throw new Error(`Scoped sign failed: ${res.status} — ${body}`);
85
+ }
86
+ const data = await res.json();
87
+ return {
88
+ signature: data.signature,
89
+ ecdsaSignature: data.ecdsa_signature,
90
+ curve: data.curve ?? curve,
91
+ };
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Presets
95
+ // ---------------------------------------------------------------------------
96
+ export const CHAIN_PRESETS = [
97
+ {
98
+ label: "USDC on Base",
99
+ chainId: 8453,
100
+ contractName: "USDC",
101
+ verifyingContract: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
102
+ eip712Name: "USD Coin",
103
+ eip712Version: "2",
104
+ },
105
+ {
106
+ label: "USDC on Base Sepolia",
107
+ chainId: 84532,
108
+ contractName: "USDC",
109
+ verifyingContract: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
110
+ eip712Name: "USD Coin",
111
+ eip712Version: "2",
112
+ },
113
+ {
114
+ label: "USDC on Ethereum",
115
+ chainId: 1,
116
+ contractName: "USDC",
117
+ verifyingContract: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
118
+ eip712Name: "USD Coin",
119
+ eip712Version: "2",
120
+ },
121
+ {
122
+ label: "USDC on Sepolia",
123
+ chainId: 11155111,
124
+ contractName: "USDC",
125
+ verifyingContract: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
126
+ eip712Name: "USD Coin",
127
+ eip712Version: "2",
128
+ },
129
+ ];
130
+ //# sourceMappingURL=scopedSign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopedSign.js","sourceRoot":"","sources":["../src/scopedSign.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Server-side ZK proof generation via the bundler's /v1/prove endpoint.
3
+ *
4
+ * Delegates JWT proof generation to the bundler instead of running
5
+ * noir + bb.js client-side via WASM. Faster (~2-3s vs 2-7s) and
6
+ * avoids shipping heavy WASM binaries to the browser.
7
+ *
8
+ * The returned proof + claims + modulus are everything needed to
9
+ * call authenticateWithBootstrap.
10
+ */
11
+ export interface ServerProofResult {
12
+ proof: Uint8Array;
13
+ sub: string;
14
+ iss: string;
15
+ exp: number;
16
+ aud: string;
17
+ azp: string;
18
+ jwksModulus: Uint8Array;
19
+ sessionPub: string;
20
+ }
21
+ /**
22
+ * Generate a ZK proof of a JWT via the bundler's server-side prover.
23
+ *
24
+ * @param bundlerProxyUrl - URL of the bundler proxy (e.g. "/api/bundler")
25
+ * @param jwt - Raw JWT from OAuth provider
26
+ * @param sessionPubHex - 33-byte compressed secp256k1 public key, hex-encoded
27
+ */
28
+ export declare function generateServerProof(bundlerProxyUrl: string, jwt: string, sessionPubHex: string, apiKey?: string): Promise<ServerProofResult>;
29
+ //# sourceMappingURL=server-prover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-prover.d.ts","sourceRoot":"","sources":["../src/server-prover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAkC5B"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Server-side ZK proof generation via the bundler's /v1/prove endpoint.
3
+ *
4
+ * Delegates JWT proof generation to the bundler instead of running
5
+ * noir + bb.js client-side via WASM. Faster (~2-3s vs 2-7s) and
6
+ * avoids shipping heavy WASM binaries to the browser.
7
+ *
8
+ * The returned proof + claims + modulus are everything needed to
9
+ * call authenticateWithBootstrap.
10
+ */
11
+ /**
12
+ * Generate a ZK proof of a JWT via the bundler's server-side prover.
13
+ *
14
+ * @param bundlerProxyUrl - URL of the bundler proxy (e.g. "/api/bundler")
15
+ * @param jwt - Raw JWT from OAuth provider
16
+ * @param sessionPubHex - 33-byte compressed secp256k1 public key, hex-encoded
17
+ */
18
+ export async function generateServerProof(bundlerProxyUrl, jwt, sessionPubHex, apiKey) {
19
+ const headers = {
20
+ "Content-Type": "application/json",
21
+ "x-bundler-path": "/v1/prove",
22
+ };
23
+ if (apiKey)
24
+ headers["X-API-Key"] = apiKey;
25
+ const res = await fetch(bundlerProxyUrl, {
26
+ method: "POST",
27
+ headers,
28
+ body: JSON.stringify({ jwt, session_pub: sessionPubHex }),
29
+ });
30
+ const result = await res.json();
31
+ if (!res.ok) {
32
+ const msg = result.error ?? JSON.stringify(result);
33
+ throw new Error(`Server proof generation failed: ${res.status} — ${msg}`);
34
+ }
35
+ if (result.error) {
36
+ const msg = typeof result.error === "string" ? result.error : JSON.stringify(result.error);
37
+ throw new Error(`Server proof generation failed: ${msg}`);
38
+ }
39
+ return {
40
+ proof: hexToBytes(result.proof),
41
+ sub: result.sub,
42
+ iss: result.iss,
43
+ exp: result.exp,
44
+ aud: result.aud,
45
+ azp: result.azp,
46
+ jwksModulus: hexToBytes(result.jwks_modulus),
47
+ sessionPub: result.session_pub,
48
+ };
49
+ }
50
+ function hexToBytes(hex) {
51
+ const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
52
+ return new Uint8Array((clean.match(/.{2}/g) ?? []).map((b) => parseInt(b, 16)));
53
+ }
54
+ //# sourceMappingURL=server-prover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-prover.js","sourceRoot":"","sources":["../src/server-prover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,eAAuB,EACvB,GAAW,EACX,aAAqB,EACrB,MAAe;IAEf,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,gBAAgB,EAAE,WAAW;KAC9B,CAAC;IACF,IAAI,MAAM;QAAE,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;IAE1C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE;QACvC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;KAC1D,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAEhC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/B,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;QAC5C,UAAU,EAAE,MAAM,CAAC,WAAW;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,OAAO,IAAI,UAAU,CACnB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CACzD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Session keypair management (secp256k1).
3
+ *
4
+ * Generates an ephemeral keypair for authenticating with bootstrap nodes.
5
+ * The private key is held in memory only — never persisted.
6
+ */
7
+ import type { SessionKeypair } from "./types";
8
+ /**
9
+ * Generate a new ephemeral secp256k1 session keypair.
10
+ */
11
+ export declare function generateSessionKeypair(): Promise<SessionKeypair>;
12
+ export declare function bytesToHex(bytes: Uint8Array): string;
13
+ export declare function hexToBytes(hex: string): Uint8Array;
14
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,cAAc,CAAC,CAMtE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMlD"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Session keypair management (secp256k1).
3
+ *
4
+ * Generates an ephemeral keypair for authenticating with bootstrap nodes.
5
+ * The private key is held in memory only — never persisted.
6
+ */
7
+ /**
8
+ * Generate a new ephemeral secp256k1 session keypair.
9
+ */
10
+ export async function generateSessionKeypair() {
11
+ const { utils, getPublicKey } = await import("@noble/secp256k1");
12
+ const privateKey = utils.randomSecretKey();
13
+ const publicKeyBytes = getPublicKey(privateKey, true); // compressed
14
+ const publicKeyHex = bytesToHex(publicKeyBytes);
15
+ return { privateKey, publicKeyHex };
16
+ }
17
+ export function bytesToHex(bytes) {
18
+ return Array.from(bytes)
19
+ .map((b) => b.toString(16).padStart(2, "0"))
20
+ .join("");
21
+ }
22
+ export function hexToBytes(hex) {
23
+ const bytes = new Uint8Array(hex.length / 2);
24
+ for (let i = 0; i < bytes.length; i++) {
25
+ bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
26
+ }
27
+ return bytes;
28
+ }
29
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa;IACpE,MAAM,YAAY,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAChD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Shared types for the Signet SDK.
3
+ */
4
+ /** Decoded Google ID token claims. */
5
+ export interface IdTokenClaims {
6
+ iss: string;
7
+ sub: string;
8
+ email: string;
9
+ name?: string;
10
+ picture?: string;
11
+ azp: string;
12
+ aud: string;
13
+ exp: number;
14
+ iat: number;
15
+ }
16
+ /** RSA public key from JWKS. */
17
+ export interface JWKSKey {
18
+ kid: string;
19
+ kty: string;
20
+ alg: string;
21
+ n: string;
22
+ e: string;
23
+ }
24
+ /** Session keypair (secp256k1). */
25
+ export interface SessionKeypair {
26
+ privateKey: Uint8Array;
27
+ publicKeyHex: string;
28
+ }
29
+ /** Witness inputs for the jwt_auth noir circuit. */
30
+ export interface CircuitWitness {
31
+ data: number[];
32
+ dataLen: number;
33
+ base64DecodeOffset: number;
34
+ redcParamsLimbs: string[];
35
+ signatureLimbs: string[];
36
+ pubkeyModulusLimbs: string[];
37
+ iss: string;
38
+ sub: string;
39
+ exp: number;
40
+ aud: string;
41
+ azp: string;
42
+ sessionPub: number[];
43
+ }
44
+ /** Auth request body for bootstrap node /v1/auth (OAuth/ZK path). */
45
+ export interface NodeAuthRequest {
46
+ group_id: string;
47
+ session_pub: string;
48
+ proof: string;
49
+ sub: string;
50
+ iss: string;
51
+ exp: number;
52
+ aud: string;
53
+ azp: string;
54
+ jwks_modulus: string;
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,gCAAgC;AAChC,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAE7B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IAGzB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared types for the Signet SDK.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Signet UserOperation pipeline.
3
+ *
4
+ * Framework-agnostic orchestration of the full ERC-4337 flow:
5
+ * build → (paymaster stub) → estimate → (paymaster real) → hash → FROST sign → submit → confirm
6
+ *
7
+ * The caller provides an already-encoded callData (the app-specific part);
8
+ * everything else is generic Signet protocol logic.
9
+ */
10
+ import { type Address, type Hex } from "viem";
11
+ import type { SessionKeypair, IdTokenClaims } from "./types";
12
+ import { type PaymasterContext } from "./bundler";
13
+ /**
14
+ * ERC-4337 PackedUserOperation.
15
+ *
16
+ * This is the format expected by the EntryPoint and validated
17
+ * by SignetAccount.validateUserOp. The signature field carries
18
+ * a 65-byte FROST Schnorr signature (Rx || z || v).
19
+ */
20
+ export interface PackedUserOperation {
21
+ sender: Address;
22
+ nonce: bigint;
23
+ initCode: Hex;
24
+ callData: Hex;
25
+ accountGasLimits: Hex;
26
+ preVerificationGas: bigint;
27
+ gasFees: Hex;
28
+ paymasterAndData: Hex;
29
+ signature: Hex;
30
+ }
31
+ export type UserOpStatus = "building" | "sponsoring-stub" | "estimating" | "sponsoring" | "signing" | "submitting" | "confirming";
32
+ export interface SignetWriteConfig {
33
+ rpcUrl: string;
34
+ chainId: number;
35
+ entryPointAddress: Address;
36
+ bundlerProxyUrl: string;
37
+ nodeProxyUrl: string;
38
+ bootstrapGroup: Address;
39
+ bootstrapNodes: string[];
40
+ accountFactoryAddress: Address;
41
+ accountFactoryAbi: readonly Record<string, unknown>[];
42
+ usePaymaster: boolean;
43
+ paymasterContext?: PaymasterContext;
44
+ }
45
+ export interface SignetWriteParams {
46
+ account: Address;
47
+ groupPublicKey: Hex;
48
+ dest: Address;
49
+ value?: bigint;
50
+ callData: Hex;
51
+ sessionKeypair: SessionKeypair;
52
+ claims: IdTokenClaims;
53
+ onStatus?: (status: UserOpStatus) => void;
54
+ }
55
+ export interface SignetWriteResult {
56
+ userOpHash: Hex;
57
+ transactionHash: Hex;
58
+ }
59
+ /**
60
+ * Submit a UserOperation through the full Signet pipeline.
61
+ *
62
+ * Ordering is strict — see CLAUDE.md "Write flow ordering" for rationale:
63
+ * 1. Build unsigned UserOp (with initCode if account not deployed)
64
+ * 2. (if paymaster) Attach stub paymasterAndData for gas estimation
65
+ * 3. Estimate gas via bundler
66
+ * 4. (if paymaster) Replace stub with real signed paymaster blob
67
+ * 5. Compute UserOp hash
68
+ * 6. FROST threshold sign via bootstrap group
69
+ * 7. Submit to bundler
70
+ * 8. Poll for receipt
71
+ */
72
+ export declare function submitUserOp(config: SignetWriteConfig, params: SignetWriteParams): Promise<SignetWriteResult>;
73
+ /**
74
+ * Build an unsigned UserOperation for a SignetAccount.execute call.
75
+ */
76
+ export declare function buildUserOp(params: {
77
+ sender: Address;
78
+ nonce: bigint;
79
+ initCode?: Hex;
80
+ dest: Address;
81
+ value?: bigint;
82
+ callData: Hex;
83
+ }): PackedUserOperation;
84
+ /**
85
+ * Compute the UserOperation hash for signing.
86
+ *
87
+ * Matches EntryPoint v0.7 packed format:
88
+ * keccak256(abi.encode(keccak256(packedFields), entryPoint, chainId))
89
+ */
90
+ export declare function getUserOpHash(userOp: PackedUserOperation, entryPoint: Address, chainId: number): Hex;
91
+ /**
92
+ * Fetch the current nonce for an account from the EntryPoint.
93
+ */
94
+ export declare function fetchNonce(rpcUrl: string, entryPointAddress: Address, account: Address): Promise<bigint>;
95
+ /**
96
+ * Check if a SignetAccount is deployed at the given address.
97
+ */
98
+ export declare function isAccountDeployed(rpcUrl: string, account: Address): Promise<boolean>;
99
+ /**
100
+ * Build initCode for deploying a SignetAccount via the account factory.
101
+ * Returns "0x" if the account is already deployed.
102
+ */
103
+ export declare function buildInitCode(config: Pick<SignetWriteConfig, "rpcUrl" | "accountFactoryAddress" | "accountFactoryAbi" | "entryPointAddress">, account: Address, groupPublicKey: Hex): Promise<Hex>;
104
+ //# sourceMappingURL=userop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userop.d.ts","sourceRoot":"","sources":["../src/userop.ts"],"names":[],"mappings":"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"}