@integraledger/lcp-binding-stellar 0.9.0 → 0.10.2

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 CHANGED
@@ -1,5 +1,63 @@
1
1
  # @integraledger/lcp-binding-stellar
2
2
 
3
+ ## 0.10.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 1d892dc: Correct the Stellar manifest's account of its relationship to x402.
8
+
9
+ The docblock claimed this binding welds into a CLASSIC Stellar payment, that x402's `exact` scheme for
10
+ Stellar was "a different flow entirely", and that "a deployment settling through an x402-Stellar facilitator
11
+ does not get this carrier". Every step of that was wrong, and it contradicted the same file: `finality.note`
12
+ says "Soroban SAC transfer", the paragraph above it says the buyer signs the Soroban SAC `transfer`, and
13
+ `adapter.ts` types the field it reads as "the `to` destination of the SAC transfer". There was never a
14
+ classic payment here to mux.
15
+
16
+ Re-read against the live sources: x402's exact-Stellar scheme is Soroban SEP-41 token transfers —
17
+ `invokeHostFunction` calling `transfer(from, to, amount)`, the same operation this binding welds into. Its
18
+ only rule on the destination is that argument 1 must equal `requirements.payTo` exactly, and it places no
19
+ format constraint on `payTo` anywhere, so a seller advertising their `M…` address satisfies it by
20
+ construction. And CAP-67 exists precisely to permit this: it adds `SC_ADDRESS_TYPE_MUXED_ACCOUNT` and
21
+ allows the SAC to take that type in `transfer`.
22
+
23
+ What IS limited is narrower and different, and is now what the docblock states: CAP-67 extended the SAC, not
24
+ Soroban generally. `MuxedAddressObject` "is not implicitly compatible with `AddressObject`", so a custom
25
+ SEP-41 token contract rejects a muxed `to` and the invocation fails rather than degrading. The carrier is
26
+ therefore available through x402 when, and only when, the scheme's `asset` is the SAC.
27
+
28
+ No manifest field changed — `protocol` stays absent, but now because the carrier genuinely serves bare
29
+ Soroban and x402 alike rather than because x402 could not reach it. Two facts are explicitly left unclaimed
30
+ because they were not verified: whether a given facilitator independently rejects an `M…` `payTo`, and
31
+ CAP-67's activation status on any particular network.
32
+
33
+ - Updated dependencies [b2ffecc]
34
+ - Updated dependencies [822190a]
35
+ - @integraledger/lcp-binding-core@0.11.0
36
+ - @integraledger/lcp-kernel@0.11.0
37
+
38
+ ## 0.10.1
39
+
40
+ **0.10.0 was staged and withdrawn before approval; this is that release, re-cut.** The conformance corpus
41
+ was re-sealed after 0.10.0 was staged — its root moved `32fa90a6…` → `28bbf4ef…` when the vector tree was
42
+ brought inside the prose gates — so the staged `lcp-conformance` tarball carried a seal that no longer
43
+ matched the repository. The seal is what proves corpus authenticity to an independent implementer, and a
44
+ published version cannot be replaced, so the whole set was rejected and re-cut rather than shipping one
45
+ package that disagreed with its own source. No version 0.10.0 exists on the registry.
46
+
47
+ ### Minor Changes
48
+
49
+ - f1c531c: **Breaking:** `USDC_DECIMALS` is renamed to `HEDERA_USDC_DECIMALS`, `SOLANA_USDC_DECIMALS`,
50
+ `STELLAR_USDC_DECIMALS` and `SUI_USDC_DECIMALS`.
51
+
52
+ All four packages exported the same name and they did not all mean the same number — Stellar assets carry
53
+ seven decimals where the other three carry six. Each value was correct for its own chain, so no package had
54
+ a defect and every package's own test passed; the hazard lived only in importing one rail's constant and
55
+ applying it on another, which is a ten-fold error in an amount and surfaces at settlement rather than at
56
+ compile time. The rail prefix makes that import impossible to make by accident.
57
+
58
+ `minor` rather than `major` because every package here is pre-1.0, where a minor is the breaking increment
59
+ under semver. Migration is a rename at the import site; the values are unchanged.
60
+
3
61
  ## 0.9.0
