@4mica/sdk 1.2.17 → 1.3.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 (74) hide show
  1. package/README.md +59 -25
  2. package/dist/index.cjs +5513 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +2730 -0
  5. package/dist/{src/abi/core4mica.d.ts → index.d.ts} +1032 -1
  6. package/dist/index.js +5439 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/models-B15ouNYG.d.cts +386 -0
  9. package/dist/models-B15ouNYG.d.ts +386 -0
  10. package/dist/server.cjs +172 -0
  11. package/dist/server.cjs.map +1 -0
  12. package/dist/server.d.cts +119 -0
  13. package/dist/server.d.ts +119 -0
  14. package/dist/server.js +165 -0
  15. package/dist/server.js.map +1 -0
  16. package/package.json +52 -43
  17. package/dist/package.json +0 -80
  18. package/dist/src/abi/core4mica.js +0 -2200
  19. package/dist/src/abi/erc20.d.ts +0 -151
  20. package/dist/src/abi/erc20.js +0 -201
  21. package/dist/src/auth.d.ts +0 -62
  22. package/dist/src/auth.js +0 -218
  23. package/dist/src/bls.d.ts +0 -6
  24. package/dist/src/bls.js +0 -247
  25. package/dist/src/chain.d.ts +0 -2
  26. package/dist/src/chain.js +0 -26
  27. package/dist/src/client/index.d.ts +0 -71
  28. package/dist/src/client/index.js +0 -120
  29. package/dist/src/client/recipient.d.ts +0 -129
  30. package/dist/src/client/recipient.js +0 -257
  31. package/dist/src/client/shared.d.ts +0 -11
  32. package/dist/src/client/shared.js +0 -17
  33. package/dist/src/client/user.d.ts +0 -109
  34. package/dist/src/client/user.js +0 -151
  35. package/dist/src/config.d.ts +0 -103
  36. package/dist/src/config.js +0 -197
  37. package/dist/src/constants.d.ts +0 -4
  38. package/dist/src/constants.js +0 -7
  39. package/dist/src/contract.d.ts +0 -55
  40. package/dist/src/contract.js +0 -312
  41. package/dist/src/debug.d.ts +0 -2
  42. package/dist/src/debug.js +0 -5
  43. package/dist/src/errors.d.ts +0 -58
  44. package/dist/src/errors.js +0 -81
  45. package/dist/src/guarantee.d.ts +0 -25
  46. package/dist/src/guarantee.js +0 -272
  47. package/dist/src/http.d.ts +0 -11
  48. package/dist/src/http.js +0 -57
  49. package/dist/src/index.d.ts +0 -17
  50. package/dist/src/index.js +0 -33
  51. package/dist/src/models.d.ts +0 -261
  52. package/dist/src/models.js +0 -360
  53. package/dist/src/networks.d.ts +0 -40
  54. package/dist/src/networks.js +0 -57
  55. package/dist/src/payment.d.ts +0 -82
  56. package/dist/src/payment.js +0 -67
  57. package/dist/src/rpc.d.ts +0 -38
  58. package/dist/src/rpc.js +0 -161
  59. package/dist/src/serde.d.ts +0 -5
  60. package/dist/src/serde.js +0 -33
  61. package/dist/src/signing.d.ts +0 -170
  62. package/dist/src/signing.js +0 -311
  63. package/dist/src/utils.d.ts +0 -11
  64. package/dist/src/utils.js +0 -90
  65. package/dist/src/validation.d.ts +0 -32
  66. package/dist/src/validation.js +0 -84
  67. package/dist/src/wallet/cdp.d.ts +0 -13
  68. package/dist/src/wallet/cdp.js +0 -78
  69. package/dist/src/wallet/index.d.ts +0 -2
  70. package/dist/src/wallet/index.js +0 -5
  71. package/dist/src/x402/index.d.ts +0 -90
  72. package/dist/src/x402/index.js +0 -243
  73. package/dist/src/x402/models.d.ts +0 -75
  74. package/dist/src/x402/models.js +0 -2
