@shielded-x402/client 0.1.3 → 0.2.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/client.d.ts +4 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +26 -13
  5. package/dist/client.js.map +1 -1
  6. package/dist/crypto.d.ts.map +1 -1
  7. package/dist/crypto.js +2 -2
  8. package/dist/crypto.js.map +1 -1
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/packages/shared-types/src/crypto-spec.d.ts +16 -0
  14. package/dist/packages/shared-types/src/crypto-spec.d.ts.map +1 -0
  15. package/dist/packages/shared-types/src/crypto-spec.js +15 -0
  16. package/dist/packages/shared-types/src/crypto-spec.js.map +1 -0
  17. package/dist/packages/shared-types/src/index.d.ts +4 -0
  18. package/dist/packages/shared-types/src/index.d.ts.map +1 -0
  19. package/dist/packages/shared-types/src/index.js +4 -0
  20. package/dist/packages/shared-types/src/index.js.map +1 -0
  21. package/dist/packages/shared-types/src/types.d.ts +115 -0
  22. package/dist/packages/shared-types/src/types.d.ts.map +1 -0
  23. package/dist/packages/shared-types/src/types.js +2 -0
  24. package/dist/packages/shared-types/src/types.js.map +1 -0
  25. package/dist/packages/shared-types/src/x402.d.ts +20 -0
  26. package/dist/packages/shared-types/src/x402.d.ts.map +1 -0
  27. package/dist/packages/shared-types/src/x402.js +96 -0
  28. package/dist/packages/shared-types/src/x402.js.map +1 -0
  29. package/dist/proofProvider.d.ts.map +1 -1
  30. package/dist/proofProvider.js +9 -4
  31. package/dist/proofProvider.js.map +1 -1
  32. package/dist/relayerFetch.d.ts +36 -0
  33. package/dist/relayerFetch.d.ts.map +1 -0
  34. package/dist/relayerFetch.js +195 -0
  35. package/dist/relayerFetch.js.map +1 -0
  36. package/dist/sdk/client/src/client.d.ts +26 -0
  37. package/dist/sdk/client/src/client.d.ts.map +1 -0
  38. package/dist/sdk/client/src/client.js +174 -0
  39. package/dist/sdk/client/src/client.js.map +1 -0
  40. package/dist/sdk/client/src/crypto.d.ts +5 -0
  41. package/dist/sdk/client/src/crypto.d.ts.map +1 -0
  42. package/dist/sdk/client/src/crypto.js +15 -0
  43. package/dist/sdk/client/src/crypto.js.map +1 -0
  44. package/dist/sdk/client/src/index.d.ts +10 -0
  45. package/dist/sdk/client/src/index.d.ts.map +1 -0
  46. package/dist/sdk/client/src/index.js +10 -0
  47. package/dist/sdk/client/src/index.js.map +1 -0
  48. package/dist/sdk/client/src/indexer.d.ts +22 -0
  49. package/dist/sdk/client/src/indexer.d.ts.map +1 -0
  50. package/dist/sdk/client/src/indexer.js +20 -0
  51. package/dist/sdk/client/src/indexer.js.map +1 -0
  52. package/dist/sdk/client/src/merkle.d.ts +11 -0
  53. package/dist/sdk/client/src/merkle.d.ts.map +1 -0
  54. package/dist/sdk/client/src/merkle.js +63 -0
  55. package/dist/sdk/client/src/merkle.js.map +1 -0
  56. package/dist/sdk/client/src/notes.d.ts +19 -0
  57. package/dist/sdk/client/src/notes.d.ts.map +1 -0
  58. package/dist/sdk/client/src/notes.js +105 -0
  59. package/dist/sdk/client/src/notes.js.map +1 -0
  60. package/dist/sdk/client/src/proofProvider.d.ts +33 -0
  61. package/dist/sdk/client/src/proofProvider.d.ts.map +1 -0
  62. package/dist/sdk/client/src/proofProvider.js +207 -0
  63. package/dist/sdk/client/src/proofProvider.js.map +1 -0
  64. package/dist/sdk/client/src/relayerFetch.d.ts +36 -0
  65. package/dist/sdk/client/src/relayerFetch.d.ts.map +1 -0
  66. package/dist/sdk/client/src/relayerFetch.js +195 -0
  67. package/dist/sdk/client/src/relayerFetch.js.map +1 -0
  68. package/dist/sdk/client/src/shieldedFetch.d.ts +39 -0
  69. package/dist/sdk/client/src/shieldedFetch.d.ts.map +1 -0
  70. package/dist/sdk/client/src/shieldedFetch.js +88 -0
  71. package/dist/sdk/client/src/shieldedFetch.js.map +1 -0
  72. package/dist/sdk/client/src/types.d.ts +57 -0
  73. package/dist/sdk/client/src/types.d.ts.map +1 -0
  74. package/dist/sdk/client/src/types.js +2 -0
  75. package/dist/sdk/client/src/types.js.map +1 -0
  76. package/dist/shieldedFetch.d.ts +10 -0
  77. package/dist/shieldedFetch.d.ts.map +1 -1
  78. package/dist/shieldedFetch.js +54 -1
  79. package/dist/shieldedFetch.js.map +1 -1
  80. package/dist/types.d.ts +5 -0
  81. package/dist/types.d.ts.map +1 -1
  82. package/package.json +3 -3
