@integraledger/lcp-placement-x402 0.9.0 → 0.10.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/CHANGELOG.md +19 -0
- package/README.md +13 -8
- package/dist/manifest.d.ts +16 -4
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +16 -4
- package/dist/manifest.js.map +1 -1
- package/dist/placement.d.ts +1 -1
- package/dist/placement.js +1 -1
- package/package.json +2 -2
- package/src/manifest.ts +16 -4
- package/src/placement.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @integraledger/lcp-placement-x402
|
|
2
2
|
|
|
3
|
+
## 0.10.1
|
|
4
|
+
|
|
5
|
+
**0.10.0 was staged and withdrawn before approval; this is that release, re-cut.** The conformance corpus
|
|
6
|
+
was re-sealed after 0.10.0 was staged — its root moved `32fa90a6…` → `28bbf4ef…` when the vector tree was
|
|
7
|
+
brought inside the prose gates — so the staged `lcp-conformance` tarball carried a seal that no longer
|
|
8
|
+
matched the repository. The seal is what proves corpus authenticity to an independent implementer, and a
|
|
9
|
+
published version cannot be replaced, so the whole set was rejected and re-cut rather than shipping one
|
|
10
|
+
package that disagreed with its own source. No version 0.10.0 exists on the registry.
|
|
11
|
+
|
|
12
|
+
Released as part of a flat `0.10.1` across the whole suite. One number describes the set that was built,
|
|
13
|
+
tested and sealed together, so a consumer never has to work out which combination of versions was verified.
|
|
14
|
+
|
|
15
|
+
This package has no source change of its own in this release. What moved across the suite: three exported
|
|
16
|
+
names were corrected before anyone depends on them — `USDC_DECIMALS` became rail-qualified after it was
|
|
17
|
+
found to mean 6 on three rails and 7 on Stellar under one name, `VISA_TAP_PLACEMENT_TIER_A` lost the tier
|
|
18
|
+
it had baked into an identifier, and the memo codecs were named for the carrier they encode. Two wire
|
|
19
|
+
identities were respelled to match the vocabulary they are written into. Five gates were added or widened,
|
|
20
|
+
and a large number of documentation claims were corrected against the host specifications at HEAD.
|
|
21
|
+
|
|
3
22
|
## 0.9.0
|
|
4
23
|
|
|
5
24
|
First public release.
|
package/README.md
CHANGED
|
@@ -61,12 +61,14 @@ and the PaymentRequirements table), four facts were confirmed and each one decid
|
|
|
61
61
|
Extension identifiers are implementation-defined strings — no registry, no reverse-domain rule — so the
|
|
62
62
|
`legalContext` key is available today and this placement is Tier A on the wire.
|
|
63
63
|
|
|
64
|
-
### Drift from LCP v1.37 §C.4
|
|
64
|
+
### Drift from LCP v1.37 §C.4 — recorded then adopted by v1.38
|
|
65
65
|
|
|
66
66
|
The host governs: its live specification is binding and LCP's Appendix C is an illustration.
|
|
67
67
|
Two differences, neither of which changes the design:
|
|
68
68
|
|
|
69
|
-
- v1.37
|
|
69
|
+
- v1.37 rendered the echo rule in RFC-2119 capitals ("MAY append to but **MUST NOT** delete or overwrite")
|
|
70
|
+
where the host states it in lower case and about the data rather than the map. **v1.38 §C.4 now says
|
|
71
|
+
exactly that**, so this item is discharged; it is kept because it is why the package reads the way it does
|
|
70
72
|
and states it about the extensions map. The live spec states it in lower case and about the `info` payload.
|
|
71
73
|
Same rule, weaker modality, one level lower.
|
|
72
74
|
- The live spec also carries `extra` on `PaymentPayload.accepted`, which §C.4 does not mention.
|
|
@@ -181,16 +183,19 @@ the same defect as a carrier nobody can find.
|
|
|
181
183
|
x402 defines only `info` and `schema` for an entry and the `legalContext` key is ours, so owning the entry is
|
|
182
184
|
the point for the *seller* direction; entries *beside* ours in the `extensions` map are preserved
|
|
183
185
|
unconditionally.
|
|
184
|
-
- **`
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
186
|
+
- **`LEGAL_CONTEXT_SCHEMA` is INLINED, not a reference.** It was a `$ref` at
|
|
187
|
+
`https://legalcontextprotocol.org/schemas/lcp-extension.json`, which returns 404 — re-measured
|
|
188
|
+
2026-08-11 — and x402 makes `schema` a REQUIRED member of every extension entry, so that shipped a
|
|
189
|
+
required member no counterparty could resolve. All nine extensions published in the x402 repository inline
|
|
190
|
+
a complete JSON Schema, and one of them, Bazaar, forbids an external `$ref` outright. The exported value is
|
|
191
|
+
now a frozen literal that is byte-identical to what the placement emits. Changing it is a **wire change**:
|
|
192
|
+
it appears in every challenge.
|
|
189
193
|
|
|
190
194
|
## Provenance
|
|
191
195
|
|
|
192
196
|
Cut against x402 v2 (`x402-foundation/x402@1fec3aa04e41`, `specs/x402-specification-v2.md`, read 2026-07-30) and reconciled
|
|
193
|
-
against LCP v1.37 §C.4 the same day
|
|
197
|
+
against LCP v1.37 §C.4 the same day, and re-read against **v1.38 §C.4** on 2026-08-12 — which adopted the
|
|
198
|
+
drift items below and added §6.1's reserved keys. The **paths and shapes** are matched field-for-field against the
|
|
194
199
|
shipped seller carrier and the buyer parsers that read it; the **resolution semantics diverge from a strict
|
|
195
200
|
buyer gate in three recorded ways**, and *Drift from a strict buyer-side reader*
|
|
196
201
|
above states each one and who closes it. Both drift sections are the disclosure, not a to-do list — a
|
package/dist/manifest.d.ts
CHANGED
|
@@ -8,10 +8,22 @@ import type { PlacementManifest } from "@integraledger/lcp-binding-core";
|
|
|
8
8
|
* that does not break, not a reason to ship it. (`https://legalcontextprotocol.org/schemas/lcp-extension.json`
|
|
9
9
|
* returns **404**, measured 2026-08-08 — the schema is inlined instead.)
|
|
10
10
|
*
|
|
11
|
-
* **
|
|
12
|
-
* referencing an external document
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* **All nine extensions published in the x402 repository inline a complete JSON Schema** rather than
|
|
12
|
+
* referencing an external document — `bazaar`, `builder-code`, `eip2612GasSponsoring`,
|
|
13
|
+
* `erc20ApprovalGasSponsoring`, `auth-hints`, `offer-receipt`, `http-message-signatures`,
|
|
14
|
+
* `payment-identifier`, `sign-in-with-x`, read at `x402-foundation/x402` HEAD 2026-08-11. Note that two of
|
|
15
|
+
* the nine are camelCase, so this package's `legalContext` key follows an established minority spelling
|
|
16
|
+
* rather than diverging from a unanimous one. LCP v1.38 §C.4 says to do one or the other — "Because
|
|
17
|
+
* `schema` is a REQUIRED member, publish a resolvable schema or inline it" — and adds that inlining is the
|
|
18
|
+
* safer of the two. Inlining also removes a hosting
|
|
19
|
+
* dependency the deployment does not currently meet — the same dependency the UCP capability still owes.
|
|
20
|
+
*
|
|
21
|
+
* **One of the nine makes it a rule, which settles the question.** The Bazaar extension requires a
|
|
22
|
+
* `schema`'s `$ref`/`$id` values to be "same-document JSON Pointer fragments (starting with `#`); external
|
|
23
|
+
* references (`http(s)://`, `file://`, or any other absolute/relative URI) are not allowed", and says a
|
|
24
|
+
* facilitator "must not resolve external `$ref`/`$id` values … when validating an untrusted `schema`". So a
|
|
25
|
+
* `$ref` here would not merely be unresolvable to a counterparty — it would be rejected outright by any
|
|
26
|
+
* facilitator cataloguing this extension.
|
|
15
27
|
*
|
|
16
28
|
* The shape is the §8.1 reference object this placement writes into `info`, and nothing more: it describes
|
|
17
29
|
* the carrier, not the terms behind it.
|
package/dist/manifest.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuB/D,CAAC;AAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,eAAO,MAAM,cAAc,EAAE,iBAkB5B,CAAC"}
|
package/dist/manifest.js
CHANGED
|
@@ -7,10 +7,22 @@
|
|
|
7
7
|
* that does not break, not a reason to ship it. (`https://legalcontextprotocol.org/schemas/lcp-extension.json`
|
|
8
8
|
* returns **404**, measured 2026-08-08 — the schema is inlined instead.)
|
|
9
9
|
*
|
|
10
|
-
* **
|
|
11
|
-
* referencing an external document
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* **All nine extensions published in the x402 repository inline a complete JSON Schema** rather than
|
|
11
|
+
* referencing an external document — `bazaar`, `builder-code`, `eip2612GasSponsoring`,
|
|
12
|
+
* `erc20ApprovalGasSponsoring`, `auth-hints`, `offer-receipt`, `http-message-signatures`,
|
|
13
|
+
* `payment-identifier`, `sign-in-with-x`, read at `x402-foundation/x402` HEAD 2026-08-11. Note that two of
|
|
14
|
+
* the nine are camelCase, so this package's `legalContext` key follows an established minority spelling
|
|
15
|
+
* rather than diverging from a unanimous one. LCP v1.38 §C.4 says to do one or the other — "Because
|
|
16
|
+
* `schema` is a REQUIRED member, publish a resolvable schema or inline it" — and adds that inlining is the
|
|
17
|
+
* safer of the two. Inlining also removes a hosting
|
|
18
|
+
* dependency the deployment does not currently meet — the same dependency the UCP capability still owes.
|
|
19
|
+
*
|
|
20
|
+
* **One of the nine makes it a rule, which settles the question.** The Bazaar extension requires a
|
|
21
|
+
* `schema`'s `$ref`/`$id` values to be "same-document JSON Pointer fragments (starting with `#`); external
|
|
22
|
+
* references (`http(s)://`, `file://`, or any other absolute/relative URI) are not allowed", and says a
|
|
23
|
+
* facilitator "must not resolve external `$ref`/`$id` values … when validating an untrusted `schema`". So a
|
|
24
|
+
* `$ref` here would not merely be unresolvable to a counterparty — it would be rejected outright by any
|
|
25
|
+
* facilitator cataloguing this extension.
|
|
14
26
|
*
|
|
15
27
|
* The shape is the §8.1 reference object this placement writes into `info`, and nothing more: it describes
|
|
16
28
|
* the carrier, not the terms behind it.
|
package/dist/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,MAAM,CAAC,MAAM,CAAC;IACZ,OAAO,EAAE,8CAA8C;IACvD,KAAK,EAAE,6BAA6B;IACpC,WAAW,EACT,qJAAqJ;IACvJ,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;YACrC,WAAW,EACT,0GAA0G;SAC7G;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,CAAC;YACZ,WAAW,EACT,yGAAyG;SAC5G;KACF;CACF,CAAC,CAAC;AAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,GAAG;IACT,QAAQ,EAAE,kBAAkB;IAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;IAClC,KAAK,EAAE,8BAA8B;IACrC,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,QAAQ;SACnB;KACF;IACD,aAAa,EAAE,8CAA8C;IAC7D,YAAY,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;IAC/B,OAAO,EACL,kRAAkR;CACrR,CAAC"}
|
package/dist/placement.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { type ReferencePlacementAdapter } from "@integraledger/lcp-binding-core"
|
|
|
9
9
|
* a generic enum — the abstraction leaking — so the write half is overridden here, in this package, where it
|
|
10
10
|
* is reviewed like any other code. `extract` is the kit's unchanged: reading `extensions.legalContext.info` is
|
|
11
11
|
* an ordinary object-path read, and the bare-hash alias at `accepts.0.extra.atrHash` is handled by its own
|
|
12
|
-
* declared encoding
|
|
12
|
+
* declared encoding. One overridden member is composition; a second would mean this package had
|
|
13
13
|
* stopped using the kit, and the test suite says so.
|
|
14
14
|
*/
|
|
15
15
|
export declare const x402Placement: ReferencePlacementAdapter;
|
package/dist/placement.js
CHANGED
|
@@ -21,7 +21,7 @@ function refuse(code, detail) {
|
|
|
21
21
|
* a generic enum — the abstraction leaking — so the write half is overridden here, in this package, where it
|
|
22
22
|
* is reviewed like any other code. `extract` is the kit's unchanged: reading `extensions.legalContext.info` is
|
|
23
23
|
* an ordinary object-path read, and the bare-hash alias at `accepts.0.extra.atrHash` is handled by its own
|
|
24
|
-
* declared encoding
|
|
24
|
+
* declared encoding. One overridden member is composition; a second would mean this package had
|
|
25
25
|
* stopped using the kit, and the test suite says so.
|
|
26
26
|
*/
|
|
27
27
|
export const x402Placement = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@integraledger/lcp-placement-x402",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Places an LCP reference into an x402 v2 payment challenge, and reads it back.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lcp",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"homepage": "https://github.com/IntegraLedger/integra-protocol/tree/main/packages/placement-x402#readme",
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@integraledger/lcp-binding-core": "0.
|
|
43
|
+
"@integraledger/lcp-binding-core": "0.10.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@cfworker/json-schema": "4.1.1",
|
package/src/manifest.ts
CHANGED
|
@@ -9,10 +9,22 @@ import type { PlacementManifest } from "@integraledger/lcp-binding-core";
|
|
|
9
9
|
* that does not break, not a reason to ship it. (`https://legalcontextprotocol.org/schemas/lcp-extension.json`
|
|
10
10
|
* returns **404**, measured 2026-08-08 — the schema is inlined instead.)
|
|
11
11
|
*
|
|
12
|
-
* **
|
|
13
|
-
* referencing an external document
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* **All nine extensions published in the x402 repository inline a complete JSON Schema** rather than
|
|
13
|
+
* referencing an external document — `bazaar`, `builder-code`, `eip2612GasSponsoring`,
|
|
14
|
+
* `erc20ApprovalGasSponsoring`, `auth-hints`, `offer-receipt`, `http-message-signatures`,
|
|
15
|
+
* `payment-identifier`, `sign-in-with-x`, read at `x402-foundation/x402` HEAD 2026-08-11. Note that two of
|
|
16
|
+
* the nine are camelCase, so this package's `legalContext` key follows an established minority spelling
|
|
17
|
+
* rather than diverging from a unanimous one. LCP v1.38 §C.4 says to do one or the other — "Because
|
|
18
|
+
* `schema` is a REQUIRED member, publish a resolvable schema or inline it" — and adds that inlining is the
|
|
19
|
+
* safer of the two. Inlining also removes a hosting
|
|
20
|
+
* dependency the deployment does not currently meet — the same dependency the UCP capability still owes.
|
|
21
|
+
*
|
|
22
|
+
* **One of the nine makes it a rule, which settles the question.** The Bazaar extension requires a
|
|
23
|
+
* `schema`'s `$ref`/`$id` values to be "same-document JSON Pointer fragments (starting with `#`); external
|
|
24
|
+
* references (`http(s)://`, `file://`, or any other absolute/relative URI) are not allowed", and says a
|
|
25
|
+
* facilitator "must not resolve external `$ref`/`$id` values … when validating an untrusted `schema`". So a
|
|
26
|
+
* `$ref` here would not merely be unresolvable to a counterparty — it would be rejected outright by any
|
|
27
|
+
* facilitator cataloguing this extension.
|
|
16
28
|
*
|
|
17
29
|
* The shape is the §8.1 reference object this placement writes into `info`, and nothing more: it describes
|
|
18
30
|
* the carrier, not the terms behind it.
|
package/src/placement.ts
CHANGED
|
@@ -31,7 +31,7 @@ function refuse(code: string, detail: string): Outcome<never> {
|
|
|
31
31
|
* a generic enum — the abstraction leaking — so the write half is overridden here, in this package, where it
|
|
32
32
|
* is reviewed like any other code. `extract` is the kit's unchanged: reading `extensions.legalContext.info` is
|
|
33
33
|
* an ordinary object-path read, and the bare-hash alias at `accepts.0.extra.atrHash` is handled by its own
|
|
34
|
-
* declared encoding
|
|
34
|
+
* declared encoding. One overridden member is composition; a second would mean this package had
|
|
35
35
|
* stopped using the kit, and the test suite says so.
|
|
36
36
|
*/
|
|
37
37
|
export const x402Placement: ReferencePlacementAdapter = {
|