@shielded-x402/client 0.2.4 → 0.4.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/agentPaymentFetch.d.ts +56 -0
- package/dist/agentPaymentFetch.d.ts.map +1 -0
- package/dist/agentPaymentFetch.js +208 -0
- package/dist/agentPaymentFetch.js.map +1 -0
- package/dist/client.d.ts +2 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +8 -25
- package/dist/client.js.map +1 -1
- package/dist/counterpartyPolicy.d.ts +9 -0
- package/dist/counterpartyPolicy.d.ts.map +1 -0
- package/dist/counterpartyPolicy.js +87 -0
- package/dist/counterpartyPolicy.js.map +1 -0
- package/dist/creditChannel.d.ts +28 -0
- package/dist/creditChannel.d.ts.map +1 -0
- package/dist/creditChannel.js +143 -0
- package/dist/creditChannel.js.map +1 -0
- package/dist/creditClose.d.ts +13 -0
- package/dist/creditClose.d.ts.map +1 -0
- package/dist/creditClose.js +21 -0
- package/dist/creditClose.js.map +1 -0
- package/dist/creditFetch.d.ts +18 -0
- package/dist/creditFetch.d.ts.map +1 -0
- package/dist/creditFetch.js +56 -0
- package/dist/creditFetch.js.map +1 -0
- package/dist/creditSignatures.d.ts +18 -0
- package/dist/creditSignatures.d.ts.map +1 -0
- package/dist/creditSignatures.js +18 -0
- package/dist/creditSignatures.js.map +1 -0
- package/dist/crypto.d.ts +1 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +4 -7
- package/dist/crypto.js.map +1 -1
- package/dist/http.d.ts +10 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +27 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/proofProvider.d.ts +1 -1
- package/dist/proofProvider.d.ts.map +1 -1
- package/dist/proofProvider.js +40 -44
- package/dist/proofProvider.js.map +1 -1
- package/dist/requirementAdapters.d.ts +16 -0
- package/dist/requirementAdapters.d.ts.map +1 -0
- package/dist/requirementAdapters.js +277 -0
- package/dist/requirementAdapters.js.map +1 -0
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/walletState.d.ts +20 -4
- package/dist/walletState.d.ts.map +1 -1
- package/dist/walletState.js +282 -191
- package/dist/walletState.js.map +1 -1
- package/package.json +4 -3
- package/dist/relayerFetch.d.ts +0 -43
- package/dist/relayerFetch.d.ts.map +0 -1
- package/dist/relayerFetch.js +0 -313
- package/dist/relayerFetch.js.map +0 -1
- package/dist/shieldedFetch.d.ts +0 -41
- package/dist/shieldedFetch.d.ts.map +0 -1
- package/dist/shieldedFetch.js +0 -91
- package/dist/shieldedFetch.js.map +0 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { RELAYER_ROUTES, canonicalMerchantRequestHash, deriveCreditChannelId, hashCreditState, normalizeRequirement } from '@shielded-x402/shared-types';
|
|
2
|
+
import { recoverCreditStateSigner, signAgentCreditState, signDebitIntent } from './creditSignatures.js';
|
|
3
|
+
import { postJson } from './http.js';
|
|
4
|
+
function assertNonEmpty(value, label) {
|
|
5
|
+
const trimmed = value.trim();
|
|
6
|
+
if (trimmed.length === 0)
|
|
7
|
+
throw new Error(`${label} must not be empty`);
|
|
8
|
+
return trimmed;
|
|
9
|
+
}
|
|
10
|
+
function nowSeconds() {
|
|
11
|
+
return BigInt(Math.floor(Date.now() / 1000));
|
|
12
|
+
}
|
|
13
|
+
function normalizeChannelId(channelId) {
|
|
14
|
+
const normalized = channelId.toLowerCase();
|
|
15
|
+
if (!/^0x[0-9a-f]{64}$/.test(normalized)) {
|
|
16
|
+
throw new Error('channelId must be a bytes32 hex string');
|
|
17
|
+
}
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
export function createCreditChannelClient(config) {
|
|
21
|
+
const fetchImpl = config.fetchImpl ?? fetch;
|
|
22
|
+
const endpoint = config.relayerEndpoint.replace(/\/$/, '');
|
|
23
|
+
const agentAddress = config.agentAddress.toLowerCase();
|
|
24
|
+
let domainCache;
|
|
25
|
+
let resolvedChannelId = config.channelId
|
|
26
|
+
? normalizeChannelId(config.channelId)
|
|
27
|
+
: undefined;
|
|
28
|
+
let payQueue = Promise.resolve();
|
|
29
|
+
const getDomain = async () => {
|
|
30
|
+
if (domainCache)
|
|
31
|
+
return domainCache;
|
|
32
|
+
const parsed = await postJson(fetchImpl, `${endpoint}${RELAYER_ROUTES.creditDomain}`, undefined, { errorPrefix: 'failed to fetch credit domain' });
|
|
33
|
+
domainCache = parsed;
|
|
34
|
+
return parsed;
|
|
35
|
+
};
|
|
36
|
+
const resolveChannelId = async () => {
|
|
37
|
+
if (resolvedChannelId)
|
|
38
|
+
return resolvedChannelId;
|
|
39
|
+
const currentDomain = await getDomain();
|
|
40
|
+
resolvedChannelId = deriveCreditChannelId({
|
|
41
|
+
domain: currentDomain,
|
|
42
|
+
agentAddress
|
|
43
|
+
});
|
|
44
|
+
return resolvedChannelId;
|
|
45
|
+
};
|
|
46
|
+
const getLatestState = () => {
|
|
47
|
+
if (!resolvedChannelId)
|
|
48
|
+
return undefined;
|
|
49
|
+
return config.stateStore?.getCreditState(resolvedChannelId);
|
|
50
|
+
};
|
|
51
|
+
const persistState = async (domain, state, relayerSignature) => {
|
|
52
|
+
const relayerSigner = await recoverCreditStateSigner(domain, state, relayerSignature);
|
|
53
|
+
if (relayerSigner !== domain.relayerAddress.toLowerCase()) {
|
|
54
|
+
throw new Error('relayer signature does not match advertised relayer address');
|
|
55
|
+
}
|
|
56
|
+
const agentSignature = await signAgentCreditState(domain, state, config.signer);
|
|
57
|
+
const signed = {
|
|
58
|
+
state,
|
|
59
|
+
agentSignature,
|
|
60
|
+
relayerSignature
|
|
61
|
+
};
|
|
62
|
+
await config.stateStore?.setCreditState(signed);
|
|
63
|
+
return signed;
|
|
64
|
+
};
|
|
65
|
+
const topup = async (request) => {
|
|
66
|
+
const domain = await getDomain();
|
|
67
|
+
const channelId = await resolveChannelId();
|
|
68
|
+
const latestState = config.stateStore?.getCreditState(channelId);
|
|
69
|
+
const payload = {
|
|
70
|
+
...request,
|
|
71
|
+
channelId
|
|
72
|
+
};
|
|
73
|
+
if (latestState) {
|
|
74
|
+
payload.latestState = latestState;
|
|
75
|
+
}
|
|
76
|
+
const result = await postJson(fetchImpl, `${endpoint}${RELAYER_ROUTES.creditTopup}`, payload, { allowNonOk: true });
|
|
77
|
+
if (result.status === 'DONE') {
|
|
78
|
+
if (!result.nextState || !result.nextStateRelayerSignature) {
|
|
79
|
+
throw new Error('credit topup succeeded without next state signatures');
|
|
80
|
+
}
|
|
81
|
+
await persistState(domain, result.nextState, result.nextStateRelayerSignature);
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
};
|
|
85
|
+
const pay = async (args) => {
|
|
86
|
+
const run = async () => {
|
|
87
|
+
const domain = await getDomain();
|
|
88
|
+
const channelId = await resolveChannelId();
|
|
89
|
+
const latestState = config.stateStore?.getCreditState(channelId);
|
|
90
|
+
if (!latestState) {
|
|
91
|
+
throw new Error('missing latest credit state; top up first');
|
|
92
|
+
}
|
|
93
|
+
const normalizedRequirement = normalizeRequirement(args.requirement);
|
|
94
|
+
const amount = BigInt(normalizedRequirement.amount);
|
|
95
|
+
if (BigInt(latestState.state.available) < amount) {
|
|
96
|
+
throw new Error('insufficient credit balance for request amount');
|
|
97
|
+
}
|
|
98
|
+
const requestId = assertNonEmpty(args.requestId, 'requestId');
|
|
99
|
+
const deadline = nowSeconds() + BigInt(args.deadlineSeconds ?? 120);
|
|
100
|
+
const debitIntent = {
|
|
101
|
+
channelId,
|
|
102
|
+
prevStateHash: hashCreditState(latestState.state),
|
|
103
|
+
nextSeq: (BigInt(latestState.state.seq) + 1n).toString(),
|
|
104
|
+
amount: amount.toString(),
|
|
105
|
+
merchantRequestHash: canonicalMerchantRequestHash({
|
|
106
|
+
merchantRequest: args.merchantRequest,
|
|
107
|
+
requirement: normalizedRequirement
|
|
108
|
+
}),
|
|
109
|
+
deadline: deadline.toString(),
|
|
110
|
+
requestId
|
|
111
|
+
};
|
|
112
|
+
const debitIntentSignature = await signDebitIntent(domain, debitIntent, config.signer);
|
|
113
|
+
const request = {
|
|
114
|
+
requestId,
|
|
115
|
+
merchantRequest: args.merchantRequest,
|
|
116
|
+
requirement: normalizedRequirement,
|
|
117
|
+
latestState,
|
|
118
|
+
debitIntent,
|
|
119
|
+
debitIntentSignature
|
|
120
|
+
};
|
|
121
|
+
const result = await postJson(fetchImpl, `${endpoint}${RELAYER_ROUTES.creditPay}`, request, { allowNonOk: true });
|
|
122
|
+
if (result.status === 'DONE') {
|
|
123
|
+
if (!result.nextState || !result.nextStateRelayerSignature) {
|
|
124
|
+
throw new Error('credit pay succeeded without next state signatures');
|
|
125
|
+
}
|
|
126
|
+
await persistState(domain, result.nextState, result.nextStateRelayerSignature);
|
|
127
|
+
}
|
|
128
|
+
return result;
|
|
129
|
+
};
|
|
130
|
+
const resultPromise = payQueue.then(run, run);
|
|
131
|
+
// Sequential queue: enforce one in-flight pay per channel state.
|
|
132
|
+
payQueue = resultPromise.then(() => undefined, () => undefined);
|
|
133
|
+
return resultPromise;
|
|
134
|
+
};
|
|
135
|
+
return {
|
|
136
|
+
getDomain,
|
|
137
|
+
getChannelId: resolveChannelId,
|
|
138
|
+
getLatestState,
|
|
139
|
+
topup,
|
|
140
|
+
pay
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=creditChannel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creditChannel.js","sourceRoot":"","sources":["../src/creditChannel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type CreditChannelStatus, type Hex, type RelayerCreditCloseChallengeResponse, type RelayerCreditCloseFinalizeResponse, type RelayerCreditCloseStartResponse, type SignedCreditState } from '@shielded-x402/shared-types';
|
|
2
|
+
export interface CreditCloseClientConfig {
|
|
3
|
+
relayerEndpoint: string;
|
|
4
|
+
fetchImpl?: typeof fetch;
|
|
5
|
+
}
|
|
6
|
+
export interface CreditCloseClient {
|
|
7
|
+
startClose: (latestState: SignedCreditState) => Promise<RelayerCreditCloseStartResponse>;
|
|
8
|
+
challengeClose: (higherState: SignedCreditState) => Promise<RelayerCreditCloseChallengeResponse>;
|
|
9
|
+
finalizeClose: (channelId: Hex) => Promise<RelayerCreditCloseFinalizeResponse>;
|
|
10
|
+
getCloseStatus: (channelId: Hex) => Promise<CreditChannelStatus>;
|
|
11
|
+
}
|
|
12
|
+
export declare function createCreditCloseClient(config: CreditCloseClientConfig): CreditCloseClient;
|
|
13
|
+
//# sourceMappingURL=creditClose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creditClose.d.ts","sourceRoot":"","sources":["../src/creditClose.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,GAAG,EACR,KAAK,mCAAmC,EACxC,KAAK,kCAAkC,EACvC,KAAK,+BAA+B,EACpC,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AAGrC,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,CAAC,WAAW,EAAE,iBAAiB,KAAK,OAAO,CAAC,+BAA+B,CAAC,CAAC;IACzF,cAAc,EAAE,CAAC,WAAW,EAAE,iBAAiB,KAAK,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACjG,aAAa,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC/E,cAAc,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAClE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,iBAAiB,CAqC1F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RELAYER_ROUTES } from '@shielded-x402/shared-types';
|
|
2
|
+
import { postJson, requestJson } from './http.js';
|
|
3
|
+
export function createCreditCloseClient(config) {
|
|
4
|
+
const fetchImpl = config.fetchImpl ?? fetch;
|
|
5
|
+
const endpoint = config.relayerEndpoint.replace(/\/$/, '');
|
|
6
|
+
return {
|
|
7
|
+
startClose: async (latestState) => {
|
|
8
|
+
return postJson(fetchImpl, `${endpoint}${RELAYER_ROUTES.creditCloseStart}`, { latestState }, { allowNonOk: true });
|
|
9
|
+
},
|
|
10
|
+
challengeClose: async (higherState) => {
|
|
11
|
+
return postJson(fetchImpl, `${endpoint}${RELAYER_ROUTES.creditCloseChallenge}`, { higherState }, { allowNonOk: true });
|
|
12
|
+
},
|
|
13
|
+
finalizeClose: async (channelId) => {
|
|
14
|
+
return postJson(fetchImpl, `${endpoint}${RELAYER_ROUTES.creditCloseFinalize}`, { channelId }, { allowNonOk: true });
|
|
15
|
+
},
|
|
16
|
+
getCloseStatus: async (channelId) => {
|
|
17
|
+
return requestJson(fetchImpl, `${endpoint}${RELAYER_ROUTES.creditCloseStatusPrefix}/${channelId}`, { method: 'GET', errorPrefix: 'failed to fetch close status' });
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=creditClose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creditClose.js","sourceRoot":"","sources":["../src/creditClose.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAOf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAclD,MAAM,UAAU,uBAAuB,CAAC,MAA+B;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE3D,OAAO;QACL,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YAChC,OAAO,QAAQ,CACb,SAAS,EACT,GAAG,QAAQ,GAAG,cAAc,CAAC,gBAAgB,EAAE,EAC/C,EAAE,WAAW,EAAE,EACf,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;QACJ,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YACpC,OAAO,QAAQ,CACb,SAAS,EACT,GAAG,QAAQ,GAAG,cAAc,CAAC,oBAAoB,EAAE,EACnD,EAAE,WAAW,EAAE,EACf,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;QACJ,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YACjC,OAAO,QAAQ,CACb,SAAS,EACT,GAAG,QAAQ,GAAG,cAAc,CAAC,mBAAmB,EAAE,EAClD,EAAE,SAAS,EAAE,EACb,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;QACJ,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAClC,OAAO,WAAW,CAChB,SAAS,EACT,GAAG,QAAQ,GAAG,cAAc,CAAC,uBAAuB,IAAI,SAAS,EAAE,EACnE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAC/D,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CreditPayArgs } from './creditChannel.js';
|
|
2
|
+
export interface CreditPayClient {
|
|
3
|
+
pay: (args: CreditPayArgs) => Promise<{
|
|
4
|
+
status: 'DONE' | 'FAILED';
|
|
5
|
+
merchantResult?: {
|
|
6
|
+
status: number;
|
|
7
|
+
headers: Record<string, string>;
|
|
8
|
+
bodyBase64: string;
|
|
9
|
+
};
|
|
10
|
+
failureReason?: string;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
export interface CreateCreditFetchConfig {
|
|
14
|
+
creditClient: CreditPayClient;
|
|
15
|
+
fetchImpl?: typeof fetch;
|
|
16
|
+
}
|
|
17
|
+
export declare function createCreditShieldedFetch(config: CreateCreditFetchConfig): (input: string | URL, init?: RequestInit) => Promise<Response>;
|
|
18
|
+
//# sourceMappingURL=creditFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creditFetch.d.ts","sourceRoot":"","sources":["../src/creditFetch.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC;QACpC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;QAC1B,cAAc,CAAC,EAAE;YACf,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChC,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AA4BD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,uBAAuB,IAIzD,OAAO,MAAM,GAAG,GAAG,EAAE,OAAO,WAAW,KAAG,OAAO,CAAC,QAAQ,CAAC,CAmC1E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { headersInitToRecord, normalizeRequestInput } from '@shielded-x402/shared-types';
|
|
2
|
+
import { createGenericX402V2Adapter, parseRequirementFrom402Response } from './requirementAdapters.js';
|
|
3
|
+
async function serializeBody(body) {
|
|
4
|
+
if (body === undefined || body === null)
|
|
5
|
+
return undefined;
|
|
6
|
+
const request = new Request('http://credit.local', {
|
|
7
|
+
method: 'POST',
|
|
8
|
+
body
|
|
9
|
+
});
|
|
10
|
+
const bytes = new Uint8Array(await request.arrayBuffer());
|
|
11
|
+
return Buffer.from(bytes).toString('base64');
|
|
12
|
+
}
|
|
13
|
+
function toResponse(merchantResult) {
|
|
14
|
+
return new Response(Buffer.from(merchantResult.bodyBase64, 'base64'), {
|
|
15
|
+
status: merchantResult.status,
|
|
16
|
+
headers: merchantResult.headers
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function buildRequestId(requirement, url) {
|
|
20
|
+
const now = Date.now().toString(16);
|
|
21
|
+
return `credit-${now}-${requirement.challengeNonce.slice(2, 10)}-${Buffer.from(url).toString('hex').slice(0, 8)}`;
|
|
22
|
+
}
|
|
23
|
+
export function createCreditShieldedFetch(config) {
|
|
24
|
+
const fetchImpl = config.fetchImpl ?? fetch;
|
|
25
|
+
const requirementAdapters = [createGenericX402V2Adapter()];
|
|
26
|
+
return async (input, init) => {
|
|
27
|
+
const normalizedInput = normalizeRequestInput(input);
|
|
28
|
+
const requestInit = init ?? {};
|
|
29
|
+
const first = await fetchImpl(normalizedInput, requestInit);
|
|
30
|
+
if (first.status !== 402)
|
|
31
|
+
return first;
|
|
32
|
+
const { requirement } = await parseRequirementFrom402Response(first, { requestUrl: normalizedInput }, requirementAdapters);
|
|
33
|
+
const method = (requestInit.method ?? 'GET').toUpperCase();
|
|
34
|
+
const bodyBase64 = method !== 'GET' && method !== 'HEAD'
|
|
35
|
+
? await serializeBody(requestInit.body ?? null)
|
|
36
|
+
: undefined;
|
|
37
|
+
const merchantRequest = {
|
|
38
|
+
url: normalizedInput,
|
|
39
|
+
method,
|
|
40
|
+
headers: headersInitToRecord(requestInit.headers)
|
|
41
|
+
};
|
|
42
|
+
if (bodyBase64 !== undefined) {
|
|
43
|
+
merchantRequest.bodyBase64 = bodyBase64;
|
|
44
|
+
}
|
|
45
|
+
const creditResult = await config.creditClient.pay({
|
|
46
|
+
requestId: buildRequestId(requirement, normalizedInput),
|
|
47
|
+
merchantRequest,
|
|
48
|
+
requirement
|
|
49
|
+
});
|
|
50
|
+
if (creditResult.status !== 'DONE' || !creditResult.merchantResult) {
|
|
51
|
+
throw new Error(creditResult.failureReason ?? 'credit pay failed');
|
|
52
|
+
}
|
|
53
|
+
return toResponse(creditResult.merchantResult);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=creditFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creditFetch.js","sourceRoot":"","sources":["../src/creditFetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CREDIT_EIP712_TYPES, buildCreditDebitIntentTypedDataPayload, buildCreditStateTypedDataPayload, type CreditDebitIntent, type CreditDomainResponse, type CreditState, type Hex } from '@shielded-x402/shared-types';
|
|
2
|
+
export interface CreditTypedDataSigner {
|
|
3
|
+
signTypedData: (args: {
|
|
4
|
+
domain: {
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
chainId: number;
|
|
8
|
+
verifyingContract: Hex;
|
|
9
|
+
};
|
|
10
|
+
types: typeof CREDIT_EIP712_TYPES;
|
|
11
|
+
primaryType: 'CreditState' | 'CreditDebitIntent';
|
|
12
|
+
message: ReturnType<typeof buildCreditStateTypedDataPayload>['message'] | ReturnType<typeof buildCreditDebitIntentTypedDataPayload>['message'];
|
|
13
|
+
}) => Promise<Hex>;
|
|
14
|
+
}
|
|
15
|
+
export declare function signAgentCreditState(domain: CreditDomainResponse, state: CreditState, signer: CreditTypedDataSigner): Promise<Hex>;
|
|
16
|
+
export declare function signDebitIntent(domain: CreditDomainResponse, intent: CreditDebitIntent, signer: CreditTypedDataSigner): Promise<Hex>;
|
|
17
|
+
export declare function recoverCreditStateSigner(domain: CreditDomainResponse, state: CreditState, signature: Hex): Promise<Hex>;
|
|
18
|
+
//# sourceMappingURL=creditSignatures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creditSignatures.d.ts","sourceRoot":"","sources":["../src/creditSignatures.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,sCAAsC,EACtC,gCAAgC,EAChC,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,GAAG,EACT,MAAM,6BAA6B,CAAC;AAGrC,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,CAAC,IAAI,EAAE;QACpB,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,iBAAiB,EAAE,GAAG,CAAC;SACxB,CAAC;QACF,KAAK,EAAE,OAAO,mBAAmB,CAAC;QAClC,WAAW,EAAE,aAAa,GAAG,mBAAmB,CAAC;QACjD,OAAO,EACH,UAAU,CAAC,OAAO,gCAAgC,CAAC,CAAC,SAAS,CAAC,GAC9D,UAAU,CAAC,OAAO,sCAAsC,CAAC,CAAC,SAAS,CAAC,CAAC;KAC1E,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACpB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,GAAG,CAAC,CAGd;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,GAAG,CAAC,CAKd;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,GAAG,GACb,OAAO,CAAC,GAAG,CAAC,CAMd"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { buildCreditDebitIntentTypedDataPayload, buildCreditStateTypedDataPayload } from '@shielded-x402/shared-types';
|
|
2
|
+
import { recoverTypedDataAddress } from 'viem';
|
|
3
|
+
export async function signAgentCreditState(domain, state, signer) {
|
|
4
|
+
const signature = await signer.signTypedData(buildCreditStateTypedDataPayload(domain, state));
|
|
5
|
+
return signature.toLowerCase();
|
|
6
|
+
}
|
|
7
|
+
export async function signDebitIntent(domain, intent, signer) {
|
|
8
|
+
const signature = await signer.signTypedData(buildCreditDebitIntentTypedDataPayload(domain, intent));
|
|
9
|
+
return signature.toLowerCase();
|
|
10
|
+
}
|
|
11
|
+
export async function recoverCreditStateSigner(domain, state, signature) {
|
|
12
|
+
const recovered = await recoverTypedDataAddress({
|
|
13
|
+
...buildCreditStateTypedDataPayload(domain, state),
|
|
14
|
+
signature
|
|
15
|
+
});
|
|
16
|
+
return recovered.toLowerCase();
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=creditSignatures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creditSignatures.js","sourceRoot":"","sources":["../src/creditSignatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sCAAsC,EACtC,gCAAgC,EAKjC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,MAAM,CAAC;AAkB/C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA4B,EAC5B,KAAkB,EAClB,MAA6B;IAE7B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,gCAAgC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9F,OAAO,SAAS,CAAC,WAAW,EAAS,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA4B,EAC5B,MAAyB,EACzB,MAA6B;IAE7B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAC1C,sCAAsC,CAAC,MAAM,EAAE,MAAM,CAAC,CACvD,CAAC;IACF,OAAO,SAAS,CAAC,WAAW,EAAS,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAA4B,EAC5B,KAAkB,EAClB,SAAc;IAEd,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC;QAC9C,GAAG,gCAAgC,CAAC,MAAM,EAAE,KAAK,CAAC;QAClD,SAAS;KACV,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,WAAW,EAAS,CAAC;AACxC,CAAC"}
|
package/dist/crypto.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Hex } from '
|
|
1
|
+
import { type Hex } from '@shielded-x402/shared-types';
|
|
2
2
|
export declare function deriveCommitment(amount: bigint, rho: Hex, pkHash: Hex): Hex;
|
|
3
3
|
export declare function deriveNullifier(nullifierSecret: Hex, commitment: Hex): Hex;
|
|
4
4
|
export declare function deriveChallengeHash(challengeNonce: Hex, amount: bigint, merchant: Hex): Hex;
|
package/dist/crypto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,GAAG,EACT,MAAM,6BAA6B,CAAC;AAGrC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAE3E;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,CAE3F"}
|
package/dist/crypto.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { concatHex, keccak256
|
|
1
|
+
import { challengeHashPreimage, toHexWord } from '@shielded-x402/shared-types';
|
|
2
|
+
import { concatHex, keccak256 } from 'viem';
|
|
3
3
|
export function deriveCommitment(amount, rho, pkHash) {
|
|
4
|
-
|
|
5
|
-
return keccak256(concatHex([amountWord, rho, pkHash]));
|
|
4
|
+
return keccak256(concatHex([toHexWord(amount), rho, pkHash]));
|
|
6
5
|
}
|
|
7
6
|
export function deriveNullifier(nullifierSecret, commitment) {
|
|
8
7
|
return keccak256(concatHex([nullifierSecret, commitment]));
|
|
9
8
|
}
|
|
10
9
|
export function deriveChallengeHash(challengeNonce, amount, merchant) {
|
|
11
|
-
|
|
12
|
-
const merchantWord = pad(merchant, { size: 32 });
|
|
13
|
-
return keccak256(concatHex([CRYPTO_SPEC.challengeDomainHash, challengeNonce, amountWord, merchantWord]));
|
|
10
|
+
return keccak256(concatHex(challengeHashPreimage(challengeNonce, amount, merchant)));
|
|
14
11
|
}
|
|
15
12
|
//# sourceMappingURL=crypto.js.map
|
package/dist/crypto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,SAAS,EAEV,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAE5C,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,GAAQ,EAAE,MAAW;IACpE,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAChE,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,OAAO,SAAS,CAAC,SAAS,CAAC,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface JsonRequestOptions {
|
|
2
|
+
method?: 'GET' | 'POST';
|
|
3
|
+
body?: unknown;
|
|
4
|
+
headers?: HeadersInit;
|
|
5
|
+
allowNonOk?: boolean;
|
|
6
|
+
errorPrefix?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function requestJson<T>(fetchImpl: typeof fetch, url: string, options?: JsonRequestOptions): Promise<T>;
|
|
9
|
+
export declare function postJson<T>(fetchImpl: typeof fetch, url: string, body: unknown, options?: Omit<JsonRequestOptions, 'method' | 'body'>): Promise<T>;
|
|
10
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,SAAS,EAAE,OAAO,KAAK,EACvB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,SAAS,EAAE,OAAO,KAAK,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,MAAM,CAAM,GACxD,OAAO,CAAC,CAAC,CAAC,CAUZ"}
|
package/dist/http.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export async function requestJson(fetchImpl, url, options = {}) {
|
|
2
|
+
const init = {
|
|
3
|
+
method: options.method ?? 'GET',
|
|
4
|
+
...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {})
|
|
5
|
+
};
|
|
6
|
+
if (options.headers !== undefined) {
|
|
7
|
+
init.headers = options.headers;
|
|
8
|
+
}
|
|
9
|
+
const response = await fetchImpl(url, init);
|
|
10
|
+
if (!response.ok && !options.allowNonOk) {
|
|
11
|
+
const text = await response.text();
|
|
12
|
+
throw new Error(`${options.errorPrefix ?? 'request failed'}: ${response.status} ${text}`);
|
|
13
|
+
}
|
|
14
|
+
return (await response.json());
|
|
15
|
+
}
|
|
16
|
+
export async function postJson(fetchImpl, url, body, options = {}) {
|
|
17
|
+
return requestJson(fetchImpl, url, {
|
|
18
|
+
...options,
|
|
19
|
+
method: 'POST',
|
|
20
|
+
body,
|
|
21
|
+
headers: {
|
|
22
|
+
'content-type': 'application/json',
|
|
23
|
+
...(options.headers ?? {})
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAuB,EACvB,GAAW,EACX,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAgB;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC;IACF,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,WAAW,IAAI,gBAAgB,KAAK,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,SAAuB,EACvB,GAAW,EACX,IAAa,EACb,UAAuD,EAAE;IAEzD,OAAO,WAAW,CAAI,SAAS,EAAE,GAAG,EAAE;QACpC,GAAG,OAAO;QACV,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
export * from './client.js';
|
|
2
|
+
export * from './agentPaymentFetch.js';
|
|
3
|
+
export * from './creditChannel.js';
|
|
4
|
+
export * from './creditClose.js';
|
|
5
|
+
export * from './creditFetch.js';
|
|
6
|
+
export * from './creditSignatures.js';
|
|
7
|
+
export * from './counterpartyPolicy.js';
|
|
2
8
|
export * from './crypto.js';
|
|
3
9
|
export * from './indexer.js';
|
|
4
10
|
export * from './merkle.js';
|
|
5
11
|
export * from './notes.js';
|
|
6
12
|
export * from './proofProvider.js';
|
|
7
|
-
export * from './
|
|
8
|
-
export * from './shieldedFetch.js';
|
|
13
|
+
export * from './requirementAdapters.js';
|
|
9
14
|
export * from './types.js';
|
|
10
15
|
export * from './walletState.js';
|
|
11
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
export * from './client.js';
|
|
2
|
+
export * from './agentPaymentFetch.js';
|
|
3
|
+
export * from './creditChannel.js';
|
|
4
|
+
export * from './creditClose.js';
|
|
5
|
+
export * from './creditFetch.js';
|
|
6
|
+
export * from './creditSignatures.js';
|
|
7
|
+
export * from './counterpartyPolicy.js';
|
|
2
8
|
export * from './crypto.js';
|
|
3
9
|
export * from './indexer.js';
|
|
4
10
|
export * from './merkle.js';
|
|
5
11
|
export * from './notes.js';
|
|
6
12
|
export * from './proofProvider.js';
|
|
7
|
-
export * from './
|
|
8
|
-
export * from './shieldedFetch.js';
|
|
13
|
+
export * from './requirementAdapters.js';
|
|
9
14
|
export * from './types.js';
|
|
10
15
|
export * from './walletState.js';
|
|
11
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC"}
|
package/dist/proofProvider.d.ts
CHANGED
|
@@ -39,5 +39,5 @@ export declare function createNoirJsProofProviderFromCircuit(circuit: NoirCircui
|
|
|
39
39
|
* Highest-level convenience for agent apps:
|
|
40
40
|
* loads the bundled spend_change artifact from this package.
|
|
41
41
|
*/
|
|
42
|
-
export declare function
|
|
42
|
+
export declare function createProofProvider(config?: NoirJsCircuitProofProviderConfig): Promise<ProofProvider>;
|
|
43
43
|
//# sourceMappingURL=proofProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proofProvider.d.ts","sourceRoot":"","sources":["../src/proofProvider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAA6C,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"proofProvider.d.ts","sourceRoot":"","sources":["../src/proofProvider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAA6C,MAAM,YAAY,CAAC;AAsI3F,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC1F;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC1C,cAAc,CAAC,EACX,KAAK,GACL,WAAW,GACX,gBAAgB,GAChB,sBAAsB,GACtB,aAAa,GACb,mBAAmB,GACnB,UAAU,GACV,gBAAgB,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gCACf,SAAQ,IAAI,CAAC,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3D,mBAAmB,CAAC,EAAE,2BAA2B,CAAC;CACnD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAyED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,yBAAyB,GAAG,aAAa,CAsB1F;AAED;;;GAGG;AACH,wBAAsB,oCAAoC,CACxD,OAAO,EAAE,mBAAmB,EAC5B,MAAM,CAAC,EAAE,gCAAgC,GACxC,OAAO,CAAC,aAAa,CAAC,CAkDxB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,CAAC,EAAE,gCAAgC,GACxC,OAAO,CAAC,aAAa,CAAC,CAGxB"}
|