4
62
 
5
63
  First public release.
@@ -42,6 +42,15 @@ export declare const PUBNET_PASSPHRASE = "Public Global Stellar Network ; Septem
42
42
  /** The constants for one network. Both are usable — the CAP-67 muxed id is a ledger primitive, so nothing
43
43
  * has to be deployed first. */
44
44
  export declare function getStellarConfig(network: StellarNetwork): StellarNetworkConfig;
45
- /** USDC on Stellar has 7 decimals — 1 USDC = 10_000_000 base units. */
46
- export declare const USDC_DECIMALS = 7;
45
+ /**
46
+ * USDC on Stellar has 7 decimals — 1 USDC = 10_000_000 base units.
47
+ *
48
+ * RAIL-QUALIFIED ON PURPOSE. Four bindings publish a USDC decimal count and they are NOT all the same —
49
+ * Stellar's is 7 where Hedera's, Solana's and Sui's are 6. A bare `USDC_DECIMALS` exported four times
50
+ * from four packages is one name with two meanings, and the way that fails is silent: a consumer who reads
51
+ * it from one rail and applies it on another is off by a factor of ten in an amount, at settlement rather
52
+ * than at compile time. Each value is correct for its own chain, which is why no per-package test can
53
+ * catch the clash; the prefix is what makes it impossible to import the wrong one by accident.
54
+ */
55
+ export declare const STELLAR_USDC_DECIMALS = 7;
47
56
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;8GAG8G;AAC9G,eAAO,MAAM,UAAU,EAAG,kBAA2B,CAAC;AAEtD,8DAA8D;AAC9D,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,mGAAmG;AACnG,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElD;;;wFAGwF;AACxF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,kEAAkE;IAClE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,yGAAyG;AACzG,eAAO,MAAM,kBAAkB,sCAAsC,CAAC;AACtE;;gCAEgC;AAChC,eAAO,MAAM,iBAAiB,mDACoB,CAAC;AAkBnD;gCACgC;AAChC,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,GACtB,oBAAoB,CAEtB;AAED,uEAAuE;AACvE,eAAO,MAAM,aAAa,IAAI,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;8GAG8G;AAC9G,eAAO,MAAM,UAAU,EAAG,kBAA2B,CAAC;AAEtD,8DAA8D;AAC9D,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,mGAAmG;AACnG,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElD;;;wFAGwF;AACxF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,kEAAkE;IAClE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,yGAAyG;AACzG,eAAO,MAAM,kBAAkB,sCAAsC,CAAC;AACtE;;gCAEgC;AAChC,eAAO,MAAM,iBAAiB,mDACoB,CAAC;AAkBnD;gCACgC;AAChC,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,GACtB,oBAAoB,CAEtB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,IAAI,CAAC"}
package/dist/constants.js CHANGED
@@ -41,6 +41,15 @@ const PUBNET = {
41
41
  export function getStellarConfig(network) {
42
42
  return network === "testnet" ? TESTNET : PUBNET;
43
43
  }
44
- /** USDC on Stellar has 7 decimals — 1 USDC = 10_000_000 base units. */
45
- export const USDC_DECIMALS = 7;
44
+ /**
45
+ * USDC on Stellar has 7 decimals — 1 USDC = 10_000_000 base units.
46
+ *
47
+ * RAIL-QUALIFIED ON PURPOSE. Four bindings publish a USDC decimal count and they are NOT all the same —
48
+ * Stellar's is 7 where Hedera's, Solana's and Sui's are 6. A bare `USDC_DECIMALS` exported four times
49
+ * from four packages is one name with two meanings, and the way that fails is silent: a consumer who reads
50
+ * it from one rail and applies it on another is off by a factor of ten in an amount, at settlement rather
51
+ * than at compile time. Each value is correct for its own chain, which is why no per-package test can
52
+ * catch the clash; the prefix is what makes it impossible to import the wrong one by accident.
53
+ */
54
+ export const STELLAR_USDC_DECIMALS = 7;
46
55
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;8GAG8G;AAC9G,MAAM,CAAC,MAAM,UAAU,GAAG,kBAA2B,CAAC;AAEtD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAqB9B,yGAAyG;AACzG,MAAM,CAAC,MAAM,kBAAkB,GAAG,mCAAmC,CAAC;AACtE;;gCAEgC;AAChC,MAAM,CAAC,MAAM,iBAAiB,GAC5B,gDAAgD,CAAC;AAEnD,MAAM,OAAO,GAAyB;IACpC,OAAO,EAAE,SAAS;IAClB,iBAAiB,EAAE,kBAAkB;IACrC,UAAU,EAAE,qCAAqC;IACjD,aAAa,EAAE,qCAAqC;IACpD,iBAAiB,EAAE,0DAA0D;CAC9E,CAAC;AAEF,MAAM,MAAM,GAAyB;IACnC,OAAO,EAAE,QAAQ;IACjB,iBAAiB,EAAE,iBAAiB;IACpC,UAAU,EAAE,6BAA6B;IACzC,aAAa,EAAE,gCAAgC;IAC/C,iBAAiB,EAAE,0DAA0D;CAC9E,CAAC;AAEF;gCACgC;AAChC,MAAM,UAAU,gBAAgB,CAC9B,OAAuB;IAEvB,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAClD,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;8GAG8G;AAC9G,MAAM,CAAC,MAAM,UAAU,GAAG,kBAA2B,CAAC;AAEtD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAqB9B,yGAAyG;AACzG,MAAM,CAAC,MAAM,kBAAkB,GAAG,mCAAmC,CAAC;AACtE;;gCAEgC;AAChC,MAAM,CAAC,MAAM,iBAAiB,GAC5B,gDAAgD,CAAC;AAEnD,MAAM,OAAO,GAAyB;IACpC,OAAO,EAAE,SAAS;IAClB,iBAAiB,EAAE,kBAAkB;IACrC,UAAU,EAAE,qCAAqC;IACjD,aAAa,EAAE,qCAAqC;IACpD,iBAAiB,EAAE,0DAA0D;CAC9E,CAAC;AAEF,MAAM,MAAM,GAAyB;IACnC,OAAO,EAAE,QAAQ;IACjB,iBAAiB,EAAE,iBAAiB;IACpC,UAAU,EAAE,6BAA6B;IACzC,aAAa,EAAE,gCAAgC;IAC/C,iBAAiB,EAAE,0DAA0D;CAC9E,CAAC;AAEF;gCACgC;AAChC,MAAM,UAAU,gBAAgB,CAC9B,OAAuB;IAEvB,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { buildMuxedDestination, createStellarAdapter, isSettledSuccessfully, STELLAR_PREFIX_NOTE, type StellarAdapter, type StellarMuxConfirmation, type StellarMuxPrefixRecovery, type StellarReader, type StellarSettlementRef, type StellarSettlementView, } from "./adapter.js";
2
- export { getStellarConfig, MUX_ID_BYTES, MUX_SCHEME, PUBNET_PASSPHRASE, type StellarNetwork, type StellarNetworkConfig, TESTNET_PASSPHRASE, USDC_DECIMALS, } from "./constants.js";
2
+ export { getStellarConfig, MUX_ID_BYTES, MUX_SCHEME, PUBNET_PASSPHRASE, STELLAR_USDC_DECIMALS, type StellarNetwork, type StellarNetworkConfig, TESTNET_PASSPHRASE, } from "./constants.js";
3
3
  export { STELLAR_MANIFEST } from "./manifest.js";
4
4
  export { type DecodedMuxedAddress, decodeMuxedAddress, deriveMuxId, encodeMuxedAddress, recoverMuxIdPrefix8, verifyMuxedBinding, } from "./mux.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,kBAAkB,EAClB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EACL,KAAK,mBAAmB,EACxB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EACL,KAAK,mBAAmB,EACxB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { buildMuxedDestination, createStellarAdapter, isSettledSuccessfully, STELLAR_PREFIX_NOTE, } from "./adapter.js";
2
- export { getStellarConfig, MUX_ID_BYTES, MUX_SCHEME, PUBNET_PASSPHRASE, TESTNET_PASSPHRASE, USDC_DECIMALS, } from "./constants.js";
2
+ export { getStellarConfig, MUX_ID_BYTES, MUX_SCHEME, PUBNET_PASSPHRASE, STELLAR_USDC_DECIMALS, TESTNET_PASSPHRASE, } from "./constants.js";
3
3
  export { STELLAR_MANIFEST } from "./manifest.js";
4
4
  export { decodeMuxedAddress, deriveMuxId, encodeMuxedAddress, recoverMuxIdPrefix8, verifyMuxedBinding, } from "./mux.js";
5
5
  //# 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,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GAOpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EAGjB,kBAAkB,EAClB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAEL,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GAOpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EAGrB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAEL,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,UAAU,CAAC"}
@@ -16,17 +16,45 @@ import type { BindingManifest } from "@integraledger/lcp-binding-core";
16
16
  * `forwardIndexable: false` (no native index over mux prefixes; `enumerate` is a best-effort account scan,
17
17
  * `indexing: "account-scan:mux-prefix8"`). The prefix-8 truncation is stated in `finality.note` too.
18
18
  *
19
- * **NO `protocol`, and here is precisely what it is neutral OF.** This binding welds into the destination
20
- * of a CLASSIC Stellar payment. x402's `exact` scheme for Stellar (read 2026-08-08) is a different flow
21
- * entirely: "This spec covers SEP-41-compliant Soroban tokens **only**. Classic Stellar assets are not
22
- * supported", and the payment is an `invokeHostFunction` calling `transfer(from, to, amount)` where
23
- * "Argument 1 (to): MUST equal `requirements.payTo` exactly".
24
- *
25
- * A muxed destination cannot appear in that call there is no classic payment to mux, and an `M…` address
26
- * would not equal `payTo` exactly. So a deployment settling through an x402-Stellar facilitator does not
27
- * get this carrier. That is a scoping fact, not a defect: the binding has never declared `protocol`, and
28
- * the mux weld is correct on the rail it targets. Stated here so the absence is a measured claim rather
29
- * than an unexamined default.
19
+ * **NO `protocol`, and the reason is that the carrier genuinely works on both sides CORRECTED
20
+ * 2026-08-15.** An earlier revision of this paragraph said the opposite: that the binding welds into a
21
+ * CLASSIC Stellar payment, that x402's `exact` scheme for Stellar was "a different flow entirely", and
22
+ * that "a deployment settling through an x402-Stellar facilitator does not get this carrier". Every step of
23
+ * that was wrong, and it contradicted this same file — `finality.note` below says "Soroban SAC transfer",
24
+ * the paragraph above says the buyer signs the Soroban SAC `transfer`, and `adapter.ts` types the field it
25
+ * reads as "the `to` destination of the SAC transfer". There was never a classic payment here to mux.
26
+ *
27
+ * Re-read against the live sources on 2026-08-15:
28
+ *
29
+ * - **x402's `exact` scheme for Stellar** (`x402-foundation/x402` HEAD `167a828e8319`) is Soroban SEP-41
30
+ * token transfers — an `invokeHostFunction` calling `transfer(from, to, amount)`. That is the SAME
31
+ * operation this binding welds into, not a different flow.
32
+ * - Its only rule on the destination is "**Argument 1 (to)**: MUST equal `requirements.payTo` exactly". The
33
+ * scheme places **no format constraint on `payTo` anywhere**; its example happens to show a `G…` address,
34
+ * and an example is not a constraint. A seller advertising their `M…` address as `payTo` satisfies the
35
+ * rule by construction.
36
+ * - **CAP-67** (`stellar/stellar-protocol`, `core/cap-0067.md`) exists precisely to permit this: "Add memo
37
+ * support to Soroban by adding a `SC_ADDRESS_TYPE_MUXED_ACCOUNT` and allow the SAC to take in this type
38
+ * in the `transfer` function call."
39
+ *
40
+ * ⛔ **What IS limited, and it is narrower and different: CAP-67 extended the SAC, not Soroban generally.**
41
+ * The same CAP: "`MuxedAddressObject` … is not implicitly compatible with `AddressObject`. Thus the
42
+ * contracts that expect the regular `AddressObject` as an input argument **will fail** if
43
+ * `ScAddress::SC_ADDRESS_TYPE_MUXED_ACCOUNT` is passed to them." So the carrier depends on which contract
44
+ * the payment invokes:
45
+ *
46
+ * - the **SAC** — the built-in contract for a classic asset — accepts a muxed `to`, and the weld rides;
47
+ * - a **custom SEP-41 token contract** rejects it, and the invocation FAILS rather than degrading.
48
+ *
49
+ * A deployment therefore gets this carrier through x402 when, and only when, the scheme's `asset` is the
50
+ * SAC. `protocol` stays absent because that is a genuine statement of neutrality — the carrier serves bare
51
+ * Soroban and x402 alike — rather than, as the earlier text had it, because x402 could not reach it.
52
+ *
53
+ * ⚠️ **Two things deliberately NOT claimed here, because they were not verified.** Whether a given x402
54
+ * facilitator independently rejects an `M…` `payTo` (the scheme does not require it to), and CAP-67's
55
+ * activation status on any particular network. Both are deployment-time facts a seller must establish for
56
+ * themselves; asserting either from this file would be the kind of unmeasured claim the correction above
57
+ * exists to remove.
30
58
  */
31
59
  export declare const STELLAR_MANIFEST: BindingManifest;
32
60
  //# sourceMappingURL=manifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAkB9B,CAAC"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAkB9B,CAAC"}
package/dist/manifest.js CHANGED
@@ -15,17 +15,45 @@
15
15
  * `forwardIndexable: false` (no native index over mux prefixes; `enumerate` is a best-effort account scan,
16
16
  * `indexing: "account-scan:mux-prefix8"`). The prefix-8 truncation is stated in `finality.note` too.
17
17
  *
18
- * **NO `protocol`, and here is precisely what it is neutral OF.** This binding welds into the destination
19
- * of a CLASSIC Stellar payment. x402's `exact` scheme for Stellar (read 2026-08-08) is a different flow
20
- * entirely: "This spec covers SEP-41-compliant Soroban tokens **only**. Classic Stellar assets are not
21
- * supported", and the payment is an `invokeHostFunction` calling `transfer(from, to, amount)` where
22
- * "Argument 1 (to): MUST equal `requirements.payTo` exactly".
23
- *
24
- * A muxed destination cannot appear in that call there is no classic payment to mux, and an `M…` address
25
- * would not equal `payTo` exactly. So a deployment settling through an x402-Stellar facilitator does not
26
- * get this carrier. That is a scoping fact, not a defect: the binding has never declared `protocol`, and
27
- * the mux weld is correct on the rail it targets. Stated here so the absence is a measured claim rather
28
- * than an unexamined default.
18
+ * **NO `protocol`, and the reason is that the carrier genuinely works on both sides CORRECTED
19
+ * 2026-08-15.** An earlier revision of this paragraph said the opposite: that the binding welds into a
20
+ * CLASSIC Stellar payment, that x402's `exact` scheme for Stellar was "a different flow entirely", and
21
+ * that "a deployment settling through an x402-Stellar facilitator does not get this carrier". Every step of
22
+ * that was wrong, and it contradicted this same file — `finality.note` below says "Soroban SAC transfer",
23
+ * the paragraph above says the buyer signs the Soroban SAC `transfer`, and `adapter.ts` types the field it
24
+ * reads as "the `to` destination of the SAC transfer". There was never a classic payment here to mux.
25
+ *
26
+ * Re-read against the live sources on 2026-08-15:
27
+ *
28
+ * - **x402's `exact` scheme for Stellar** (`x402-foundation/x402` HEAD `167a828e8319`) is Soroban SEP-41
29
+ * token transfers — an `invokeHostFunction` calling `transfer(from, to, amount)`. That is the SAME
30
+ * operation this binding welds into, not a different flow.
31
+ * - Its only rule on the destination is "**Argument 1 (to)**: MUST equal `requirements.payTo` exactly". The
32
+ * scheme places **no format constraint on `payTo` anywhere**; its example happens to show a `G…` address,
33
+ * and an example is not a constraint. A seller advertising their `M…` address as `payTo` satisfies the
34
+ * rule by construction.
35
+ * - **CAP-67** (`stellar/stellar-protocol`, `core/cap-0067.md`) exists precisely to permit this: "Add memo
36
+ * support to Soroban by adding a `SC_ADDRESS_TYPE_MUXED_ACCOUNT` and allow the SAC to take in this type
37
+ * in the `transfer` function call."
38
+ *
39
+ * ⛔ **What IS limited, and it is narrower and different: CAP-67 extended the SAC, not Soroban generally.**
40
+ * The same CAP: "`MuxedAddressObject` … is not implicitly compatible with `AddressObject`. Thus the
41
+ * contracts that expect the regular `AddressObject` as an input argument **will fail** if
42
+ * `ScAddress::SC_ADDRESS_TYPE_MUXED_ACCOUNT` is passed to them." So the carrier depends on which contract
43
+ * the payment invokes:
44
+ *
45
+ * - the **SAC** — the built-in contract for a classic asset — accepts a muxed `to`, and the weld rides;
46
+ * - a **custom SEP-41 token contract** rejects it, and the invocation FAILS rather than degrading.
47
+ *
48
+ * A deployment therefore gets this carrier through x402 when, and only when, the scheme's `asset` is the
49
+ * SAC. `protocol` stays absent because that is a genuine statement of neutrality — the carrier serves bare
50
+ * Soroban and x402 alike — rather than, as the earlier text had it, because x402 could not reach it.
51
+ *
52
+ * ⚠️ **Two things deliberately NOT claimed here, because they were not verified.** Whether a given x402
53
+ * facilitator independently rejects an `M…` `payTo` (the scheme does not require it to), and CAP-67's
54
+ * activation status on any particular network. Both are deployment-time facts a seller must establish for
55
+ * themselves; asserting either from this file would be the kind of unmeasured claim the correction above
56
+ * exists to remove.
29
57
  */
30
58
  export const STELLAR_MANIFEST = {
31
59
  rail: "stellar",
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,cAAc;IAC3B,QAAQ,EAAE;QACR,OAAO,EAAE,IAAI;QACb,oBAAoB,EAAE,KAAK;QAC3B,gBAAgB,EAAE,KAAK;KACxB;IACD,YAAY,EAAE,MAAM,EAAE,2FAA2F;IACjH,WAAW,EAAE,WAAW,EAAE,wEAAwE;IAClG,QAAQ,EAAE,0BAA0B;IACpC,QAAQ,EAAE;QACR,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,0VAA0V;KACjW;IACD,UAAU,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;IACxC,eAAe,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;CACzC,CAAC"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,cAAc;IAC3B,QAAQ,EAAE;QACR,OAAO,EAAE,IAAI;QACb,oBAAoB,EAAE,KAAK;QAC3B,gBAAgB,EAAE,KAAK;KACxB;IACD,YAAY,EAAE,MAAM,EAAE,2FAA2F;IACjH,WAAW,EAAE,WAAW,EAAE,wEAAwE;IAClG,QAAQ,EAAE,0BAA0B;IACpC,QAAQ,EAAE;QACR,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,0VAA0V;KACjW;IACD,UAAU,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;IACxC,eAAe,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;CACzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integraledger/lcp-binding-stellar",
3
- "version": "0.9.0",
3
+ "version": "0.10.2",
4
4
  "description": "Welds an ATR hash into a Stellar payment.",
5
5
  "keywords": [
6
6
  "lcp",
@@ -42,8 +42,8 @@
42
42
  "homepage": "https://github.com/IntegraLedger/integra-protocol/tree/main/packages/binding-stellar#readme",
43
43
  "dependencies": {
44
44
  "@stellar/stellar-sdk": "16.2.0",
45
- "@integraledger/lcp-binding-core": "0.9.0",
46
- "@integraledger/lcp-kernel": "0.9.0"
45
+ "@integraledger/lcp-binding-core": "0.11.0",
46
+ "@integraledger/lcp-kernel": "0.11.0"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@types/json-schema": "7.0.15",
package/src/constants.ts CHANGED
@@ -70,5 +70,14 @@ export function getStellarConfig(
70
70
  return network === "testnet" ? TESTNET : PUBNET;
71
71
  }
72
72
 
73
- /** USDC on Stellar has 7 decimals — 1 USDC = 10_000_000 base units. */
74
- export const USDC_DECIMALS = 7;
73
+ /**
74
+ * USDC on Stellar has 7 decimals — 1 USDC = 10_000_000 base units.
75
+ *
76
+ * RAIL-QUALIFIED ON PURPOSE. Four bindings publish a USDC decimal count and they are NOT all the same —
77
+ * Stellar's is 7 where Hedera's, Solana's and Sui's are 6. A bare `USDC_DECIMALS` exported four times
78
+ * from four packages is one name with two meanings, and the way that fails is silent: a consumer who reads
79
+ * it from one rail and applies it on another is off by a factor of ten in an amount, at settlement rather
80
+ * than at compile time. Each value is correct for its own chain, which is why no per-package test can
81
+ * catch the clash; the prefix is what makes it impossible to import the wrong one by accident.
82
+ */
83
+ export const STELLAR_USDC_DECIMALS = 7;
package/src/index.ts CHANGED
@@ -15,10 +15,10 @@ export {
15
15
  MUX_ID_BYTES,
16
16
  MUX_SCHEME,
17
17
  PUBNET_PASSPHRASE,
18
+ STELLAR_USDC_DECIMALS,
18
19
  type StellarNetwork,
19
20
  type StellarNetworkConfig,
20
21
  TESTNET_PASSPHRASE,
21
- USDC_DECIMALS,
22
22
  } from "./constants.js";
23
23
  export { STELLAR_MANIFEST } from "./manifest.js";
24
24
  export {
package/src/manifest.ts CHANGED
@@ -17,17 +17,45 @@ import type { BindingManifest } from "@integraledger/lcp-binding-core";
17
17
  * `forwardIndexable: false` (no native index over mux prefixes; `enumerate` is a best-effort account scan,
18
18
  * `indexing: "account-scan:mux-prefix8"`). The prefix-8 truncation is stated in `finality.note` too.
19
19
  *
20
- * **NO `protocol`, and here is precisely what it is neutral OF.** This binding welds into the destination
21
- * of a CLASSIC Stellar payment. x402's `exact` scheme for Stellar (read 2026-08-08) is a different flow
22
- * entirely: "This spec covers SEP-41-compliant Soroban tokens **only**. Classic Stellar assets are not
23
- * supported", and the payment is an `invokeHostFunction` calling `transfer(from, to, amount)` where
24
- * "Argument 1 (to): MUST equal `requirements.payTo` exactly".
25
- *
26
- * A muxed destination cannot appear in that call there is no classic payment to mux, and an `M…` address
27
- * would not equal `payTo` exactly. So a deployment settling through an x402-Stellar facilitator does not
28
- * get this carrier. That is a scoping fact, not a defect: the binding has never declared `protocol`, and
29
- * the mux weld is correct on the rail it targets. Stated here so the absence is a measured claim rather
30
- * than an unexamined default.
20
+ * **NO `protocol`, and the reason is that the carrier genuinely works on both sides CORRECTED
21
+ * 2026-08-15.** An earlier revision of this paragraph said the opposite: that the binding welds into a
22
+ * CLASSIC Stellar payment, that x402's `exact` scheme for Stellar was "a different flow entirely", and
23
+ * that "a deployment settling through an x402-Stellar facilitator does not get this carrier". Every step of
24
+ * that was wrong, and it contradicted this same file — `finality.note` below says "Soroban SAC transfer",
25
+ * the paragraph above says the buyer signs the Soroban SAC `transfer`, and `adapter.ts` types the field it
26
+ * reads as "the `to` destination of the SAC transfer". There was never a classic payment here to mux.
27
+ *
28
+ * Re-read against the live sources on 2026-08-15:
29
+ *
30
+ * - **x402's `exact` scheme for Stellar** (`x402-foundation/x402` HEAD `167a828e8319`) is Soroban SEP-41
31
+ * token transfers — an `invokeHostFunction` calling `transfer(from, to, amount)`. That is the SAME
32
+ * operation this binding welds into, not a different flow.
33
+ * - Its only rule on the destination is "**Argument 1 (to)**: MUST equal `requirements.payTo` exactly". The
34
+ * scheme places **no format constraint on `payTo` anywhere**; its example happens to show a `G…` address,
35
+ * and an example is not a constraint. A seller advertising their `M…` address as `payTo` satisfies the
36
+ * rule by construction.
37
+ * - **CAP-67** (`stellar/stellar-protocol`, `core/cap-0067.md`) exists precisely to permit this: "Add memo
38
+ * support to Soroban by adding a `SC_ADDRESS_TYPE_MUXED_ACCOUNT` and allow the SAC to take in this type
39
+ * in the `transfer` function call."
40
+ *
41
+ * ⛔ **What IS limited, and it is narrower and different: CAP-67 extended the SAC, not Soroban generally.**
42
+ * The same CAP: "`MuxedAddressObject` … is not implicitly compatible with `AddressObject`. Thus the
43
+ * contracts that expect the regular `AddressObject` as an input argument **will fail** if
44
+ * `ScAddress::SC_ADDRESS_TYPE_MUXED_ACCOUNT` is passed to them." So the carrier depends on which contract
45
+ * the payment invokes:
46
+ *
47
+ * - the **SAC** — the built-in contract for a classic asset — accepts a muxed `to`, and the weld rides;
48
+ * - a **custom SEP-41 token contract** rejects it, and the invocation FAILS rather than degrading.
49
+ *
50
+ * A deployment therefore gets this carrier through x402 when, and only when, the scheme's `asset` is the
51
+ * SAC. `protocol` stays absent because that is a genuine statement of neutrality — the carrier serves bare
52
+ * Soroban and x402 alike — rather than, as the earlier text had it, because x402 could not reach it.
53
+ *
54
+ * ⚠️ **Two things deliberately NOT claimed here, because they were not verified.** Whether a given x402
55
+ * facilitator independently rejects an `M…` `payTo` (the scheme does not require it to), and CAP-67's
56
+ * activation status on any particular network. Both are deployment-time facts a seller must establish for
57
+ * themselves; asserting either from this file would be the kind of unmeasured claim the correction above
58
+ * exists to remove.
31
59
  */
32
60
  export const STELLAR_MANIFEST: BindingManifest = {
33
61
  rail: "stellar",