@shielded-x402/client 0.1.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.
- package/dist/circuits/spend_change.json +162 -0
- package/dist/client.d.ts +24 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +155 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto.d.ts +5 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +15 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +22 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +20 -0
- package/dist/indexer.js.map +1 -0
- package/dist/merkle.d.ts +11 -0
- package/dist/merkle.d.ts.map +1 -0
- package/dist/merkle.js +63 -0
- package/dist/merkle.js.map +1 -0
- package/dist/notes.d.ts +19 -0
- package/dist/notes.d.ts.map +1 -0
- package/dist/notes.js +105 -0
- package/dist/notes.js.map +1 -0
- package/dist/proofProvider.d.ts +33 -0
- package/dist/proofProvider.d.ts.map +1 -0
- package/dist/proofProvider.js +177 -0
- package/dist/proofProvider.js.map +1 -0
- package/dist/shieldedFetch.d.ts +29 -0
- package/dist/shieldedFetch.d.ts.map +1 -0
- package/dist/shieldedFetch.js +35 -0
- package/dist/shieldedFetch.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { pad } from 'viem';
|
|
2
|
+
import bundledSpendChangeCircuit from './circuits/spend_change.json';
|
|
3
|
+
const BN254_FIELD_MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617n;
|
|
4
|
+
const toHexWord = (value) => `0x${value.toString(16).padStart(64, '0')}`;
|
|
5
|
+
const normalizeHex = (value) => {
|
|
6
|
+
const trimmed = value.trim().toLowerCase();
|
|
7
|
+
if (!trimmed.startsWith('0x')) {
|
|
8
|
+
return `0x${BigInt(trimmed).toString(16)}`;
|
|
9
|
+
}
|
|
10
|
+
return trimmed;
|
|
11
|
+
};
|
|
12
|
+
const hexToBytes32 = (value) => {
|
|
13
|
+
const hex = value.slice(2).padStart(64, '0');
|
|
14
|
+
const bytes = [];
|
|
15
|
+
for (let i = 0; i < 64; i += 2) {
|
|
16
|
+
bytes.push(Number.parseInt(hex.slice(i, i + 2), 16));
|
|
17
|
+
}
|
|
18
|
+
return bytes;
|
|
19
|
+
};
|
|
20
|
+
const fieldHexToDecimal = (value, label) => {
|
|
21
|
+
const scalar = BigInt(value);
|
|
22
|
+
if (scalar >= BN254_FIELD_MODULUS) {
|
|
23
|
+
throw new Error(`${label} exceeds BN254 field modulus; provide a field-safe value`);
|
|
24
|
+
}
|
|
25
|
+
return scalar.toString(10);
|
|
26
|
+
};
|
|
27
|
+
const normalizePublicInputWord = (value) => {
|
|
28
|
+
if (typeof value === 'string') {
|
|
29
|
+
return toHexWord(BigInt(normalizeHex(value)));
|
|
30
|
+
}
|
|
31
|
+
if (typeof value === 'bigint') {
|
|
32
|
+
return toHexWord(value);
|
|
33
|
+
}
|
|
34
|
+
if (typeof value === 'number') {
|
|
35
|
+
return toHexWord(BigInt(value));
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`unsupported public input value type: ${typeof value}`);
|
|
38
|
+
};
|
|
39
|
+
const collapseExpandedPublicInputs = (publicInputs) => {
|
|
40
|
+
if (publicInputs.length < 161)
|
|
41
|
+
return null;
|
|
42
|
+
const readWord = (start) => {
|
|
43
|
+
const bytes = [];
|
|
44
|
+
for (let i = 0; i < 32; i += 1) {
|
|
45
|
+
const item = publicInputs[start + i];
|
|
46
|
+
if (!item)
|
|
47
|
+
throw new Error('invalid expanded public input');
|
|
48
|
+
const n = BigInt(item);
|
|
49
|
+
if (n < 0n || n > 255n)
|
|
50
|
+
throw new Error('expanded public input byte out of range');
|
|
51
|
+
bytes.push(Number(n));
|
|
52
|
+
}
|
|
53
|
+
return `0x${Buffer.from(bytes).toString('hex')}`;
|
|
54
|
+
};
|
|
55
|
+
return [
|
|
56
|
+
readWord(0),
|
|
57
|
+
readWord(32),
|
|
58
|
+
readWord(64),
|
|
59
|
+
readWord(96),
|
|
60
|
+
readWord(128),
|
|
61
|
+
toHexWord(BigInt(publicInputs[160] ?? '0x0'))
|
|
62
|
+
];
|
|
63
|
+
};
|
|
64
|
+
const normalizePublicInputs = (values) => {
|
|
65
|
+
if (!Array.isArray(values))
|
|
66
|
+
return [];
|
|
67
|
+
const words = values.map((value) => normalizePublicInputWord(value));
|
|
68
|
+
if (words.length === 6)
|
|
69
|
+
return words;
|
|
70
|
+
const collapsed = collapseExpandedPublicInputs(words);
|
|
71
|
+
return collapsed ?? words;
|
|
72
|
+
};
|
|
73
|
+
const normalizeProofHex = (value) => {
|
|
74
|
+
if (typeof value === 'string') {
|
|
75
|
+
return normalizeHex(value);
|
|
76
|
+
}
|
|
77
|
+
if (value instanceof Uint8Array) {
|
|
78
|
+
return `0x${Buffer.from(value).toString('hex')}`;
|
|
79
|
+
}
|
|
80
|
+
if (value && typeof value === 'object' && 'proof' in value) {
|
|
81
|
+
return normalizeProofHex(value.proof);
|
|
82
|
+
}
|
|
83
|
+
throw new Error('unsupported proof value');
|
|
84
|
+
};
|
|
85
|
+
const toNoirInput = (request) => {
|
|
86
|
+
const pathBytes = request.witness.path.map((value) => hexToBytes32(value));
|
|
87
|
+
const merklePath = [...pathBytes];
|
|
88
|
+
while (merklePath.length < 32) {
|
|
89
|
+
merklePath.push(new Array(32).fill(0));
|
|
90
|
+
}
|
|
91
|
+
const indexBits = request.witness.indexBits.slice(0, 32);
|
|
92
|
+
while (indexBits.length < 32) {
|
|
93
|
+
indexBits.push(0);
|
|
94
|
+
}
|
|
95
|
+
const normalizedIndexBits = indexBits.map((bit) => {
|
|
96
|
+
if (bit !== 0 && bit !== 1) {
|
|
97
|
+
throw new Error('merkle witness indexBits must be 0/1');
|
|
98
|
+
}
|
|
99
|
+
return bit;
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
note_amount: request.note.amount.toString(10),
|
|
103
|
+
note_rho: fieldHexToDecimal(request.note.rho, 'note.rho'),
|
|
104
|
+
note_pk_hash: fieldHexToDecimal(request.note.pkHash, 'note.pkHash'),
|
|
105
|
+
nullifier_secret: fieldHexToDecimal(request.nullifierSecret, 'nullifierSecret'),
|
|
106
|
+
merkle_path: merklePath,
|
|
107
|
+
index_bits: normalizedIndexBits,
|
|
108
|
+
merchant_pk_hash: fieldHexToDecimal(request.merchantPubKey, 'merchantPubKey'),
|
|
109
|
+
merchant_rho: fieldHexToDecimal(request.merchantRho, 'merchantRho'),
|
|
110
|
+
change_pk_hash: fieldHexToDecimal(request.changePkHash, 'changePkHash'),
|
|
111
|
+
change_rho: fieldHexToDecimal(request.changeRho, 'changeRho'),
|
|
112
|
+
pay_amount: request.amount.toString(10),
|
|
113
|
+
challenge_nonce: hexToBytes32(request.challengeNonce),
|
|
114
|
+
merchant_address_word: hexToBytes32(pad(request.merchantAddress, { size: 32 }))
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
const equalPublicInputs = (left, right) => {
|
|
118
|
+
if (left.length !== right.length)
|
|
119
|
+
return false;
|
|
120
|
+
for (let i = 0; i < left.length; i += 1) {
|
|
121
|
+
if ((left[i] ?? '').toLowerCase() !== (right[i] ?? '').toLowerCase()) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
};
|
|
127
|
+
export function createNoirJsProofProvider(config) {
|
|
128
|
+
return {
|
|
129
|
+
async generateProof(request) {
|
|
130
|
+
const noirInput = toNoirInput(request);
|
|
131
|
+
const { witness } = await config.noir.execute(noirInput);
|
|
132
|
+
const generated = await config.backend.generateProof(witness);
|
|
133
|
+
const proof = normalizeProofHex(generated.proof);
|
|
134
|
+
const normalized = normalizePublicInputs(generated.publicInputs);
|
|
135
|
+
const useNormalized = normalized.length > 0;
|
|
136
|
+
const finalPublicInputs = useNormalized ? normalized : request.expectedPublicInputs;
|
|
137
|
+
if ((config.enforcePublicInputsMatch ?? true) && !equalPublicInputs(finalPublicInputs, request.expectedPublicInputs)) {
|
|
138
|
+
throw new Error('proof provider public inputs mismatch with SDK-computed values');
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
proof,
|
|
142
|
+
publicInputs: finalPublicInputs
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Convenience factory for Node agent apps:
|
|
149
|
+
* instantiates Noir + UltraHonkBackend from a compiled Noir circuit artifact.
|
|
150
|
+
*/
|
|
151
|
+
export async function createNoirJsProofProviderFromCircuit(circuit, config) {
|
|
152
|
+
const dynamicImport = new Function('m', 'return import(m)');
|
|
153
|
+
const noirPkg = await dynamicImport('@noir-lang/noir_js');
|
|
154
|
+
const bbPkg = await dynamicImport('@aztec/bb.js');
|
|
155
|
+
const Noir = noirPkg.Noir;
|
|
156
|
+
const UltraHonkBackend = bbPkg.UltraHonkBackend;
|
|
157
|
+
const noir = new Noir(circuit);
|
|
158
|
+
const backend = new UltraHonkBackend(circuit.bytecode);
|
|
159
|
+
const providerConfig = {
|
|
160
|
+
noir,
|
|
161
|
+
backend
|
|
162
|
+
};
|
|
163
|
+
if (config?.enforcePublicInputsMatch !== undefined) {
|
|
164
|
+
providerConfig.enforcePublicInputsMatch = config.enforcePublicInputsMatch;
|
|
165
|
+
}
|
|
166
|
+
return createNoirJsProofProvider({
|
|
167
|
+
...providerConfig
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Highest-level convenience for agent apps:
|
|
172
|
+
* loads the bundled spend_change artifact from this package.
|
|
173
|
+
*/
|
|
174
|
+
export async function createNoirJsProofProviderFromDefaultCircuit(config) {
|
|
175
|
+
return createNoirJsProofProviderFromCircuit(bundledSpendChangeCircuit, config);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=proofProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofProvider.js","sourceRoot":"","sources":["../src/proofProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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 ShieldedFetchContext {
|
|
5
|
+
note: ShieldedNote;
|
|
6
|
+
witness: MerkleWitness;
|
|
7
|
+
payerPkHash: Hex;
|
|
8
|
+
}
|
|
9
|
+
export interface ResolveShieldedContextArgs {
|
|
10
|
+
input: string;
|
|
11
|
+
init: RequestInit;
|
|
12
|
+
requirement: PaymentRequirement;
|
|
13
|
+
challengeResponse: Response;
|
|
14
|
+
}
|
|
15
|
+
export interface UnsupportedRailArgs {
|
|
16
|
+
input: string;
|
|
17
|
+
init: RequestInit;
|
|
18
|
+
requirement: PaymentRequirement;
|
|
19
|
+
challengeResponse: Response;
|
|
20
|
+
}
|
|
21
|
+
export interface CreateShieldedFetchConfig {
|
|
22
|
+
sdk: ShieldedClientSDK;
|
|
23
|
+
resolveContext: (args: ResolveShieldedContextArgs) => Promise<ShieldedFetchContext>;
|
|
24
|
+
onUnsupportedRail?: (args: UnsupportedRailArgs) => Promise<Response>;
|
|
25
|
+
fetchImpl?: typeof fetch;
|
|
26
|
+
}
|
|
27
|
+
export type ShieldedFetch = (input: string | URL, init?: RequestInit) => Promise<Response>;
|
|
28
|
+
export declare function createShieldedFetch(config: CreateShieldedFetchConfig): ShieldedFetch;
|
|
29
|
+
//# sourceMappingURL=shieldedFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shieldedFetch.d.ts","sourceRoot":"","sources":["../src/shieldedFetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,GAAG,CAAC;CAClB;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,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,kBAAkB,CAAC;IAChC,iBAAiB,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,iBAAiB,CAAC;IACvB,cAAc,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACpF,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAO3F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,aAAa,CAuCpF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const normalizeInput = (input) => {
|
|
2
|
+
if (typeof input === 'string')
|
|
3
|
+
return input;
|
|
4
|
+
return input.toString();
|
|
5
|
+
};
|
|
6
|
+
export function createShieldedFetch(config) {
|
|
7
|
+
const baseFetch = config.fetchImpl ?? fetch;
|
|
8
|
+
return async (input, init) => {
|
|
9
|
+
const normalizedInput = normalizeInput(input);
|
|
10
|
+
const requestInit = init ?? {};
|
|
11
|
+
const first = await baseFetch(normalizedInput, requestInit);
|
|
12
|
+
if (first.status !== 402)
|
|
13
|
+
return first;
|
|
14
|
+
const parsed = config.sdk.parse402Response(first);
|
|
15
|
+
if (parsed.requirement.rail !== 'shielded-usdc') {
|
|
16
|
+
if (config.onUnsupportedRail) {
|
|
17
|
+
return config.onUnsupportedRail({
|
|
18
|
+
input: normalizedInput,
|
|
19
|
+
init: requestInit,
|
|
20
|
+
requirement: parsed.requirement,
|
|
21
|
+
challengeResponse: first
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return first;
|
|
25
|
+
}
|
|
26
|
+
const context = await config.resolveContext({
|
|
27
|
+
input: normalizedInput,
|
|
28
|
+
init: requestInit,
|
|
29
|
+
requirement: parsed.requirement,
|
|
30
|
+
challengeResponse: first
|
|
31
|
+
});
|
|
32
|
+
return config.sdk.complete402Payment(normalizedInput, requestInit, parsed.requirement, context.note, context.witness, context.payerPkHash, baseFetch);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=shieldedFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shieldedFetch.js","sourceRoot":"","sources":["../src/shieldedFetch.ts"],"names":[],"mappings":"AAiCA,MAAM,cAAc,GAAG,CAAC,KAAmB,EAAU,EAAE;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,MAAiC;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;IAC5C,OAAO,KAAK,EAAE,KAAmB,EAAE,IAAkB,EAAqB,EAAE;QAC1E,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAgB,IAAI,IAAI,EAAE,CAAC;QAE5C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAChD,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,OAAO,MAAM,CAAC,iBAAiB,CAAC;oBAC9B,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,iBAAiB,EAAE,KAAK;iBACzB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;YAC1C,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,iBAAiB,EAAE,KAAK;SACzB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAClC,eAAe,EACf,WAAW,EACX,MAAM,CAAC,WAAW,EAClB,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,WAAW,EACnB,SAAS,CACV,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Hex, PaymentRequirement, ShieldedNote, ShieldedPaymentResponse } from '@shielded-x402/shared-types';
|
|
2
|
+
import type { MerkleWitness } from './merkle.js';
|
|
3
|
+
export interface ProofProviderRequest {
|
|
4
|
+
note: ShieldedNote;
|
|
5
|
+
witness: MerkleWitness;
|
|
6
|
+
nullifierSecret: Hex;
|
|
7
|
+
merchantPubKey: Hex;
|
|
8
|
+
merchantRho: Hex;
|
|
9
|
+
changePkHash: Hex;
|
|
10
|
+
changeRho: Hex;
|
|
11
|
+
amount: bigint;
|
|
12
|
+
challengeNonce: Hex;
|
|
13
|
+
merchantAddress: Hex;
|
|
14
|
+
expectedPublicInputs: Hex[];
|
|
15
|
+
}
|
|
16
|
+
export interface ProofProviderResult {
|
|
17
|
+
proof: Hex;
|
|
18
|
+
publicInputs?: Hex[];
|
|
19
|
+
}
|
|
20
|
+
export interface ProofProvider {
|
|
21
|
+
generateProof: (request: ProofProviderRequest) => Promise<ProofProviderResult>;
|
|
22
|
+
}
|
|
23
|
+
export interface SpendBuildParams {
|
|
24
|
+
note: ShieldedNote;
|
|
25
|
+
witness: MerkleWitness;
|
|
26
|
+
nullifierSecret: Hex;
|
|
27
|
+
merchantPubKey: Hex;
|
|
28
|
+
merchantRho?: Hex;
|
|
29
|
+
merchantAddress: Hex;
|
|
30
|
+
changeRho?: Hex;
|
|
31
|
+
amount: bigint;
|
|
32
|
+
challengeNonce: Hex;
|
|
33
|
+
encryptedReceipt: Hex;
|
|
34
|
+
}
|
|
35
|
+
export interface SpendProofBundle {
|
|
36
|
+
response: ShieldedPaymentResponse;
|
|
37
|
+
changeNote: ShieldedNote;
|
|
38
|
+
merchantRho: Hex;
|
|
39
|
+
}
|
|
40
|
+
export interface ShieldedClientConfig {
|
|
41
|
+
endpoint: string;
|
|
42
|
+
signer: (message: string) => Promise<string>;
|
|
43
|
+
depositFn?: (amount: bigint, commitment: Hex) => Promise<{
|
|
44
|
+
txHash: Hex;
|
|
45
|
+
leafIndex: number;
|
|
46
|
+
}>;
|
|
47
|
+
proofProvider?: ProofProvider;
|
|
48
|
+
}
|
|
49
|
+
export interface Parsed402 {
|
|
50
|
+
requirement: PaymentRequirement;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,kBAAkB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAClH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,GAAG,CAAC;IACrB,cAAc,EAAE,GAAG,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,YAAY,EAAE,GAAG,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,GAAG,CAAC;IACpB,eAAe,EAAE,GAAG,CAAC;IACrB,oBAAoB,EAAE,GAAG,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,GAAG,CAAC;IACX,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,GAAG,CAAC;IACrB,cAAc,EAAE,GAAG,CAAC;IACpB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,eAAe,EAAE,GAAG,CAAC;IACrB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,GAAG,CAAC;IACpB,gBAAgB,EAAE,GAAG,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,uBAAuB,CAAC;IAClC,UAAU,EAAE,YAAY,CAAC;IACzB,WAAW,EAAE,GAAG,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7F,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,kBAAkB,CAAC;CACjC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shielded-x402/client",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"viem": "^2.39.3",
|
|
21
|
+
"@shielded-x402/shared-types": "0.1.1"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@aztec/bb.js": "^2.1.11",
|
|
25
|
+
"@noir-lang/noir_js": ">=1.0.0-beta.18 <2.0.0"
|
|
26
|
+
},
|
|
27
|
+
"peerDependenciesMeta": {
|
|
28
|
+
"@aztec/bb.js": {
|
|
29
|
+
"optional": true
|
|
30
|
+
},
|
|
31
|
+
"@noir-lang/noir_js": {
|
|
32
|
+
"optional": true
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc -p tsconfig.json",
|
|
37
|
+
"pretest": "pnpm --filter @shielded-x402/shared-types build && pnpm run build",
|
|
38
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"lint": "tsc -p tsconfig.json --noEmit"
|
|
41
|
+
}
|
|
42
|
+
}
|