@keelcodes/settlement 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +316 -0
- package/dist/a2a.d.ts +107 -0
- package/dist/a2a.d.ts.map +1 -0
- package/dist/a2a.js +254 -0
- package/dist/a2a.js.map +1 -0
- package/dist/erc8183.d.ts +108 -0
- package/dist/erc8183.d.ts.map +1 -0
- package/dist/erc8183.js +206 -0
- package/dist/erc8183.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger.d.ts +37 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +114 -0
- package/dist/ledger.js.map +1 -0
- package/dist/mpp.d.ts +78 -0
- package/dist/mpp.d.ts.map +1 -0
- package/dist/mpp.js +129 -0
- package/dist/mpp.js.map +1 -0
- package/dist/rails.d.ts +132 -0
- package/dist/rails.d.ts.map +1 -0
- package/dist/rails.js +147 -0
- package/dist/rails.js.map +1 -0
- package/dist/receipts.d.ts +25 -0
- package/dist/receipts.d.ts.map +1 -0
- package/dist/receipts.js +44 -0
- package/dist/receipts.js.map +1 -0
- package/dist/types.d.ts +100 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/webhooks.d.ts +106 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +162 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/wire.d.ts +31 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +224 -0
- package/dist/wire.js.map +1 -0
- package/dist/x402.d.ts +93 -0
- package/dist/x402.d.ts.map +1 -0
- package/dist/x402.js +196 -0
- package/dist/x402.js.map +1 -0
- package/package.json +52 -0
package/dist/a2a.js
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { SettlementError, assertCaip2, } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* x402 Payments Extension for the Agent-to-Agent (A2A) protocol, v0.1
|
|
4
|
+
* (https://github.com/google-a2a/a2a-x402).
|
|
5
|
+
*
|
|
6
|
+
* A2A carries payment state in the `metadata` of its `Message` objects under
|
|
7
|
+
* `x402.payment.*` keys and layers a six-state payment machine on top of the
|
|
8
|
+
* A2A task state. Keel models the transport-neutral part the extension fixes:
|
|
9
|
+
* the metadata keys, the status machine, the data structures and the error
|
|
10
|
+
* codes. The scheme-specific `PaymentPayload.payload` blob stays opaque.
|
|
11
|
+
*
|
|
12
|
+
* The v0.1 examples spell `network` as a bare name (`"base"`); Keel requires a
|
|
13
|
+
* CAIP-2 id (`eip155:8453`) everywhere it carries a chain, and validates it on
|
|
14
|
+
* the way in.
|
|
15
|
+
*/
|
|
16
|
+
export const A2A_X402_EXTENSION_URI = 'https://github.com/google-a2a/a2a-x402/v0.1';
|
|
17
|
+
/** Clients request extension activation and servers echo it back here. */
|
|
18
|
+
export const A2A_EXTENSIONS_HEADER = 'X-A2A-Extensions';
|
|
19
|
+
/** `Message.metadata` keys defined by the extension. */
|
|
20
|
+
export const A2A_METADATA_KEYS = {
|
|
21
|
+
status: 'x402.payment.status',
|
|
22
|
+
required: 'x402.payment.required',
|
|
23
|
+
payload: 'x402.payment.payload',
|
|
24
|
+
receipts: 'x402.payment.receipts',
|
|
25
|
+
error: 'x402.payment.error',
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Legal status transitions. The spec's diagram omits `payment-submitted →
|
|
29
|
+
* payment-failed`, but §8 requires the server to report `payment-failed` when a
|
|
30
|
+
* submitted payload fails verification, so that edge is allowed too.
|
|
31
|
+
*/
|
|
32
|
+
const A2A_TRANSITIONS = {
|
|
33
|
+
'payment-required': ['payment-rejected', 'payment-submitted'],
|
|
34
|
+
'payment-submitted': ['payment-verified', 'payment-failed'],
|
|
35
|
+
'payment-verified': ['payment-completed', 'payment-failed'],
|
|
36
|
+
'payment-rejected': [],
|
|
37
|
+
'payment-completed': [],
|
|
38
|
+
'payment-failed': [],
|
|
39
|
+
};
|
|
40
|
+
export function isTerminalA2AStatus(status) {
|
|
41
|
+
return A2A_TRANSITIONS[status].length === 0;
|
|
42
|
+
}
|
|
43
|
+
export function canTransitionA2A(from, to) {
|
|
44
|
+
return A2A_TRANSITIONS[from].includes(to);
|
|
45
|
+
}
|
|
46
|
+
/** Guards a status change — an out-of-order status write is a protocol bug. */
|
|
47
|
+
export function assertA2ATransition(from, to) {
|
|
48
|
+
if (!canTransitionA2A(from, to)) {
|
|
49
|
+
throw new SettlementError('invalid-transition', `A2A payment cannot go ${from} -> ${to}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Error codes the extension defines for `x402.payment.error`. */
|
|
53
|
+
export const A2A_ERROR_CODES = [
|
|
54
|
+
'INSUFFICIENT_FUNDS',
|
|
55
|
+
'INVALID_SIGNATURE',
|
|
56
|
+
'EXPIRED_PAYMENT',
|
|
57
|
+
'DUPLICATE_NONCE',
|
|
58
|
+
'NETWORK_MISMATCH',
|
|
59
|
+
'INVALID_AMOUNT',
|
|
60
|
+
'SETTLEMENT_FAILED',
|
|
61
|
+
];
|
|
62
|
+
export function isA2AErrorCode(value) {
|
|
63
|
+
return A2A_ERROR_CODES.includes(value);
|
|
64
|
+
}
|
|
65
|
+
const STATUS_VALUES = new Set(Object.keys(A2A_TRANSITIONS));
|
|
66
|
+
function requireObject(value, field) {
|
|
67
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
68
|
+
throw new SettlementError('malformed-payload', `${field} must be an object`);
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
function requireString(value, field) {
|
|
73
|
+
if (typeof value !== 'string' || value === '') {
|
|
74
|
+
throw new SettlementError('missing-field', `${field} must be a non-empty string`);
|
|
75
|
+
}
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
function requireInteger(value, field) {
|
|
79
|
+
if (typeof value !== 'number' || !Number.isInteger(value)) {
|
|
80
|
+
throw new SettlementError('missing-field', `${field} must be an integer`);
|
|
81
|
+
}
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
function assertA2ARequirement(value, index) {
|
|
85
|
+
const raw = requireObject(value, `accepts[${index}]`);
|
|
86
|
+
const amount = requireString(raw['maxAmountRequired'], `accepts[${index}].maxAmountRequired`);
|
|
87
|
+
if (!/^\d+$/.test(amount)) {
|
|
88
|
+
throw new SettlementError('malformed-payload', `accepts[${index}].maxAmountRequired must be atomic units, got ${amount}`);
|
|
89
|
+
}
|
|
90
|
+
const requirement = {
|
|
91
|
+
scheme: requireString(raw['scheme'], `accepts[${index}].scheme`),
|
|
92
|
+
network: assertCaip2(raw['network'], `accepts[${index}].network`),
|
|
93
|
+
asset: requireString(raw['asset'], `accepts[${index}].asset`),
|
|
94
|
+
payTo: requireString(raw['payTo'], `accepts[${index}].payTo`),
|
|
95
|
+
maxAmountRequired: amount,
|
|
96
|
+
};
|
|
97
|
+
for (const field of ['resource', 'description']) {
|
|
98
|
+
const fieldValue = raw[field];
|
|
99
|
+
if (fieldValue !== undefined)
|
|
100
|
+
requirement[field] = requireString(fieldValue, `accepts[${index}].${field}`);
|
|
101
|
+
}
|
|
102
|
+
const timeout = raw['maxTimeoutSeconds'];
|
|
103
|
+
if (timeout !== undefined) {
|
|
104
|
+
if (typeof timeout !== 'number' || !Number.isFinite(timeout)) {
|
|
105
|
+
throw new SettlementError('malformed-payload', `accepts[${index}].maxTimeoutSeconds must be a number`);
|
|
106
|
+
}
|
|
107
|
+
requirement.maxTimeoutSeconds = timeout;
|
|
108
|
+
}
|
|
109
|
+
const extra = raw['extra'];
|
|
110
|
+
if (extra !== undefined)
|
|
111
|
+
requirement.extra = requireObject(extra, `accepts[${index}].extra`);
|
|
112
|
+
return requirement;
|
|
113
|
+
}
|
|
114
|
+
/** Parses an `x402PaymentRequiredResponse` (the `x402.payment.required` value). */
|
|
115
|
+
export function parsePaymentRequiredResponse(value) {
|
|
116
|
+
const raw = requireObject(value, 'x402PaymentRequiredResponse');
|
|
117
|
+
const x402Version = requireInteger(raw['x402Version'], 'x402PaymentRequiredResponse.x402Version');
|
|
118
|
+
const accepts = raw['accepts'];
|
|
119
|
+
if (!Array.isArray(accepts) || accepts.length === 0) {
|
|
120
|
+
throw new SettlementError('missing-field', 'x402PaymentRequiredResponse.accepts must be a non-empty array');
|
|
121
|
+
}
|
|
122
|
+
return { x402Version, accepts: accepts.map((entry, index) => assertA2ARequirement(entry, index)) };
|
|
123
|
+
}
|
|
124
|
+
/** Parses a `PaymentPayload` envelope; the scheme payload stays opaque. */
|
|
125
|
+
export function parsePaymentPayload(value) {
|
|
126
|
+
const raw = requireObject(value, 'PaymentPayload');
|
|
127
|
+
return {
|
|
128
|
+
x402Version: requireInteger(raw['x402Version'], 'PaymentPayload.x402Version'),
|
|
129
|
+
network: requireString(raw['network'], 'PaymentPayload.network'),
|
|
130
|
+
scheme: requireString(raw['scheme'], 'PaymentPayload.scheme'),
|
|
131
|
+
payload: requireObject(raw['payload'], 'PaymentPayload.payload'),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** Parses an `x402SettleResponse` receipt. */
|
|
135
|
+
export function parseSettleResponse(value) {
|
|
136
|
+
const raw = requireObject(value, 'x402SettleResponse');
|
|
137
|
+
if (typeof raw['success'] !== 'boolean') {
|
|
138
|
+
throw new SettlementError('missing-field', 'x402SettleResponse.success must be a boolean');
|
|
139
|
+
}
|
|
140
|
+
const response = {
|
|
141
|
+
success: raw['success'],
|
|
142
|
+
network: requireString(raw['network'], 'x402SettleResponse.network'),
|
|
143
|
+
};
|
|
144
|
+
for (const field of ['transaction', 'payer', 'errorReason']) {
|
|
145
|
+
const fieldValue = raw[field];
|
|
146
|
+
if (fieldValue !== undefined) {
|
|
147
|
+
if (typeof fieldValue !== 'string') {
|
|
148
|
+
throw new SettlementError('malformed-payload', `x402SettleResponse.${field} must be a string`);
|
|
149
|
+
}
|
|
150
|
+
response[field] = fieldValue;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return response;
|
|
154
|
+
}
|
|
155
|
+
/** Reads the `x402.payment.*` keys out of a message metadata record. */
|
|
156
|
+
export function parsePaymentMetadata(metadata) {
|
|
157
|
+
const status = metadata[A2A_METADATA_KEYS.status];
|
|
158
|
+
if (status === undefined) {
|
|
159
|
+
throw new SettlementError('missing-field', `${A2A_METADATA_KEYS.status} is required`);
|
|
160
|
+
}
|
|
161
|
+
if (typeof status !== 'string' || !STATUS_VALUES.has(status)) {
|
|
162
|
+
throw new SettlementError('malformed-payload', `unknown A2A payment status ${JSON.stringify(status)}`);
|
|
163
|
+
}
|
|
164
|
+
const parsed = { status: status };
|
|
165
|
+
const required = metadata[A2A_METADATA_KEYS.required];
|
|
166
|
+
if (required !== undefined)
|
|
167
|
+
parsed.required = parsePaymentRequiredResponse(required);
|
|
168
|
+
const payload = metadata[A2A_METADATA_KEYS.payload];
|
|
169
|
+
if (payload !== undefined)
|
|
170
|
+
parsed.payload = parsePaymentPayload(payload);
|
|
171
|
+
const receipts = metadata[A2A_METADATA_KEYS.receipts];
|
|
172
|
+
if (receipts !== undefined) {
|
|
173
|
+
if (!Array.isArray(receipts)) {
|
|
174
|
+
throw new SettlementError('malformed-payload', `${A2A_METADATA_KEYS.receipts} must be an array`);
|
|
175
|
+
}
|
|
176
|
+
parsed.receipts = receipts.map((entry) => parseSettleResponse(entry));
|
|
177
|
+
}
|
|
178
|
+
const error = metadata[A2A_METADATA_KEYS.error];
|
|
179
|
+
if (error !== undefined)
|
|
180
|
+
parsed.error = requireString(error, A2A_METADATA_KEYS.error);
|
|
181
|
+
return parsed;
|
|
182
|
+
}
|
|
183
|
+
/** Serialises the payment fields back into a `Message.metadata` record. */
|
|
184
|
+
export function buildPaymentMetadata(entry) {
|
|
185
|
+
const metadata = { [A2A_METADATA_KEYS.status]: entry.status };
|
|
186
|
+
if (entry.required !== undefined)
|
|
187
|
+
metadata[A2A_METADATA_KEYS.required] = entry.required;
|
|
188
|
+
if (entry.payload !== undefined)
|
|
189
|
+
metadata[A2A_METADATA_KEYS.payload] = entry.payload;
|
|
190
|
+
if (entry.receipts !== undefined)
|
|
191
|
+
metadata[A2A_METADATA_KEYS.receipts] = entry.receipts;
|
|
192
|
+
if (entry.error !== undefined)
|
|
193
|
+
metadata[A2A_METADATA_KEYS.error] = entry.error;
|
|
194
|
+
return metadata;
|
|
195
|
+
}
|
|
196
|
+
/** Builds the client-side intent from the requirement the client accepted. */
|
|
197
|
+
export function a2aIntent(requirement, args) {
|
|
198
|
+
const intent = {
|
|
199
|
+
id: args.id,
|
|
200
|
+
protocol: 'x402',
|
|
201
|
+
network: requirement.network,
|
|
202
|
+
asset: requirement.asset,
|
|
203
|
+
amount: BigInt(requirement.maxAmountRequired),
|
|
204
|
+
payer: args.payer,
|
|
205
|
+
payee: requirement.payTo,
|
|
206
|
+
};
|
|
207
|
+
if (args.reference !== undefined)
|
|
208
|
+
intent.reference = args.reference;
|
|
209
|
+
if (args.now !== undefined && requirement.maxTimeoutSeconds !== undefined) {
|
|
210
|
+
intent.expiresAt = new Date(args.now.getTime() + requirement.maxTimeoutSeconds * 1000).toISOString();
|
|
211
|
+
}
|
|
212
|
+
return intent;
|
|
213
|
+
}
|
|
214
|
+
/** The anti-tamper gate: a merchant may ask for any `payTo` it likes. */
|
|
215
|
+
export function verifyA2ARequirement(requirement, intent) {
|
|
216
|
+
const mismatches = [];
|
|
217
|
+
if (requirement.network !== intent.network) {
|
|
218
|
+
mismatches.push(`network ${requirement.network} != ${intent.network}`);
|
|
219
|
+
}
|
|
220
|
+
if (requirement.asset.toLowerCase() !== intent.asset.toLowerCase()) {
|
|
221
|
+
mismatches.push(`asset ${requirement.asset} != ${intent.asset}`);
|
|
222
|
+
}
|
|
223
|
+
if (requirement.payTo.toLowerCase() !== intent.payee.toLowerCase()) {
|
|
224
|
+
mismatches.push(`payTo ${requirement.payTo} != ${intent.payee}`);
|
|
225
|
+
}
|
|
226
|
+
if (BigInt(requirement.maxAmountRequired) !== intent.amount) {
|
|
227
|
+
mismatches.push(`maxAmountRequired ${requirement.maxAmountRequired} != ${intent.amount.toString()}`);
|
|
228
|
+
}
|
|
229
|
+
if (mismatches.length > 0) {
|
|
230
|
+
throw new SettlementError('requirement-mismatch', `offered requirement does not match intent ${intent.id}: ${mismatches.join('; ')}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/** Turns a successful A2A settle response into a receipt, re-checking terms. */
|
|
234
|
+
export function receiptFromA2A(args) {
|
|
235
|
+
const { intent, requirement, response } = args;
|
|
236
|
+
if (!response.success) {
|
|
237
|
+
throw new SettlementError('unsuccessful-settlement', `A2A settlement failed: ${response.errorReason ?? 'no reason given'}`);
|
|
238
|
+
}
|
|
239
|
+
verifyA2ARequirement(requirement, intent);
|
|
240
|
+
return {
|
|
241
|
+
id: response.transaction ?? `${intent.id}@${args.settledAt}`,
|
|
242
|
+
protocol: 'x402',
|
|
243
|
+
network: intent.network,
|
|
244
|
+
asset: intent.asset,
|
|
245
|
+
amount: intent.amount,
|
|
246
|
+
payer: response.payer ?? intent.payer,
|
|
247
|
+
payee: intent.payee,
|
|
248
|
+
transaction: response.transaction,
|
|
249
|
+
settledAt: args.settledAt,
|
|
250
|
+
intentId: intent.id,
|
|
251
|
+
proof: { requirement, response },
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=a2a.js.map
|
package/dist/a2a.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a.js","sourceRoot":"","sources":["../src/a2a.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type Caip2, type SettlementReceipt } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ERC-8183 (https://eips.ethereum.org/EIPS/eip-8183) — Agentic Commerce: a job
|
|
4
|
+
* with an escrowed budget and a single evaluator who attests completion.
|
|
5
|
+
*
|
|
6
|
+
* State machine: `Open → Funded → Submitted → Completed | Rejected | Expired`,
|
|
7
|
+
* with a dispute detour: `Funded | Submitted → Disputed → Completed | Rejected`.
|
|
8
|
+
* This module models the lifecycle the spec fixes — the legal transitions and
|
|
9
|
+
* *who* may trigger each one — as a pure reducer, so an orchestrator can
|
|
10
|
+
* validate an action (or fold on-chain events) without a chain client.
|
|
11
|
+
*
|
|
12
|
+
* Disputes compose with that machine rather than bypass it: only a party may
|
|
13
|
+
* raise one, only the arbiter may resolve it, and the resolution is an explicit
|
|
14
|
+
* `release` (→ `Completed`) or `refund` (→ `Rejected`). A job in `Disputed` has
|
|
15
|
+
* no path to `complete`/`reject`/`claimRefund`, so arbitration cannot be skipped.
|
|
16
|
+
*
|
|
17
|
+
* The spec's `hook` and `optParams` are deliberately absent: hooks are an
|
|
18
|
+
* optional extension whose callbacks are a chain concern, not core state.
|
|
19
|
+
*/
|
|
20
|
+
export type EscrowJobStatus = 'Open' | 'Funded' | 'Submitted' | 'Disputed' | 'Completed' | 'Rejected' | 'Expired';
|
|
21
|
+
export type EscrowJobAction = 'setProvider' | 'setBudget' | 'fund' | 'submit' | 'complete' | 'reject' | 'raiseDispute' | 'resolveDispute' | 'claimRefund';
|
|
22
|
+
export type EscrowRole = 'client' | 'provider' | 'evaluator' | 'arbiter';
|
|
23
|
+
/** How arbitration settles a disputed escrow. */
|
|
24
|
+
export type EscrowResolution = 'release' | 'refund';
|
|
25
|
+
/** `provider` is unset until `setProvider`; the spec uses `address(0)`. */
|
|
26
|
+
export declare const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
27
|
+
export interface EscrowJob {
|
|
28
|
+
id: string;
|
|
29
|
+
client: string;
|
|
30
|
+
provider: string;
|
|
31
|
+
evaluator: string;
|
|
32
|
+
/** Third party who resolves disputes; unset until configured. */
|
|
33
|
+
arbiter?: string;
|
|
34
|
+
description: string;
|
|
35
|
+
/** Atomic units of the escrowed ERC-20. */
|
|
36
|
+
budget: bigint;
|
|
37
|
+
/** Unix seconds; anyone may refund once `now >= expiredAt`. */
|
|
38
|
+
expiredAt: number;
|
|
39
|
+
status: EscrowJobStatus;
|
|
40
|
+
hook?: string;
|
|
41
|
+
/** `submit` payload — a hash/CID/commitment to the delivered work. */
|
|
42
|
+
deliverable?: string;
|
|
43
|
+
/** Attestation reason carried by `complete` / `reject` / `resolveDispute`. */
|
|
44
|
+
reason?: string;
|
|
45
|
+
/** Why a party raised the dispute; set by `raiseDispute`. */
|
|
46
|
+
disputeReason?: string;
|
|
47
|
+
/** How arbitration settled the job; set by `resolveDispute`. */
|
|
48
|
+
resolution?: EscrowResolution;
|
|
49
|
+
}
|
|
50
|
+
export declare function isTerminalJobStatus(status: EscrowJobStatus): boolean;
|
|
51
|
+
export declare function isProviderSet(job: EscrowJob): boolean;
|
|
52
|
+
export declare function isArbiterSet(job: EscrowJob): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Who may trigger an action given the job's current status. `reject` moves
|
|
55
|
+
* between roles: the client rejects while `Open`, the evaluator afterwards.
|
|
56
|
+
*
|
|
57
|
+
* A dispute may be raised by any party to the job (client, provider or
|
|
58
|
+
* evaluator) but resolved only by the arbiter — that separation is what makes
|
|
59
|
+
* arbitration meaningful rather than a party ruling on its own case.
|
|
60
|
+
*/
|
|
61
|
+
export declare function allowedActors(job: EscrowJob, action: EscrowJobAction): readonly EscrowRole[] | 'anyone';
|
|
62
|
+
export declare function canApplyJobAction(job: EscrowJob, action: EscrowJobAction, actor: string): boolean;
|
|
63
|
+
export interface EscrowActionInput {
|
|
64
|
+
actor: string;
|
|
65
|
+
/** Unix seconds; required for `claimRefund`, which is time-gated. */
|
|
66
|
+
now?: number;
|
|
67
|
+
/** `setProvider`. */
|
|
68
|
+
provider?: string;
|
|
69
|
+
/** `setBudget` — atomic units. */
|
|
70
|
+
amount?: bigint;
|
|
71
|
+
/** `fund` — the budget the client is willing to escrow (front-run guard). */
|
|
72
|
+
expectedBudget?: bigint;
|
|
73
|
+
/** `submit`. */
|
|
74
|
+
deliverable?: string;
|
|
75
|
+
/** `complete` / `reject` / `raiseDispute` / `resolveDispute`. */
|
|
76
|
+
reason?: string;
|
|
77
|
+
/** `resolveDispute` — release the escrow to the provider, or refund the client. */
|
|
78
|
+
outcome?: EscrowResolution;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Applies one action, returning the next job state. Pure: the caller decides
|
|
82
|
+
* whether the job is local state or a projection of on-chain events.
|
|
83
|
+
*/
|
|
84
|
+
export declare function applyJobAction(job: EscrowJob, action: EscrowJobAction, input: EscrowActionInput): EscrowJob;
|
|
85
|
+
/**
|
|
86
|
+
* How escrow moves on a terminal status: released to the provider on
|
|
87
|
+
* `Completed`, refunded to the client on `Rejected` / `Expired`.
|
|
88
|
+
*
|
|
89
|
+
* A dispute resolved to `release` lands on `Completed` and one resolved to
|
|
90
|
+
* `refund` lands on `Rejected`, so the outcome of arbitration is read here just
|
|
91
|
+
* like any other settlement. `Disputed` itself moves nothing — it is not
|
|
92
|
+
* terminal.
|
|
93
|
+
*/
|
|
94
|
+
export declare function escrowOutcome(status: EscrowJobStatus): 'release' | 'refund' | 'none';
|
|
95
|
+
export interface EscrowReceiptArgs {
|
|
96
|
+
network: Caip2;
|
|
97
|
+
asset: string;
|
|
98
|
+
/** ISO-8601 timestamp of settlement. */
|
|
99
|
+
settledAt: string;
|
|
100
|
+
transaction?: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Receipt for a completed job — the escrow released to the provider. A dispute
|
|
104
|
+
* resolved to `release` yields the same receipt; its `proof.resolution` records
|
|
105
|
+
* that the release came via arbitration rather than the evaluator's attestation.
|
|
106
|
+
*/
|
|
107
|
+
export declare function receiptFromEscrow(job: EscrowJob, args: EscrowReceiptArgs): SettlementReceipt;
|
|
108
|
+
//# sourceMappingURL=erc8183.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc8183.d.ts","sourceRoot":"","sources":["../src/erc8183.ts"],"names":[],"mappings":"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"}
|
package/dist/erc8183.js
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { SettlementError } from './types.js';
|
|
2
|
+
/** `provider` is unset until `setProvider`; the spec uses `address(0)`. */
|
|
3
|
+
export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
4
|
+
const TRANSITIONS = {
|
|
5
|
+
Open: ['setProvider', 'setBudget', 'fund', 'reject'],
|
|
6
|
+
Funded: ['submit', 'reject', 'raiseDispute', 'claimRefund'],
|
|
7
|
+
Submitted: ['complete', 'reject', 'raiseDispute', 'claimRefund'],
|
|
8
|
+
Disputed: ['resolveDispute'],
|
|
9
|
+
Completed: [],
|
|
10
|
+
Rejected: [],
|
|
11
|
+
Expired: [],
|
|
12
|
+
};
|
|
13
|
+
const TERMINAL = ['Completed', 'Rejected', 'Expired'];
|
|
14
|
+
export function isTerminalJobStatus(status) {
|
|
15
|
+
return TERMINAL.includes(status);
|
|
16
|
+
}
|
|
17
|
+
export function isProviderSet(job) {
|
|
18
|
+
const provider = job.provider.toLowerCase();
|
|
19
|
+
return provider !== '' && provider !== ZERO_ADDRESS;
|
|
20
|
+
}
|
|
21
|
+
export function isArbiterSet(job) {
|
|
22
|
+
const arbiter = (job.arbiter ?? '').toLowerCase();
|
|
23
|
+
return arbiter !== '' && arbiter !== ZERO_ADDRESS;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Who may trigger an action given the job's current status. `reject` moves
|
|
27
|
+
* between roles: the client rejects while `Open`, the evaluator afterwards.
|
|
28
|
+
*
|
|
29
|
+
* A dispute may be raised by any party to the job (client, provider or
|
|
30
|
+
* evaluator) but resolved only by the arbiter — that separation is what makes
|
|
31
|
+
* arbitration meaningful rather than a party ruling on its own case.
|
|
32
|
+
*/
|
|
33
|
+
export function allowedActors(job, action) {
|
|
34
|
+
switch (action) {
|
|
35
|
+
case 'setProvider':
|
|
36
|
+
return ['client'];
|
|
37
|
+
case 'setBudget':
|
|
38
|
+
return ['client', 'provider'];
|
|
39
|
+
case 'fund':
|
|
40
|
+
return ['client'];
|
|
41
|
+
case 'submit':
|
|
42
|
+
return ['provider'];
|
|
43
|
+
case 'complete':
|
|
44
|
+
return ['evaluator'];
|
|
45
|
+
case 'reject':
|
|
46
|
+
return job.status === 'Open' ? ['client'] : ['evaluator'];
|
|
47
|
+
case 'raiseDispute':
|
|
48
|
+
return ['client', 'provider', 'evaluator'];
|
|
49
|
+
case 'resolveDispute':
|
|
50
|
+
return ['arbiter'];
|
|
51
|
+
case 'claimRefund':
|
|
52
|
+
return 'anyone';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function addressOf(job, role) {
|
|
56
|
+
if (role === 'client')
|
|
57
|
+
return job.client;
|
|
58
|
+
if (role === 'provider')
|
|
59
|
+
return job.provider;
|
|
60
|
+
if (role === 'arbiter')
|
|
61
|
+
return job.arbiter ?? '';
|
|
62
|
+
return job.evaluator;
|
|
63
|
+
}
|
|
64
|
+
function actorAllowed(job, action, actor) {
|
|
65
|
+
const actors = allowedActors(job, action);
|
|
66
|
+
if (actors === 'anyone')
|
|
67
|
+
return true;
|
|
68
|
+
const address = actor.toLowerCase();
|
|
69
|
+
return actors.some((role) => addressOf(job, role).toLowerCase() === address);
|
|
70
|
+
}
|
|
71
|
+
export function canApplyJobAction(job, action, actor) {
|
|
72
|
+
return TRANSITIONS[job.status].includes(action) && actorAllowed(job, action, actor);
|
|
73
|
+
}
|
|
74
|
+
function requireAddress(value, field) {
|
|
75
|
+
if (typeof value !== 'string' || value === '') {
|
|
76
|
+
throw new SettlementError('missing-field', `${field} must be a non-empty address`);
|
|
77
|
+
}
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Applies one action, returning the next job state. Pure: the caller decides
|
|
82
|
+
* whether the job is local state or a projection of on-chain events.
|
|
83
|
+
*/
|
|
84
|
+
export function applyJobAction(job, action, input) {
|
|
85
|
+
if (!TRANSITIONS[job.status].includes(action)) {
|
|
86
|
+
throw new SettlementError('invalid-transition', `job ${job.id} is ${job.status}; cannot ${action}`);
|
|
87
|
+
}
|
|
88
|
+
if (!actorAllowed(job, action, input.actor)) {
|
|
89
|
+
throw new SettlementError('unauthorized-actor', `${action} is not allowed for ${input.actor} on job ${job.id} (${job.status})`);
|
|
90
|
+
}
|
|
91
|
+
switch (action) {
|
|
92
|
+
case 'setProvider': {
|
|
93
|
+
if (isProviderSet(job)) {
|
|
94
|
+
throw new SettlementError('precondition-failed', `job ${job.id} already has a provider`);
|
|
95
|
+
}
|
|
96
|
+
return { ...job, provider: requireAddress(input.provider, 'provider') };
|
|
97
|
+
}
|
|
98
|
+
case 'setBudget': {
|
|
99
|
+
if (input.amount === undefined || input.amount <= 0n) {
|
|
100
|
+
throw new SettlementError('precondition-failed', `job ${job.id} needs a positive budget`);
|
|
101
|
+
}
|
|
102
|
+
return { ...job, budget: input.amount };
|
|
103
|
+
}
|
|
104
|
+
case 'fund': {
|
|
105
|
+
if (!isProviderSet(job)) {
|
|
106
|
+
throw new SettlementError('precondition-failed', `job ${job.id} has no provider to fund`);
|
|
107
|
+
}
|
|
108
|
+
if (job.budget <= 0n) {
|
|
109
|
+
throw new SettlementError('precondition-failed', `job ${job.id} has no budget to fund`);
|
|
110
|
+
}
|
|
111
|
+
if (input.expectedBudget === undefined || input.expectedBudget !== job.budget) {
|
|
112
|
+
throw new SettlementError('precondition-failed', `fund expectedBudget does not match job ${job.id} budget ${job.budget.toString()}`);
|
|
113
|
+
}
|
|
114
|
+
return { ...job, status: 'Funded' };
|
|
115
|
+
}
|
|
116
|
+
case 'submit': {
|
|
117
|
+
const deliverable = input.deliverable;
|
|
118
|
+
if (typeof deliverable !== 'string' || deliverable === '') {
|
|
119
|
+
throw new SettlementError('missing-field', `submit needs a deliverable`);
|
|
120
|
+
}
|
|
121
|
+
return { ...job, status: 'Submitted', deliverable };
|
|
122
|
+
}
|
|
123
|
+
case 'complete':
|
|
124
|
+
return input.reason === undefined
|
|
125
|
+
? { ...job, status: 'Completed' }
|
|
126
|
+
: { ...job, status: 'Completed', reason: input.reason };
|
|
127
|
+
case 'reject':
|
|
128
|
+
return input.reason === undefined
|
|
129
|
+
? { ...job, status: 'Rejected' }
|
|
130
|
+
: { ...job, status: 'Rejected', reason: input.reason };
|
|
131
|
+
case 'raiseDispute': {
|
|
132
|
+
// Nothing to arbitrate unless someone is empowered to resolve it.
|
|
133
|
+
if (!isArbiterSet(job)) {
|
|
134
|
+
throw new SettlementError('precondition-failed', `job ${job.id} has no arbiter to resolve a dispute`);
|
|
135
|
+
}
|
|
136
|
+
if (typeof input.reason !== 'string' || input.reason === '') {
|
|
137
|
+
throw new SettlementError('missing-field', 'raiseDispute needs a reason');
|
|
138
|
+
}
|
|
139
|
+
return { ...job, status: 'Disputed', disputeReason: input.reason };
|
|
140
|
+
}
|
|
141
|
+
case 'resolveDispute': {
|
|
142
|
+
const outcome = input.outcome;
|
|
143
|
+
if (outcome !== 'release' && outcome !== 'refund') {
|
|
144
|
+
throw new SettlementError('missing-field', 'resolveDispute needs an outcome of release or refund');
|
|
145
|
+
}
|
|
146
|
+
const resolved = {
|
|
147
|
+
...job,
|
|
148
|
+
status: outcome === 'release' ? 'Completed' : 'Rejected',
|
|
149
|
+
resolution: outcome,
|
|
150
|
+
};
|
|
151
|
+
return input.reason === undefined ? resolved : { ...resolved, reason: input.reason };
|
|
152
|
+
}
|
|
153
|
+
case 'claimRefund': {
|
|
154
|
+
if (input.now === undefined || input.now < job.expiredAt) {
|
|
155
|
+
throw new SettlementError('precondition-failed', `job ${job.id} has not expired`);
|
|
156
|
+
}
|
|
157
|
+
return { ...job, status: 'Expired' };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* How escrow moves on a terminal status: released to the provider on
|
|
163
|
+
* `Completed`, refunded to the client on `Rejected` / `Expired`.
|
|
164
|
+
*
|
|
165
|
+
* A dispute resolved to `release` lands on `Completed` and one resolved to
|
|
166
|
+
* `refund` lands on `Rejected`, so the outcome of arbitration is read here just
|
|
167
|
+
* like any other settlement. `Disputed` itself moves nothing — it is not
|
|
168
|
+
* terminal.
|
|
169
|
+
*/
|
|
170
|
+
export function escrowOutcome(status) {
|
|
171
|
+
if (status === 'Completed')
|
|
172
|
+
return 'release';
|
|
173
|
+
if (status === 'Rejected' || status === 'Expired')
|
|
174
|
+
return 'refund';
|
|
175
|
+
return 'none';
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Receipt for a completed job — the escrow released to the provider. A dispute
|
|
179
|
+
* resolved to `release` yields the same receipt; its `proof.resolution` records
|
|
180
|
+
* that the release came via arbitration rather than the evaluator's attestation.
|
|
181
|
+
*/
|
|
182
|
+
export function receiptFromEscrow(job, args) {
|
|
183
|
+
if (job.status !== 'Completed') {
|
|
184
|
+
throw new SettlementError('unsuccessful-settlement', `job ${job.id} is ${job.status}, not Completed`);
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
id: args.transaction ?? `${job.id}@${args.settledAt}`,
|
|
188
|
+
protocol: 'erc8183',
|
|
189
|
+
network: args.network,
|
|
190
|
+
asset: args.asset,
|
|
191
|
+
amount: job.budget,
|
|
192
|
+
payer: job.client,
|
|
193
|
+
payee: job.provider,
|
|
194
|
+
transaction: args.transaction,
|
|
195
|
+
settledAt: args.settledAt,
|
|
196
|
+
intentId: job.id,
|
|
197
|
+
proof: {
|
|
198
|
+
jobId: job.id,
|
|
199
|
+
deliverable: job.deliverable,
|
|
200
|
+
reason: job.reason,
|
|
201
|
+
resolution: job.resolution,
|
|
202
|
+
disputeReason: job.disputeReason,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=erc8183.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc8183.js","sourceRoot":"","sources":["../src/erc8183.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export { authScheme, base64Decode, base64Encode, decodeJsonPayload, encodeJsonPayload, formatAuthHeader, parseAuthHeader, } from './wire.js';
|
|
2
|
+
export type { AuthHeader } from './wire.js';
|
|
3
|
+
export { MPP_RECEIPT_HEADER, MPP_SCHEME, MPP_STATUS, classifyMppResponse, decodeMppRequest, encodeMppRequest, formatCredential, formatWwwAuthenticate, mppIntent, parseCredential, parseWwwAuthenticate, } from './mpp.js';
|
|
4
|
+
export type { MppChallenge, MppCredential, MppIntentArgs, MppProblemCode, MppResponseKind, } from './mpp.js';
|
|
5
|
+
export { X402_HEADERS, X402_VERSION, encodePaymentSignature, formatPaymentRequired, formatSettlementResponse, intentFromRequirement, parsePaymentRequired, parsePaymentSignature, parseSettlementResponse, selectRequirement, verifyRequirement, } from './x402.js';
|
|
6
|
+
export type { IntentFromRequirementArgs, RequirementFilter, X402PaymentRequired, X402Requirements, X402Resource, X402SettlementResponse, } from './x402.js';
|
|
7
|
+
export { A2A_ERROR_CODES, A2A_EXTENSIONS_HEADER, A2A_METADATA_KEYS, A2A_X402_EXTENSION_URI, a2aIntent, assertA2ATransition, buildPaymentMetadata, canTransitionA2A, isA2AErrorCode, isTerminalA2AStatus, parsePaymentMetadata, parsePaymentPayload, parsePaymentRequiredResponse, parseSettleResponse, receiptFromA2A, verifyA2ARequirement, } from './a2a.js';
|
|
8
|
+
export type { A2AErrorCode, A2AIntentArgs, A2APaymentMetadata, A2APaymentPayload, A2APaymentRequiredResponse, A2APaymentRequirements, A2APaymentStatus, A2AReceiptArgs, A2ASettleResponse, } from './a2a.js';
|
|
9
|
+
export { ZERO_ADDRESS, applyJobAction, allowedActors, canApplyJobAction, escrowOutcome, isArbiterSet, isProviderSet, isTerminalJobStatus, receiptFromEscrow, } from './erc8183.js';
|
|
10
|
+
export type { EscrowActionInput, EscrowJob, EscrowJobAction, EscrowJobStatus, EscrowReceiptArgs, EscrowResolution, EscrowRole, } from './erc8183.js';
|
|
11
|
+
export { RAIL_KIND_ORDER, formatUnits, parseUnits, resolveRailAsset, selectRail, } from './rails.js';
|
|
12
|
+
export type { PaymentRail, RailAsset, RailConstraints, RailKind, RailSelection, RoutePlan, } from './rails.js';
|
|
13
|
+
export { receiptFromMpp, receiptFromX402 } from './receipts.js';
|
|
14
|
+
export type { MppReceiptArgs, X402ReceiptArgs } from './receipts.js';
|
|
15
|
+
export { Ledger } from './ledger.js';
|
|
16
|
+
export type { AssetRef } from './ledger.js';
|
|
17
|
+
export { WebhookDispatcher, matchesWebhook, webhookEventFromLedgerEvent } from './webhooks.js';
|
|
18
|
+
export type { WebhookAttempt, WebhookDelivery, WebhookDispatcherOptions, WebhookEvent, WebhookEventType, WebhookRequest, WebhookResponse, WebhookSigner, WebhookSubscription, WebhookTransport, } from './webhooks.js';
|
|
19
|
+
export { SettlementError, assertCaip2, isCaip2 } from './types.js';
|
|
20
|
+
export type { Caip2, IntentStatus, LedgerEntry, LedgerEvent, PaymentIntent, Protocol, Reconciliation, SettlementErrorCode, SettlementReceipt, } from './types.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { authScheme, base64Decode, base64Encode, decodeJsonPayload, encodeJsonPayload, formatAuthHeader, parseAuthHeader, } from './wire.js';
|
|
2
|
+
export { MPP_RECEIPT_HEADER, MPP_SCHEME, MPP_STATUS, classifyMppResponse, decodeMppRequest, encodeMppRequest, formatCredential, formatWwwAuthenticate, mppIntent, parseCredential, parseWwwAuthenticate, } from './mpp.js';
|
|
3
|
+
export { X402_HEADERS, X402_VERSION, encodePaymentSignature, formatPaymentRequired, formatSettlementResponse, intentFromRequirement, parsePaymentRequired, parsePaymentSignature, parseSettlementResponse, selectRequirement, verifyRequirement, } from './x402.js';
|
|
4
|
+
export { A2A_ERROR_CODES, A2A_EXTENSIONS_HEADER, A2A_METADATA_KEYS, A2A_X402_EXTENSION_URI, a2aIntent, assertA2ATransition, buildPaymentMetadata, canTransitionA2A, isA2AErrorCode, isTerminalA2AStatus, parsePaymentMetadata, parsePaymentPayload, parsePaymentRequiredResponse, parseSettleResponse, receiptFromA2A, verifyA2ARequirement, } from './a2a.js';
|
|
5
|
+
export { ZERO_ADDRESS, applyJobAction, allowedActors, canApplyJobAction, escrowOutcome, isArbiterSet, isProviderSet, isTerminalJobStatus, receiptFromEscrow, } from './erc8183.js';
|
|
6
|
+
export { RAIL_KIND_ORDER, formatUnits, parseUnits, resolveRailAsset, selectRail, } from './rails.js';
|
|
7
|
+
export { receiptFromMpp, receiptFromX402 } from './receipts.js';
|
|
8
|
+
export { Ledger } from './ledger.js';
|
|
9
|
+
export { WebhookDispatcher, matchesWebhook, webhookEventFromLedgerEvent } from './webhooks.js';
|
|
10
|
+
export { SettlementError, assertCaip2, isCaip2 } from './types.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|