@@ -0,0 +1,36 @@
1
+ import { type Hex, type PaymentRequirement, type ShieldedNote } from '@shielded-x402/shared-types';
2
+ import { ShieldedClientSDK } from './client.js';
3
+ import type { MerkleWitness } from './merkle.js';
4
+ export interface RelayedShieldedFetchContext {
5
+ note: ShieldedNote;
6
+ witness: MerkleWitness;
7
+ payerPkHash: Hex;
8
+ }
9
+ export interface ResolveRelayedContextArgs {
10
+ input: string;
11
+ init: RequestInit;
12
+ requirement: PaymentRequirement;
13
+ challengeResponse: Response;
14
+ }
15
+ export interface UnsupportedRelayedRailArgs {
16
+ input: string;
17
+ init: RequestInit;
18
+ requirement: PaymentRequirement;
19
+ challengeResponse: Response;
20
+ }
21
+ export interface CreateRelayedShieldedFetchConfig {
22
+ sdk: ShieldedClientSDK;
23
+ relayerEndpoint: string;
24
+ relayerPath?: string;
25
+ relayerChallengePath?: string;
26
+ resolveContext: (args: ResolveRelayedContextArgs) => Promise<RelayedShieldedFetchContext>;
27
+ challengeUrlResolver?: (args: {
28
+ input: string;
29
+ requirement?: PaymentRequirement;
30
+ }) => string | undefined;
31
+ onUnsupportedRail?: (args: UnsupportedRelayedRailArgs) => Promise<Response>;
32
+ fetchImpl?: typeof fetch;
33
+ }
34
+ export type RelayedShieldedFetch = (input: string | URL, init?: RequestInit) => Promise<Response>;
35
+ export declare function createRelayedShieldedFetch(config: CreateRelayedShieldedFetchConfig): RelayedShieldedFetch;
36
+ //# sourceMappingURL=relayerFetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayerFetch.d.ts","sourceRoot":"","sources":["../src/relayerFetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,kBAAkB,EAKvB,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,GAAG,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,kBAAkB,CAAC;IAChC,iBAAiB,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,kBAAkB,CAAC;IAChC,iBAAiB,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,gCAAgC;IAC/C,GAAG,EAAE,iBAAiB,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1F,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,kBAAkB,CAAA;KAAE,KAAK,MAAM,GAAG,SAAS,CAAC;IACzG,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5E,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAyHlG,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gCAAgC,GAAG,oBAAoB,CAuHzG"}
@@ -0,0 +1,195 @@
1
+ import { parsePaymentRequiredEnvelope, parsePaymentRequiredHeader, RELAYER_ROUTES, X402_HEADERS } from '@shielded-x402/shared-types';
2
+ function normalizeInput(input) {
3
+ if (typeof input === 'string')
4
+ return input;
5
+ return input.toString();
6
+ }
7
+ function headersToRecord(headers) {
8
+ if (!headers)
9
+ return {};
10
+ const out = {};
11
+ const cast = new Headers(headers);
12
+ cast.forEach((value, key) => {
13
+ out[key] = value;
14
+ });
15
+ return out;
16
+ }
17
+ function bytesToBase64(bytes) {
18
+ return Buffer.from(bytes).toString('base64');
19
+ }
20
+ function serializedToFetchInit(method, serialized) {
21
+ const init = {
22
+ method,
23
+ headers: serialized.headers
24
+ };
25
+ if (method !== 'GET' && method !== 'HEAD' && serialized.bodyBase64 !== undefined) {
26
+ init.body = Buffer.from(serialized.bodyBase64, 'base64');
27
+ }
28
+ return init;
29
+ }
30
+ async function requestShieldedRequirementFromRelayer(baseFetch, relayerEndpoint, relayerChallengePath, merchantRequest, merchantPaymentRequiredHeader) {
31
+ const challengeRequest = {
32
+ merchantRequest,
33
+ merchantPaymentRequiredHeader
34
+ };
35
+ const response = await baseFetch(`${relayerEndpoint.replace(/\/$/, '')}${relayerChallengePath}`, {
36
+ method: 'POST',
37
+ headers: {
38
+ 'content-type': 'application/json'
39
+ },
40
+ body: JSON.stringify(challengeRequest)
41
+ });
42
+ if (!response.ok) {
43
+ const body = await response.text();
44
+ throw new Error(`relayer challenge request failed: ${response.status} ${body}`);
45
+ }
46
+ const payload = (await response.json());
47
+ if (payload.requirement) {
48
+ return payload.requirement;
49
+ }
50
+ if (payload.paymentRequiredHeader) {
51
+ return parsePaymentRequiredHeader(payload.paymentRequiredHeader);
52
+ }
53
+ throw new Error('relayer challenge response missing requirement');
54
+ }
55
+ async function serializeMerchantRequestBody(method, headers, body) {
56
+ const normalizedMethod = method.toUpperCase();
57
+ const supportsBody = normalizedMethod !== 'GET' && normalizedMethod !== 'HEAD';
58
+ const requestInit = {
59
+ method: normalizedMethod
60
+ };
61
+ if (headers !== undefined) {
62
+ requestInit.headers = headers;
63
+ }
64
+ if (supportsBody && body !== undefined && body !== null) {
65
+ requestInit.body = body;
66
+ }
67
+ const request = new Request('http://relay.local', requestInit);
68
+ const serializedHeaders = headersToRecord(request.headers);
69
+ if (!supportsBody || body === undefined || body === null) {
70
+ return { headers: serializedHeaders };
71
+ }
72
+ const bytes = new Uint8Array(await request.arrayBuffer());
73
+ return {
74
+ headers: serializedHeaders,
75
+ bodyBase64: bytesToBase64(bytes)
76
+ };
77
+ }
78
+ function toRelayResultResponse(relayResponse) {
79
+ const settlementIdHeader = { 'x-relayer-settlement-id': relayResponse.settlementId };
80
+ if (!relayResponse.merchantResult) {
81
+ const status = relayResponse.status === 'DONE' ? 200 : 502;
82
+ return new Response(JSON.stringify(relayResponse), {
83
+ status,
84
+ headers: {
85
+ ...settlementIdHeader,
86
+ 'content-type': 'application/json'
87
+ }
88
+ });
89
+ }
90
+ return new Response(Buffer.from(relayResponse.merchantResult.bodyBase64, 'base64'), {
91
+ status: relayResponse.merchantResult.status,
92
+ headers: {
93
+ ...relayResponse.merchantResult.headers,
94
+ ...settlementIdHeader
95
+ }
96
+ });
97
+ }
98
+ export function createRelayedShieldedFetch(config) {
99
+ const baseFetch = config.fetchImpl ?? fetch;
100
+ const relayerPath = config.relayerPath ?? RELAYER_ROUTES.pay;
101
+ const relayerChallengePath = config.relayerChallengePath ?? RELAYER_ROUTES.challenge;
102
+ return async (input, init) => {
103
+ const normalizedInput = normalizeInput(input);
104
+ const requestInit = init ?? {};
105
+ const method = (requestInit.method ?? 'GET').toUpperCase();
106
+ const serializedRequest = await serializeMerchantRequestBody(method, requestInit.headers, requestInit.body);
107
+ const baseMerchantRequest = {
108
+ url: normalizedInput,
109
+ method,
110
+ headers: serializedRequest.headers,
111
+ ...(serializedRequest.bodyBase64 !== undefined
112
+ ? { bodyBase64: serializedRequest.bodyBase64 }
113
+ : {})
114
+ };
115
+ const first = await baseFetch(normalizedInput, serializedToFetchInit(method, serializedRequest));
116
+ if (first.status !== 402)
117
+ return first;
118
+ const merchantRequiredHeader = first.headers.get(X402_HEADERS.paymentRequired);
119
+ if (!merchantRequiredHeader) {
120
+ throw new Error(`missing ${X402_HEADERS.paymentRequired} header`);
121
+ }
122
+ parsePaymentRequiredEnvelope(merchantRequiredHeader);
123
+ let requirement;
124
+ let parsedRequirement;
125
+ try {
126
+ parsedRequirement = config.sdk.parse402Response(first).requirement;
127
+ }
128
+ catch {
129
+ parsedRequirement = undefined;
130
+ }
131
+ if (parsedRequirement?.rail === 'shielded-usdc') {
132
+ requirement = parsedRequirement;
133
+ }
134
+ else {
135
+ const challengeUrl = config.challengeUrlResolver?.(parsedRequirement
136
+ ? {
137
+ input: normalizedInput,
138
+ requirement: parsedRequirement
139
+ }
140
+ : {
141
+ input: normalizedInput
142
+ });
143
+ try {
144
+ requirement = await requestShieldedRequirementFromRelayer(baseFetch, config.relayerEndpoint, relayerChallengePath, {
145
+ ...baseMerchantRequest,
146
+ ...(challengeUrl ? { challengeUrl } : {})
147
+ }, merchantRequiredHeader);
148
+ }
149
+ catch (error) {
150
+ if (parsedRequirement && config.onUnsupportedRail) {
151
+ return config.onUnsupportedRail({
152
+ input: normalizedInput,
153
+ init: requestInit,
154
+ requirement: parsedRequirement,
155
+ challengeResponse: first
156
+ });
157
+ }
158
+ throw error;
159
+ }
160
+ }
161
+ const context = await config.resolveContext({
162
+ input: normalizedInput,
163
+ init: requestInit,
164
+ requirement,
165
+ challengeResponse: first
166
+ });
167
+ const prepared = await config.sdk.prepare402Payment(requirement, context.note, context.witness, context.payerPkHash, serializedRequest.headers);
168
+ const paymentSignatureHeader = prepared.headers.get(X402_HEADERS.paymentSignature);
169
+ if (!paymentSignatureHeader) {
170
+ throw new Error('failed to build relayer payment headers');
171
+ }
172
+ const challengeUrl = config.challengeUrlResolver?.({
173
+ input: normalizedInput,
174
+ requirement
175
+ });
176
+ const relayRequest = {
177
+ merchantRequest: {
178
+ ...baseMerchantRequest,
179
+ ...(challengeUrl ? { challengeUrl } : {})
180
+ },
181
+ requirement,
182
+ paymentSignatureHeader
183
+ };
184
+ const relayerResponse = await baseFetch(`${config.relayerEndpoint.replace(/\/$/, '')}${relayerPath}`, {
185
+ method: 'POST',
186
+ headers: {
187
+ 'content-type': 'application/json'
188
+ },
189
+ body: JSON.stringify(relayRequest)
190
+ });
191
+ const relayPayload = (await relayerResponse.json());
192
+ return toRelayResultResponse(relayPayload);
193
+ };
194
+ }
195
+ //# sourceMappingURL=relayerFetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayerFetch.js","sourceRoot":"","sources":["../src/relayerFetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type Hex, type PaymentRequirement, type ShieldedNote, type ShieldedPaymentResponse } from '@shielded-x402/shared-types';
2
+ import { type MerkleWitness } from './merkle.js';
3
+ import type { Parsed402, Prepared402Payment, ShieldedClientConfig, SpendBuildParams, SpendProofBundle } from './types.js';
4
+ export declare class ShieldedClientSDK {
5
+ private readonly config;
6
+ constructor(config: ShieldedClientConfig);
7
+ deposit(amount: bigint, ownerPkHash: Hex): Promise<{
8
+ note: ShieldedNote;
9
+ txHash?: Hex;
10
+ leafIndex: number;
11
+ }>;
12
+ buildSpendProof(params: SpendBuildParams): SpendProofBundle;
13
+ buildSpendProofWithProvider(params: SpendBuildParams): Promise<SpendProofBundle>;
14
+ private attachRealProof;
15
+ pay402(paymentResponse: ShieldedPaymentResponse, requirement: PaymentRequirement, challengeNonce: Hex): Promise<{
16
+ payload: string;
17
+ signature: string;
18
+ paymentSignatureHeader: string;
19
+ }>;
20
+ parse402Response(response: Response): Parsed402;
21
+ prepare402Payment(requirement: PaymentRequirement, note: ShieldedNote, witness: MerkleWitness, payerPkHash: Hex, baseHeaders?: HeadersInit): Promise<Prepared402Payment>;
22
+ complete402Payment(input: string, init: RequestInit, requirement: PaymentRequirement, note: ShieldedNote, witness: MerkleWitness, payerPkHash: Hex, fetchFn?: typeof fetch): Promise<Response>;
23
+ fetchWithShieldedPayment(input: string, init: RequestInit, note: ShieldedNote, witness: MerkleWitness, payerPkHash: Hex): Promise<Response>;
24
+ }
25
+ export declare function buildWitnessFromCommitments(commitments: Hex[], targetIndex: number): MerkleWitness;
26
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC7B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EACV,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAcpB,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,oBAAoB;IAEnD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAqBjH,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB;IA8CrD,2BAA2B,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAKxE,eAAe;IA8BvB,MAAM,CACV,eAAe,EAAE,uBAAuB,EACxC,WAAW,EAAE,kBAAkB,EAC/B,cAAc,EAAE,GAAG,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,sBAAsB,EAAE,MAAM,CAAA;KAAE,CAAC;IAalF,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS;IAMzC,iBAAiB,CACrB,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,kBAAkB,CAAC;IAoCxB,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,GAAG,EAChB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,QAAQ,CAAC;IAed,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;CAOlJ;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAElG"}
@@ -0,0 +1,174 @@
1
+ import { X402_HEADERS, buildPaymentSignatureHeader, normalizeRequirement, parsePaymentRequiredHeader } from '@shielded-x402/shared-types';
2
+ import { randomBytes } from 'node:crypto';
3
+ import { deriveChallengeHash, deriveCommitment, deriveNullifier } from './crypto.js';
4
+ import { deriveWitness } from './merkle.js';
5
+ const BN254_FIELD_MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617n;
6
+ function randomFieldHex() {
7
+ while (true) {
8
+ const candidate = BigInt(`0x${randomBytes(32).toString('hex')}`);
9
+ if (candidate < BN254_FIELD_MODULUS) {
10
+ return (`0x${candidate.toString(16).padStart(64, '0')}`);
11
+ }
12
+ }
13
+ }
14
+ export class ShieldedClientSDK {
15
+ config;
16
+ constructor(config) {
17
+ this.config = config;
18
+ }
19
+ async deposit(amount, ownerPkHash) {
20
+ const rho = randomFieldHex();
21
+ const commitment = deriveCommitment(amount, rho, ownerPkHash);
22
+ const tx = this.config.depositFn ? await this.config.depositFn(amount, commitment) : undefined;
23
+ const result = {
24
+ note: {
25
+ amount,
26
+ rho,
27
+ pkHash: ownerPkHash,
28
+ commitment,
29
+ leafIndex: tx?.leafIndex ?? -1
30
+ },
31
+ leafIndex: tx?.leafIndex ?? -1
32
+ };
33
+ if (tx?.txHash) {
34
+ result.txHash = tx.txHash;
35
+ }
36
+ return result;
37
+ }
38
+ buildSpendProof(params) {
39
+ if (params.amount > params.note.amount) {
40
+ throw new Error('insufficient note amount');
41
+ }
42
+ const nullifier = deriveNullifier(params.nullifierSecret, params.note.commitment);
43
+ const merchantRho = params.merchantRho ?? randomFieldHex();
44
+ const merchantCommitment = deriveCommitment(params.amount, merchantRho, params.merchantPubKey);
45
+ const changeAmount = params.note.amount - params.amount;
46
+ const changeRho = params.changeRho ?? randomFieldHex();
47
+ const changeCommitment = deriveCommitment(changeAmount, changeRho, params.note.pkHash);
48
+ const challengeHash = deriveChallengeHash(params.challengeNonce, params.amount, params.merchantAddress);
49
+ const amountHex = `0x${params.amount.toString(16).padStart(64, '0')}`;
50
+ const response = {
51
+ proof: '0x00',
52
+ publicInputs: [
53
+ nullifier,
54
+ params.witness.root,
55
+ merchantCommitment,
56
+ changeCommitment,
57
+ challengeHash,
58
+ amountHex
59
+ ],
60
+ nullifier,
61
+ root: params.witness.root,
62
+ merchantCommitment,
63
+ changeCommitment,
64
+ challengeHash,
65
+ encryptedReceipt: params.encryptedReceipt,
66
+ txHint: `leaf:${params.note.leafIndex}`
67
+ };
68
+ return {
69
+ merchantRho,
70
+ response,
71
+ changeNote: {
72
+ amount: changeAmount,
73
+ rho: changeRho,
74
+ pkHash: params.note.pkHash,
75
+ commitment: changeCommitment,
76
+ leafIndex: -1
77
+ }
78
+ };
79
+ }
80
+ async buildSpendProofWithProvider(params) {
81
+ const bundle = this.buildSpendProof(params);
82
+ return this.attachRealProof(bundle, params);
83
+ }
84
+ async attachRealProof(bundle, params) {
85
+ if (!this.config.proofProvider) {
86
+ return bundle;
87
+ }
88
+ const proofResult = await this.config.proofProvider.generateProof({
89
+ note: params.note,
90
+ witness: params.witness,
91
+ nullifierSecret: params.nullifierSecret,
92
+ merchantPubKey: params.merchantPubKey,
93
+ merchantRho: bundle.merchantRho,
94
+ changePkHash: params.note.pkHash,
95
+ changeRho: bundle.changeNote.rho,
96
+ amount: params.amount,
97
+ challengeNonce: params.challengeNonce,
98
+ merchantAddress: params.merchantAddress,
99
+ expectedPublicInputs: bundle.response.publicInputs
100
+ });
101
+ const publicInputs = proofResult.publicInputs ?? bundle.response.publicInputs;
102
+ return {
103
+ ...bundle,
104
+ response: {
105
+ ...bundle.response,
106
+ proof: proofResult.proof,
107
+ publicInputs
108
+ }
109
+ };
110
+ }
111
+ async pay402(paymentResponse, requirement, challengeNonce) {
112
+ const payload = JSON.stringify(paymentResponse);
113
+ const signature = await this.config.signer(payload);
114
+ const paymentSignatureHeader = buildPaymentSignatureHeader({
115
+ x402Version: 2,
116
+ accepted: normalizeRequirement(requirement),
117
+ payload: paymentResponse,
118
+ challengeNonce,
119
+ signature: signature
120
+ });
121
+ return { payload, signature, paymentSignatureHeader };
122
+ }
123
+ parse402Response(response) {
124
+ const header = response.headers.get(X402_HEADERS.paymentRequired);
125
+ if (!header)
126
+ throw new Error(`missing ${X402_HEADERS.paymentRequired} header`);
127
+ return { requirement: parsePaymentRequiredHeader(header) };
128
+ }
129
+ async prepare402Payment(requirement, note, witness, payerPkHash, baseHeaders) {
130
+ if (requirement.rail !== 'shielded-usdc') {
131
+ throw new Error(`unsupported rail: ${requirement.rail}`);
132
+ }
133
+ const nonce = requirement.challengeNonce;
134
+ const merchant = requirement.verifyingContract;
135
+ const amount = BigInt(requirement.amount);
136
+ const spendParams = {
137
+ note,
138
+ witness,
139
+ nullifierSecret: payerPkHash,
140
+ merchantPubKey: requirement.merchantPubKey,
141
+ merchantAddress: merchant,
142
+ amount,
143
+ challengeNonce: nonce,
144
+ encryptedReceipt: '0x'
145
+ };
146
+ const bundleWithProof = await this.buildSpendProofWithProvider(spendParams);
147
+ const signed = await this.pay402(bundleWithProof.response, requirement, requirement.challengeNonce);
148
+ const headers = new Headers(baseHeaders);
149
+ headers.set(X402_HEADERS.paymentSignature, signed.paymentSignatureHeader);
150
+ return {
151
+ requirement,
152
+ headers,
153
+ response: bundleWithProof.response
154
+ };
155
+ }
156
+ async complete402Payment(input, init, requirement, note, witness, payerPkHash, fetchFn = fetch) {
157
+ const prepared = await this.prepare402Payment(requirement, note, witness, payerPkHash, init.headers);
158
+ return fetchFn(input, {
159
+ ...init,
160
+ headers: prepared.headers
161
+ });
162
+ }
163
+ async fetchWithShieldedPayment(input, init, note, witness, payerPkHash) {
164
+ const first = await fetch(input, init);
165
+ if (first.status !== 402)
166
+ return first;
167
+ const parsed = this.parse402Response(first);
168
+ return this.complete402Payment(input, init, parsed.requirement, note, witness, payerPkHash);
169
+ }
170
+ }
171
+ export function buildWitnessFromCommitments(commitments, targetIndex) {
172
+ return deriveWitness(commitments, targetIndex);
173
+ }
174
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type Hex } from 'viem';
2
+ export declare function deriveCommitment(amount: bigint, rho: Hex, pkHash: Hex): Hex;
3
+ export declare function deriveNullifier(nullifierSecret: Hex, commitment: Hex): Hex;
4
+ export declare function deriveChallengeHash(challengeNonce: Hex, amount: bigint, merchant: Hex): Hex;
5
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../../src/crypto.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAE3D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAG3E;AAED,wBAAgB,eAAe,CAAC,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,GAAG,GAAG,CAE1E;AAED,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,CAM3F"}
@@ -0,0 +1,15 @@
1
+ import { CRYPTO_SPEC } from '@shielded-x402/shared-types';
2
+ import { concatHex, keccak256, pad } from 'viem';
3
+ export function deriveCommitment(amount, rho, pkHash) {
4
+ const amountWord = `0x${amount.toString(16).padStart(64, '0')}`;
5
+ return keccak256(concatHex([amountWord, rho, pkHash]));
6
+ }
7
+ export function deriveNullifier(nullifierSecret, commitment) {
8
+ return keccak256(concatHex([nullifierSecret, commitment]));
9
+ }
10
+ export function deriveChallengeHash(challengeNonce, amount, merchant) {
11
+ const amountWord = `0x${amount.toString(16).padStart(64, '0')}`;
12
+ const merchantWord = pad(merchant, { size: 32 });
13
+ return keccak256(concatHex([CRYPTO_SPEC.challengeDomainHash, challengeNonce, amountWord, merchantWord]));
14
+ }
15
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAY,MAAM,MAAM,CAAC;AAE3D,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,GAAQ,EAAE,MAAW;IACpE,MAAM,UAAU,GAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAU,CAAC;IACzE,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,eAAoB,EAAE,UAAe;IACnE,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,cAAmB,EAAE,MAAc,EAAE,QAAa;IACpF,MAAM,UAAU,GAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAU,CAAC;IACzE,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,SAAS,CACd,SAAS,CAAC,CAAC,WAAW,CAAC,mBAA0B,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAC9F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './client.js';
2
+ export * from './crypto.js';
3
+ export * from './indexer.js';
4
+ export * from './merkle.js';
5
+ export * from './notes.js';
6
+ export * from './proofProvider.js';
7
+ export * from './relayerFetch.js';
8
+ export * from './shieldedFetch.js';
9
+ export * from './types.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './client.js';
2
+ export * from './crypto.js';
3
+ export * from './indexer.js';
4
+ export * from './merkle.js';
5
+ export * from './notes.js';
6
+ export * from './proofProvider.js';
7
+ export * from './relayerFetch.js';
8
+ export * from './shieldedFetch.js';
9
+ export * from './types.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Hex, ShieldedNote } from '@shielded-x402/shared-types';
2
+ export interface DepositEvent {
3
+ commitment: Hex;
4
+ leafIndex: number;
5
+ amount: bigint;
6
+ }
7
+ export interface SpendEvent {
8
+ merchantCommitment: Hex;
9
+ changeCommitment: Hex;
10
+ }
11
+ export interface NoteState {
12
+ commitments: Hex[];
13
+ notes: ShieldedNote[];
14
+ }
15
+ export declare class LocalNoteIndexer {
16
+ private readonly state;
17
+ ingestDeposit(event: DepositEvent, note: ShieldedNote): void;
18
+ ingestSpend(event: SpendEvent): void;
19
+ getCommitments(): Hex[];
20
+ getNotes(): ShieldedNote[];
21
+ }
22
+ //# sourceMappingURL=indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../../../src/indexer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,GAAG,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE,GAAG,CAAC;IACxB,gBAAgB,EAAE,GAAG,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAGpB;IAEF,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAK5D,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIpC,cAAc,IAAI,GAAG,EAAE;IAIvB,QAAQ,IAAI,YAAY,EAAE;CAG3B"}
@@ -0,0 +1,20 @@
1
+ export class LocalNoteIndexer {
2
+ state = {
3
+ commitments: [],
4
+ notes: []
5
+ };
6
+ ingestDeposit(event, note) {
7
+ this.state.commitments[event.leafIndex] = event.commitment;
8
+ this.state.notes.push(note);
9
+ }
10
+ ingestSpend(event) {
11
+ this.state.commitments.push(event.merchantCommitment, event.changeCommitment);
12
+ }
13
+ getCommitments() {
14
+ return [...this.state.commitments];
15
+ }
16
+ getNotes() {
17
+ return [...this.state.notes];
18
+ }
19
+ }
20
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../../src/indexer.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,gBAAgB;IACV,KAAK,GAAc;QAClC,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,aAAa,CAAC,KAAmB,EAAE,IAAkB;QACnD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,KAAiB;QAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChF,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { type Hex } from 'viem';
2
+ export interface MerkleWitness {
3
+ root: Hex;
4
+ path: Hex[];
5
+ indexBits: number[];
6
+ }
7
+ export declare function buildZeroes(depth: number): Hex[];
8
+ export declare function emptyRoot(depth?: number): Hex;
9
+ export declare function deriveWitness(commitments: Hex[], targetIndex: number): MerkleWitness;
10
+ export declare function deriveRootFromCommitments(commitments: Hex[]): Hex;
11
+ //# sourceMappingURL=merkle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle.d.ts","sourceRoot":"","sources":["../../../../src/merkle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAKtD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAMD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,CAOhD;AAED,wBAAgB,SAAS,CAAC,KAAK,GAAE,MAAoC,GAAG,GAAG,CAM1E;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CA2CpF;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,CAKjE"}