@@ -0,0 +1,386 @@
1
+ /** Signing scheme used when producing a payment guarantee signature. */
2
+ declare enum SigningScheme {
3
+ /** EIP-712 typed-data signing (default, preferred). */
4
+ EIP712 = "eip712",
5
+ /** EIP-191 personal_sign (for wallets that do not support typed data). */
6
+ EIP191 = "eip191"
7
+ }
8
+ /** ECDSA signature and the scheme used to produce it. */
9
+ interface PaymentSignature {
10
+ /** 65-byte ECDSA signature as a `0x`-prefixed hex string. */
11
+ signature: string;
12
+ scheme: SigningScheme;
13
+ }
14
+ /**
15
+ * V1 payment guarantee request claims. Signed by the payer and submitted to the
16
+ * core RPC to obtain a BLS guarantee certificate.
17
+ *
18
+ * Build with the static {@link PaymentGuaranteeRequestClaims.new} factory which
19
+ * normalises addresses and parses `uint256` values.
20
+ */
21
+ declare class PaymentGuaranteeRequestClaims {
22
+ userAddress: string;
23
+ recipientAddress: string;
24
+ reqId: bigint;
25
+ amount: bigint;
26
+ timestamp: number;
27
+ assetAddress: string;
28
+ constructor(init: {
29
+ userAddress: string;
30
+ recipientAddress: string;
31
+ reqId?: bigint;
32
+ amount: bigint;
33
+ timestamp: number;
34
+ assetAddress: string;
35
+ });
36
+ static new(userAddress: string, recipientAddress: string, amount: number | bigint | string, timestamp: number, erc20Token?: string | null, reqId?: number | bigint | string): PaymentGuaranteeRequestClaims;
37
+ }
38
+ /** On-chain validation policy fields carried in a V2 payment guarantee certificate. */
39
+ interface PaymentGuaranteeValidationPolicyV2 {
40
+ validationRegistryAddress: string;
41
+ validationRequestHash: string;
42
+ validationChainId: number;
43
+ validatorAddress: string;
44
+ validatorAgentId: bigint;
45
+ minValidationScore: number;
46
+ validationSubjectHash: string;
47
+ jobHash: string;
48
+ requiredValidationTag: string;
49
+ }
50
+ /**
51
+ * V2 payment guarantee request claims — extends V1 with a full on-chain validation policy.
52
+ *
53
+ * Compute `validationSubjectHash` via `computeValidationSubjectHash(baseClaims)` and
54
+ * `validationRequestHash` via `computeValidationRequestHash(partialV2)` before constructing.
55
+ * The `jobHash` must be provided and included in the validation request hash.
56
+ *
57
+ * @throws {@link ValidationError} if `minValidationScore` is outside [1, 100].
58
+ */
59
+ declare class PaymentGuaranteeRequestClaimsV2 extends PaymentGuaranteeRequestClaims {
60
+ validationRegistryAddress: string;
61
+ validationRequestHash: string;
62
+ validationChainId: number;
63
+ validatorAddress: string;
64
+ validatorAgentId: bigint;
65
+ minValidationScore: number;
66
+ validationSubjectHash: string;
67
+ jobHash: string;
68
+ requiredValidationTag: string;
69
+ constructor(init: {
70
+ userAddress: string;
71
+ recipientAddress: string;
72
+ reqId?: bigint;
73
+ amount: bigint;
74
+ timestamp: number;
75
+ assetAddress: string;
76
+ validationRegistryAddress: string;
77
+ validationRequestHash: string;
78
+ validationChainId: number;
79
+ validatorAddress: string;
80
+ validatorAgentId: bigint;
81
+ minValidationScore: number;
82
+ validationSubjectHash: string;
83
+ jobHash: string;
84
+ requiredValidationTag: string;
85
+ });
86
+ }
87
+ /**
88
+ * Decoded payment guarantee claims, as returned by `decodeGuaranteeClaims`.
89
+ * `version` is `1` for V1 certificates and `2` for V2 certificates.
90
+ * V2 certificates additionally carry a `validationPolicy`.
91
+ */
92
+ interface PaymentGuaranteeClaims {
93
+ domain: Uint8Array;
94
+ userAddress: string;
95
+ recipientAddress: string;
96
+ cycleId: bigint;
97
+ reqId: bigint;
98
+ amount: bigint;
99
+ assetAddress: string;
100
+ timestamp: number;
101
+ version: number;
102
+ validationPolicy?: PaymentGuaranteeValidationPolicyV2;
103
+ }
104
+ /**
105
+ * BLS guarantee certificate returned by `issuePaymentGuarantee`.
106
+ * Both fields are `0x`-prefixed hex strings.
107
+ */
108
+ interface BLSCert {
109
+ /** ABI-encoded `(uint64 version, bytes innerClaims)` envelope as a hex string. */
110
+ claims: string;
111
+ /** BLS12-381 G2 signature as a hex string. */
112
+ signature: string;
113
+ }
114
+ /** On-chain collateral position for a single asset, returned by `getUser`. */
115
+ interface UserInfo {
116
+ /** Asset address (`0x000...` for ETH). */
117
+ asset: string;
118
+ /** Total deposited collateral available for payments (in token base units). */
119
+ collateral: bigint;
120
+ /** Amount of a pending withdrawal request (0 if none). */
121
+ withdrawalRequestAmount: bigint;
122
+ /** Unix timestamp when the withdrawal request was made (0 if none). */
123
+ withdrawalRequestTimestamp: number;
124
+ }
125
+ declare class UserSuspensionStatus {
126
+ userAddress: string;
127
+ suspended: boolean;
128
+ updatedAt: number;
129
+ constructor(userAddress: string, suspended: boolean, updatedAt: number);
130
+ static fromRpc(raw: Record<string, unknown>): UserSuspensionStatus;
131
+ }
132
+ declare class AdminApiKeyInfo {
133
+ id: string;
134
+ name: string;
135
+ scopes: string[];
136
+ createdAt: number;
137
+ revokedAt?: number | null | undefined;
138
+ constructor(id: string, name: string, scopes: string[], createdAt: number, revokedAt?: number | null | undefined);
139
+ static fromRpc(raw: Record<string, unknown>): AdminApiKeyInfo;
140
+ }
141
+ declare class AdminApiKeySecret {
142
+ id: string;
143
+ name: string;
144
+ scopes: string[];
145
+ createdAt: number;
146
+ apiKey: string;
147
+ constructor(id: string, name: string, scopes: string[], createdAt: number, apiKey: string);
148
+ static fromRpc(raw: Record<string, unknown>): AdminApiKeySecret;
149
+ }
150
+ /**
151
+ * Off-chain clearing settlement action a participant performs against the
152
+ * ClearingHouse contract for a given cycle.
153
+ */
154
+ type ClearingSettlementActionKind = "pay_net_debit" | "claim_net_credit" | "mark_defaulted";
155
+ /** Role a participant holds in a settlement cycle. */
156
+ type ClearingParticipantRole = "NET_CREDITOR" | "NET_DEBTOR" | "BALANCED" | string;
157
+ /**
158
+ * A participant's committed position in a settlement cycle, with the Merkle
159
+ * proof needed to settle on-chain. Returned by `getClearingParticipantProof`.
160
+ */
161
+ declare class ClearingParticipantProof {
162
+ /** On-chain `bytes32` cycle identifier. */
163
+ cycleId: string;
164
+ /** Core database cycle identifier. */
165
+ cycleIdText: string;
166
+ assetAddress: string;
167
+ participant: string;
168
+ role: ClearingParticipantRole;
169
+ /** Amount used with the participant's role-specific ClearingHouse call. */
170
+ amount: bigint;
171
+ netDebit: bigint;
172
+ netCredit: bigint;
173
+ leaf: string;
174
+ merkleRoot: string;
175
+ proof: string[];
176
+ constructor(
177
+ /** On-chain `bytes32` cycle identifier. */
178
+ cycleId: string,
179
+ /** Core database cycle identifier. */
180
+ cycleIdText: string, assetAddress: string, participant: string, role: ClearingParticipantRole,
181
+ /** Amount used with the participant's role-specific ClearingHouse call. */
182
+ amount: bigint, netDebit: bigint, netCredit: bigint, leaf: string, merkleRoot: string, proof: string[]);
183
+ static fromRpc(raw: Record<string, unknown>): ClearingParticipantProof;
184
+ }
185
+ /**
186
+ * A prepared ClearingHouse contract call for a participant, including the amount
187
+ * and Merkle proof. Returned by `getClearingSettlementAction` and its helpers.
188
+ */
189
+ declare class ClearingSettlementActionResponse {
190
+ /** ClearingHouse contract address. */
191
+ contractAddress: string;
192
+ /** Contract function to call (`payNetDebit`, `claimNetCredit`, `markDefaulted`). */
193
+ functionName: string;
194
+ action: ClearingSettlementActionKind;
195
+ /** On-chain `bytes32` cycle identifier. */
196
+ cycleId: string;
197
+ /** Core database cycle identifier. */
198
+ cycleIdText: string;
199
+ assetAddress: string;
200
+ /** Participant whose committed Merkle leaf is proven. */
201
+ participant: string;
202
+ /** Alias for `participant` when `action = mark_defaulted`. */
203
+ debtor: string | null;
204
+ /** Amount argument for the selected ClearingHouse function. */
205
+ amount: bigint;
206
+ /** Native value to attach — non-zero only for native-asset debtor payments. */
207
+ payableValue: bigint;
208
+ proof: string[];
209
+ constructor(
210
+ /** ClearingHouse contract address. */
211
+ contractAddress: string,
212
+ /** Contract function to call (`payNetDebit`, `claimNetCredit`, `markDefaulted`). */
213
+ functionName: string, action: ClearingSettlementActionKind,
214
+ /** On-chain `bytes32` cycle identifier. */
215
+ cycleId: string,
216
+ /** Core database cycle identifier. */
217
+ cycleIdText: string, assetAddress: string,
218
+ /** Participant whose committed Merkle leaf is proven. */
219
+ participant: string,
220
+ /** Alias for `participant` when `action = mark_defaulted`. */
221
+ debtor: string | null,
222
+ /** Amount argument for the selected ClearingHouse function. */
223
+ amount: bigint,
224
+ /** Native value to attach — non-zero only for native-asset debtor payments. */
225
+ payableValue: bigint, proof: string[]);
226
+ static fromRpc(raw: Record<string, unknown>): ClearingSettlementActionResponse;
227
+ }
228
+ declare class AssetBalanceInfo {
229
+ userAddress: string;
230
+ assetAddress: string;
231
+ total: bigint;
232
+ locked: bigint;
233
+ version: number;
234
+ updatedAt: number;
235
+ constructor(userAddress: string, assetAddress: string, total: bigint, locked: bigint, version: number, updatedAt: number);
236
+ static fromRpc(raw: Record<string, unknown>): AssetBalanceInfo;
237
+ }
238
+ declare class RecipientPaymentInfo {
239
+ userAddress: string;
240
+ recipientAddress: string;
241
+ txHash: string;
242
+ amount: bigint;
243
+ verified: boolean;
244
+ finalized: boolean;
245
+ failed: boolean;
246
+ createdAt: number;
247
+ constructor(userAddress: string, recipientAddress: string, txHash: string, amount: bigint, verified: boolean, finalized: boolean, failed: boolean, createdAt: number);
248
+ static fromRpc(raw: Record<string, unknown>): RecipientPaymentInfo;
249
+ }
250
+ interface SupportedTokenInfo {
251
+ symbol: string;
252
+ address: string;
253
+ decimals?: number;
254
+ }
255
+ declare class SupportedTokensResponse {
256
+ chainId: number;
257
+ tokens: SupportedTokenInfo[];
258
+ constructor(chainId: number, tokens: SupportedTokenInfo[]);
259
+ static fromRpc(raw: Record<string, unknown>): SupportedTokensResponse;
260
+ }
261
+ declare class CorePublicParameters {
262
+ publicKey: Uint8Array;
263
+ contractAddress: string;
264
+ ethereumHttpRpcUrl: string;
265
+ eip712Name: string;
266
+ eip712Version: string;
267
+ chainId: number;
268
+ maxAcceptedGuaranteeVersion: number;
269
+ acceptedGuaranteeVersions: number[];
270
+ activeGuaranteeDomainSeparator: string;
271
+ /** Allowlist of trusted validation registry addresses configured in core (may be empty). */
272
+ trustedValidationRegistries: string[];
273
+ validationHashCanonicalizationVersion: string;
274
+ constructor(publicKey: Uint8Array, contractAddress: string, ethereumHttpRpcUrl: string, eip712Name: string, eip712Version: string, chainId: number, maxAcceptedGuaranteeVersion?: number, acceptedGuaranteeVersions?: number[], activeGuaranteeDomainSeparator?: string,
275
+ /** Allowlist of trusted validation registry addresses configured in core (may be empty). */
276
+ trustedValidationRegistries?: string[], validationHashCanonicalizationVersion?: string);
277
+ static fromRpc(payload: Record<string, unknown>): CorePublicParameters;
278
+ }
279
+
280
+ interface PaymentPayloadClaimsBase {
281
+ user_address: string;
282
+ recipient_address: string;
283
+ req_id: string;
284
+ amount: string;
285
+ timestamp: number;
286
+ asset_address: string;
287
+ }
288
+ /** Wire-format representation of V1 payment guarantee claims sent to the core RPC. */
289
+ interface PaymentPayloadClaims extends PaymentPayloadClaimsBase {
290
+ version: "v1";
291
+ }
292
+ /** Wire-format representation of V2 payment guarantee claims sent to the core RPC. */
293
+ interface PaymentPayloadClaimsV2 extends PaymentPayloadClaimsBase {
294
+ version: "v2";
295
+ validation_registry_address: string;
296
+ validation_request_hash: string;
297
+ validation_chain_id: number;
298
+ validator_address: string;
299
+ validator_agent_id: string;
300
+ min_validation_score: number;
301
+ validation_subject_hash: string;
302
+ job_hash: string;
303
+ required_validation_tag: string;
304
+ }
305
+ /** Assembled payment payload ready to be submitted to the core RPC `issueGuarantee` endpoint. */
306
+ interface PaymentPayload {
307
+ claims: PaymentPayloadClaims | PaymentPayloadClaimsV2;
308
+ /** 65-byte ECDSA signature as a `0x`-prefixed hex string. */
309
+ signature: string;
310
+ scheme: SigningScheme;
311
+ }
312
+
313
+ interface PaymentRequirementsV1 {
314
+ scheme: string;
315
+ network: string;
316
+ maxAmountRequired: string;
317
+ payTo: string;
318
+ asset: string;
319
+ resource?: string;
320
+ description?: string;
321
+ mimeType?: string;
322
+ outputSchema?: unknown;
323
+ maxTimeoutSeconds?: number;
324
+ extra?: PaymentRequirementsExtra;
325
+ }
326
+ interface PaymentRequirementsV2 {
327
+ scheme: string;
328
+ network: string;
329
+ asset: string;
330
+ amount: string;
331
+ payTo: string;
332
+ maxTimeoutSeconds?: number;
333
+ extra?: PaymentRequirementsExtra;
334
+ }
335
+ type PaymentRequirements = PaymentRequirementsV2;
336
+ interface PaymentRequirementsExtra {
337
+ tabEndpoint?: string;
338
+ validationRegistryAddress?: string;
339
+ validationChainId?: number;
340
+ validatorAddress?: string;
341
+ validatorAgentId?: string;
342
+ minValidationScore?: number;
343
+ jobHash?: string;
344
+ requiredValidationTag?: string;
345
+ }
346
+ interface TabResponse {
347
+ userAddress: string;
348
+ nextReqId?: string;
349
+ }
350
+ type X402PaymentPayloadClaims = PaymentPayload["claims"];
351
+ type X402PaymentPayload = PaymentPayload;
352
+ interface X402PaymentEnvelopeV1 {
353
+ x402Version: number;
354
+ scheme: string;
355
+ network: string;
356
+ payload: X402PaymentPayload;
357
+ }
358
+ interface X402ResourceInfo {
359
+ url: string;
360
+ description: string;
361
+ mimeType: string;
362
+ }
363
+ interface X402PaymentEnvelopeV2 {
364
+ x402Version: number;
365
+ accepted: PaymentRequirementsV2;
366
+ payload: X402PaymentPayload;
367
+ resource: X402ResourceInfo;
368
+ }
369
+ interface X402SignedPayment {
370
+ header: string;
371
+ payload: X402PaymentPayload;
372
+ signature: PaymentSignature;
373
+ }
374
+ interface X402SettledPayment {
375
+ payment: X402SignedPayment;
376
+ settlement: unknown;
377
+ }
378
+ interface X402PaymentRequired {
379
+ x402Version: number;
380
+ error?: string;
381
+ resource: X402ResourceInfo;
382
+ accepts: PaymentRequirementsV2[];
383
+ extensions?: Record<string, unknown>;
384
+ }
385
+
386
+ export { AdminApiKeySecret as A, type BLSCert as B, CorePublicParameters as C, type X402PaymentPayloadClaims as D, PaymentGuaranteeRequestClaims as P, RecipientPaymentInfo as R, SupportedTokensResponse as S, type TabResponse as T, UserSuspensionStatus as U, type X402SignedPayment as X, type ClearingSettlementActionKind as a, AdminApiKeyInfo as b, PaymentGuaranteeRequestClaimsV2 as c, SigningScheme as d, type PaymentGuaranteeClaims as e, ClearingParticipantProof as f, ClearingSettlementActionResponse as g, AssetBalanceInfo as h, type UserInfo as i, type PaymentSignature as j, type PaymentPayload as k, type PaymentPayloadClaims as l, type PaymentPayloadClaimsV2 as m, type PaymentRequirementsV1 as n, type X402PaymentRequired as o, type PaymentRequirementsV2 as p, type X402SettledPayment as q, type X402ResourceInfo as r, type ClearingParticipantRole as s, type PaymentGuaranteeValidationPolicyV2 as t, type PaymentRequirements as u, type PaymentRequirementsExtra as v, type SupportedTokenInfo as w, type X402PaymentEnvelopeV1 as x, type X402PaymentEnvelopeV2 as y, type X402PaymentPayload as z };
@@ -0,0 +1,172 @@
1
+ 'use strict';
2
+
3
+ // src/server/base64.ts
4
+ function base64ToBytes(b64) {
5
+ const binary = atob(b64);
6
+ const bytes = new Uint8Array(binary.length);
7
+ for (let i = 0; i < binary.length; i += 1) {
8
+ bytes[i] = binary.charCodeAt(i);
9
+ }
10
+ return bytes;
11
+ }
12
+ function bytesToBase64(bytes) {
13
+ let binary = "";
14
+ for (let i = 0; i < bytes.length; i += 1) {
15
+ binary += String.fromCharCode(bytes[i]);
16
+ }
17
+ return btoa(binary);
18
+ }
19
+ function base64ToUtf8(b64) {
20
+ return new TextDecoder().decode(base64ToBytes(b64));
21
+ }
22
+ function utf8ToBase64(text) {
23
+ return bytesToBase64(new TextEncoder().encode(text));
24
+ }
25
+
26
+ // src/errors/index.ts
27
+ var FourMicaError = class extends Error {
28
+ constructor(message) {
29
+ super(message);
30
+ this.name = this.constructor.name;
31
+ }
32
+ };
33
+ var X402Error = class extends FourMicaError {
34
+ };
35
+
36
+ // src/server/envelope.ts
37
+ function parsePaymentHeader(header) {
38
+ if (!header || typeof header !== "string") {
39
+ throw new X402Error("missing payment header");
40
+ }
41
+ try {
42
+ const decoded = base64ToUtf8(header);
43
+ return JSON.parse(decoded);
44
+ } catch (err) {
45
+ throw new X402Error(`invalid payment header: ${String(err)}`);
46
+ }
47
+ }
48
+
49
+ // src/server/paywall.ts
50
+ var X402_VERSION = 1;
51
+ var DEFAULT_SCHEME = "4mica";
52
+ var PAYMENT_HEADER = "x-payment";
53
+ var PAYMENT_RESPONSE_HEADER = "X-PAYMENT-RESPONSE";
54
+ var JSON_HEADERS = {
55
+ "content-type": "application/json"
56
+ };
57
+ function resolveVerifier(verifier) {
58
+ if ("issueGuarantee" in verifier && typeof verifier.issueGuarantee === "function") {
59
+ return verifier;
60
+ }
61
+ const withRpc = verifier;
62
+ if (withRpc.rpc && typeof withRpc.rpc.issueGuarantee === "function") {
63
+ return withRpc.rpc;
64
+ }
65
+ throw new TypeError(
66
+ "paywall verifier must expose issueGuarantee() or a .rpc that does"
67
+ );
68
+ }
69
+ function buildResource(input, config) {
70
+ return {
71
+ url: config.resource?.url ?? input.url,
72
+ description: config.resource?.description ?? config.description ?? "",
73
+ mimeType: config.resource?.mimeType ?? config.mimeType ?? ""
74
+ };
75
+ }
76
+ function buildRequirements(input, config, error) {
77
+ if (config.buildRequirements) {
78
+ const custom = config.buildRequirements(input);
79
+ return error ? { ...custom, error } : custom;
80
+ }
81
+ const accepts = {
82
+ scheme: config.scheme ?? DEFAULT_SCHEME,
83
+ network: config.network,
84
+ asset: config.asset,
85
+ amount: config.amount,
86
+ payTo: config.payTo,
87
+ maxTimeoutSeconds: config.maxTimeoutSeconds,
88
+ extra: { tabEndpoint: config.tabEndpoint, ...config.extra }
89
+ };
90
+ return {
91
+ x402Version: config.x402Version ?? X402_VERSION,
92
+ ...error ? { error } : {},
93
+ resource: buildResource(input, config),
94
+ accepts: [accepts]
95
+ };
96
+ }
97
+ function requireResponse(input, config, error) {
98
+ return {
99
+ ok: false,
100
+ status: 402,
101
+ headers: { ...JSON_HEADERS },
102
+ body: buildRequirements(input, config, error)
103
+ };
104
+ }
105
+ function createPaywall(verifier, config) {
106
+ const guarantor = resolveVerifier(verifier);
107
+ async function protect(input) {
108
+ const paymentHeader = input.header(PAYMENT_HEADER);
109
+ if (!paymentHeader) {
110
+ return requireResponse(input, config);
111
+ }
112
+ let payload;
113
+ try {
114
+ payload = parsePaymentHeader(paymentHeader).payload;
115
+ } catch (err) {
116
+ return requireResponse(
117
+ input,
118
+ config,
119
+ err instanceof Error ? err.message : String(err)
120
+ );
121
+ }
122
+ try {
123
+ const raw = await guarantor.issueGuarantee(payload);
124
+ const claims = typeof raw.claims === "string" ? raw.claims : "";
125
+ const signature = typeof raw.signature === "string" ? raw.signature : "";
126
+ const guarantee = { claims, signature, raw };
127
+ return {
128
+ ok: true,
129
+ guarantee,
130
+ responseHeaders: {
131
+ [PAYMENT_RESPONSE_HEADER]: utf8ToBase64(
132
+ JSON.stringify({ success: true, guarantee: { claims, signature } })
133
+ )
134
+ }
135
+ };
136
+ } catch (err) {
137
+ return requireResponse(
138
+ input,
139
+ config,
140
+ err instanceof Error ? err.message : String(err)
141
+ );
142
+ }
143
+ }
144
+ async function handle(request) {
145
+ const decision = await protect({
146
+ method: request.method,
147
+ url: request.url,
148
+ header: (name) => request.headers.get(name)
149
+ });
150
+ if (!decision.ok) {
151
+ return new Response(JSON.stringify(decision.body), {
152
+ status: decision.status,
153
+ headers: decision.headers
154
+ });
155
+ }
156
+ return {
157
+ ok: true,
158
+ headers: new Headers(decision.responseHeaders),
159
+ guarantee: decision.guarantee
160
+ };
161
+ }
162
+ return { protect, handle };
163
+ }
164
+
165
+ exports.base64ToBytes = base64ToBytes;
166
+ exports.base64ToUtf8 = base64ToUtf8;
167
+ exports.bytesToBase64 = bytesToBase64;
168
+ exports.createPaywall = createPaywall;
169
+ exports.parsePaymentHeader = parsePaymentHeader;
170
+ exports.utf8ToBase64 = utf8ToBase64;
171
+ //# sourceMappingURL=server.cjs.map
172
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/base64.ts","../src/errors/index.ts","../src/server/envelope.ts","../src/server/paywall.ts"],"names":[],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * Edge-safe base64 helpers.\n *\n * Uses only Web-standard `atob`/`btoa` + `TextEncoder`/`TextDecoder`, which are\n * available on Node (>=16), Bun, Deno, browsers, and edge/worker runtimes — so\n * the server paywall path never depends on Node's `Buffer`.\n */\n\nexport function base64ToBytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += 1) {\n binary += String.fromCharCode(bytes[i] as number);\n }\n return btoa(binary);\n}\n\nexport function base64ToUtf8(b64: string): string {\n return new TextDecoder().decode(base64ToBytes(b64));\n}\n\nexport function utf8ToBase64(text: string): string {\n return bytesToBase64(new TextEncoder().encode(text));\n}\n","/** Base class for all 4Mica SDK errors. Sets `error.name` to the subclass name. */\nexport class FourMicaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n }\n}\n\n/** Thrown when the SDK configuration is invalid (e.g. missing required fields or bad URL). */\nexport class ConfigError extends FourMicaError {}\n\n/** Thrown when a 4Mica core RPC call fails. Includes the HTTP status and raw response body. */\nexport class RpcError extends FourMicaError {\n readonly status?: number;\n readonly body?: unknown;\n\n constructor(message: string, options?: { status?: number; body?: unknown }) {\n super(message);\n this.status = options?.status;\n this.body = options?.body;\n }\n}\n\n/** Thrown when the SDK client fails to initialise (e.g. chain ID mismatch). */\nexport class ClientInitializationError extends FourMicaError {}\n\n/** Thrown when signing a payment claim fails (e.g. unsupported scheme, address mismatch). */\nexport class SigningError extends FourMicaError {}\n\n/** Thrown when an on-chain contract call fails or returns an unexpected result. */\nexport class ContractError extends FourMicaError {}\n\n/** Thrown when BLS certificate verification fails (e.g. domain mismatch, invalid encoding). */\nexport class VerificationError extends FourMicaError {}\n\n/** Thrown when an x402 HTTP payment flow encounters an error. */\nexport class X402Error extends FourMicaError {}\n\n/** Base class for authentication-related errors. */\nexport class AuthError extends FourMicaError {}\n\n/** Thrown when the auth URL is invalid or unreachable. */\nexport class AuthUrlError extends AuthError {}\n\n/** Thrown when a network-level error occurs during authentication. */\nexport class AuthTransportError extends AuthError {}\n\n/** Thrown when the auth server response cannot be decoded. */\nexport class AuthDecodeError extends AuthError {}\n\n/** Thrown when the auth server returns an error response. Includes HTTP status and body. */\nexport class AuthApiError extends AuthError {\n readonly status?: number;\n readonly body?: unknown;\n\n constructor(message: string, options?: { status?: number; body?: unknown }) {\n super(message);\n this.status = options?.status;\n this.body = options?.body;\n }\n}\n\n/** Thrown when auth configuration is invalid. */\nexport class AuthConfigError extends AuthError {}\n\n/** Thrown when an authenticated operation is attempted without auth being configured. */\nexport class AuthMissingConfigError extends AuthConfigError {}\n","import { X402Error } from \"@/errors\";\nimport { base64ToUtf8 } from \"@/server/base64\";\nimport type { X402PaymentEnvelope } from \"@/server/models\";\n\n/**\n * Decode a base64 `X-PAYMENT` header into its x402 payment envelope.\n *\n * Runtime-neutral and edge-safe (no `Buffer`). Shared by the payer-side\n * {@link X402Flow} and the server-side paywall so both agree on the wire format.\n *\n * @throws {@link X402Error} if the header is missing or not valid base64 JSON.\n */\nexport function parsePaymentHeader(header: string): X402PaymentEnvelope {\n if (!header || typeof header !== \"string\") {\n throw new X402Error(\"missing payment header\");\n }\n try {\n const decoded = base64ToUtf8(header);\n return JSON.parse(decoded) as X402PaymentEnvelope;\n } catch (err) {\n throw new X402Error(`invalid payment header: ${String(err)}`);\n }\n}\n","import { utf8ToBase64 } from \"@/server/base64\";\nimport { parsePaymentHeader } from \"@/server/envelope\";\nimport type {\n GuaranteeVerifier,\n Paywall,\n PaywallConfig,\n PaywallDecision,\n PaywallGuarantee,\n PaywallInput,\n PaywallVerifier,\n} from \"@/server/models\";\nimport type {\n PaymentRequirementsV2,\n X402PaymentRequired,\n X402ResourceInfo,\n} from \"@/x402/models\";\n\nconst X402_VERSION = 1;\nconst DEFAULT_SCHEME = \"4mica\";\nconst PAYMENT_HEADER = \"x-payment\";\nconst PAYMENT_RESPONSE_HEADER = \"X-PAYMENT-RESPONSE\";\nconst JSON_HEADERS: Record<string, string> = {\n \"content-type\": \"application/json\",\n};\n\nfunction resolveVerifier(verifier: PaywallVerifier): GuaranteeVerifier {\n if (\n \"issueGuarantee\" in verifier &&\n typeof (verifier as GuaranteeVerifier).issueGuarantee === \"function\"\n ) {\n return verifier as GuaranteeVerifier;\n }\n const withRpc = verifier as { rpc?: GuaranteeVerifier };\n if (withRpc.rpc && typeof withRpc.rpc.issueGuarantee === \"function\") {\n return withRpc.rpc;\n }\n throw new TypeError(\n \"paywall verifier must expose issueGuarantee() or a .rpc that does\",\n );\n}\n\nfunction buildResource(\n input: PaywallInput,\n config: PaywallConfig,\n): X402ResourceInfo {\n return {\n url: config.resource?.url ?? input.url,\n description: config.resource?.description ?? config.description ?? \"\",\n mimeType: config.resource?.mimeType ?? config.mimeType ?? \"\",\n };\n}\n\nfunction buildRequirements(\n input: PaywallInput,\n config: PaywallConfig,\n error?: string,\n): X402PaymentRequired {\n if (config.buildRequirements) {\n const custom = config.buildRequirements(input);\n return error ? { ...custom, error } : custom;\n }\n const accepts: PaymentRequirementsV2 = {\n scheme: config.scheme ?? DEFAULT_SCHEME,\n network: config.network,\n asset: config.asset,\n amount: config.amount,\n payTo: config.payTo,\n maxTimeoutSeconds: config.maxTimeoutSeconds,\n extra: { tabEndpoint: config.tabEndpoint, ...config.extra },\n };\n return {\n x402Version: config.x402Version ?? X402_VERSION,\n ...(error ? { error } : {}),\n resource: buildResource(input, config),\n accepts: [accepts],\n };\n}\n\nfunction requireResponse(\n input: PaywallInput,\n config: PaywallConfig,\n error?: string,\n): Extract<PaywallDecision, { ok: false }> {\n return {\n ok: false,\n status: 402,\n headers: { ...JSON_HEADERS },\n body: buildRequirements(input, config, error),\n };\n}\n\n/**\n * Create a runtime-neutral x402 paywall.\n *\n * The paywall advertises {@link X402PaymentRequired} when no valid `X-PAYMENT`\n * header is present, and otherwise decodes the header and forwards the payment\n * payload to the verifier's `issueGuarantee`. A successful guarantee means the\n * payment is cryptographically covered → allow the request. On-chain settlement\n * (the cycle-clearing `claimNetCredit` flow) is intentionally left as an\n * out-of-band recipient operation.\n *\n * @param verifier - `client.rpc`, the SDK `Client`, or any {@link GuaranteeVerifier}.\n * @param config - Advertised requirements for the protected resource.\n */\nexport function createPaywall(\n verifier: PaywallVerifier,\n config: PaywallConfig,\n): Paywall {\n const guarantor = resolveVerifier(verifier);\n\n async function protect(input: PaywallInput): Promise<PaywallDecision> {\n const paymentHeader = input.header(PAYMENT_HEADER);\n if (!paymentHeader) {\n return requireResponse(input, config);\n }\n\n let payload: unknown;\n try {\n payload = parsePaymentHeader(paymentHeader).payload;\n } catch (err) {\n return requireResponse(\n input,\n config,\n err instanceof Error ? err.message : String(err),\n );\n }\n\n try {\n const raw = await guarantor.issueGuarantee(payload);\n const claims = typeof raw.claims === \"string\" ? raw.claims : \"\";\n const signature = typeof raw.signature === \"string\" ? raw.signature : \"\";\n const guarantee: PaywallGuarantee = { claims, signature, raw };\n return {\n ok: true,\n guarantee,\n responseHeaders: {\n [PAYMENT_RESPONSE_HEADER]: utf8ToBase64(\n JSON.stringify({ success: true, guarantee: { claims, signature } }),\n ),\n },\n };\n } catch (err) {\n return requireResponse(\n input,\n config,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n async function handle(request: Request) {\n const decision = await protect({\n method: request.method,\n url: request.url,\n header: (name) => request.headers.get(name),\n });\n if (!decision.ok) {\n return new Response(JSON.stringify(decision.body), {\n status: decision.status,\n headers: decision.headers,\n });\n }\n return {\n ok: true as const,\n headers: new Headers(decision.responseHeaders),\n guarantee: decision.guarantee,\n };\n }\n\n return { protect, handle };\n}\n"]}