@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.
- package/dist/admin.d.ts +38 -0
- package/dist/admin.d.ts.map +1 -0
- package/dist/admin.js +112 -0
- package/dist/admin.js.map +1 -0
- package/dist/authkey-session.d.ts +64 -0
- package/dist/authkey-session.d.ts.map +1 -0
- package/dist/authkey-session.js +164 -0
- package/dist/authkey-session.js.map +1 -0
- package/dist/bootstrap.d.ts +30 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +60 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/bundler.d.ts +85 -0
- package/dist/bundler.d.ts.map +1 -0
- package/dist/bundler.js +160 -0
- package/dist/bundler.js.map +1 -0
- package/dist/delegate.d.ts +57 -0
- package/dist/delegate.d.ts.map +1 -0
- package/dist/delegate.js +111 -0
- package/dist/delegate.js.map +1 -0
- package/dist/frostVerify.d.ts +23 -0
- package/dist/frostVerify.d.ts.map +1 -0
- package/dist/frostVerify.js +69 -0
- package/dist/frostVerify.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/jwks.d.ts +28 -0
- package/dist/jwks.d.ts.map +1 -0
- package/dist/jwks.js +81 -0
- package/dist/jwks.js.map +1 -0
- package/dist/jwt.d.ts +27 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +50 -0
- package/dist/jwt.js.map +1 -0
- package/dist/keygen.d.ts +26 -0
- package/dist/keygen.d.ts.map +1 -0
- package/dist/keygen.js +60 -0
- package/dist/keygen.js.map +1 -0
- package/dist/oauth.d.ts +34 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +119 -0
- package/dist/oauth.js.map +1 -0
- package/dist/request.d.ts +42 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +115 -0
- package/dist/request.js.map +1 -0
- package/dist/scopedSign.d.ts +82 -0
- package/dist/scopedSign.d.ts.map +1 -0
- package/dist/scopedSign.js +130 -0
- package/dist/scopedSign.js.map +1 -0
- package/dist/server-prover.d.ts +29 -0
- package/dist/server-prover.d.ts.map +1 -0
- package/dist/server-prover.js +54 -0
- package/dist/server-prover.js.map +1 -0
- package/dist/session.d.ts +14 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +29 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +56 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/userop.d.ts +104 -0
- package/dist/userop.d.ts.map +1 -0
- package/dist/userop.js +212 -0
- package/dist/userop.js.map +1 -0
- package/dist/x402.d.ts +127 -0
- package/dist/x402.d.ts.map +1 -0
- package/dist/x402.js +167 -0
- package/dist/x402.js.map +1 -0
- package/package.json +64 -0
- package/src/admin.ts +178 -0
- package/src/authkey-session.ts +241 -0
- package/src/bootstrap.ts +106 -0
- package/src/bundler.ts +256 -0
- package/src/delegate.ts +163 -0
- package/src/frostVerify.ts +79 -0
- package/src/generate-inputs.ts +158 -0
- package/src/index.ts +43 -0
- package/src/jwks.ts +92 -0
- package/src/jwt.ts +74 -0
- package/src/keygen.ts +89 -0
- package/src/oauth.ts +157 -0
- package/src/partial-sha.ts +99 -0
- package/src/proof.ts +99 -0
- package/src/request.ts +174 -0
- package/src/scopedSign.ts +184 -0
- package/src/server-prover.ts +76 -0
- package/src/session.ts +33 -0
- package/src/types.ts +63 -0
- package/src/userop.ts +368 -0
- package/src/witness.ts +132 -0
- 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"}
|
package/dist/session.js
ADDED
|
@@ -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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/userop.d.ts
ADDED
|
@@ -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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,GAAG,EAOT,MAAM,MAAM,CAAC;AACd,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7D,OAAO,EAOL,KAAK,gBAAgB,EACtB,MAAM,WAAW,CAAC;AAMnB;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,gBAAgB,EAAE,GAAG,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,GAAG,CAAC;IACb,gBAAgB,EAAE,GAAG,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,iBAAiB,GACjB,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,YAAY,GACZ,YAAY,CAAC;AAEjB,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACtD,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,GAAG,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,GAAG,CAAC;IAChB,eAAe,EAAE,GAAG,CAAC;CACtB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CA+F5B;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;CACf,GAAG,mBAAmB,CA6BtB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,GACd,GAAG,CAgCL;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,OAAO,EAC1B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,OAAO,CAAC,CAIlB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,uBAAuB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC,EAC/G,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,GAAG,GAClB,OAAO,CAAC,GAAG,CAAC,CAWd"}
|