@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 +58 -0
- package/dist/constants.d.ts +11 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +11 -2
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +39 -11
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +39 -11
- package/dist/manifest.js.map +1 -1
- package/package.json +3 -3
- package/src/constants.ts +11 -2
- package/src/index.ts +1 -1
- package/src/manifest.ts +39 -11
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.
|
package/dist/constants.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
46
|
-
|
|
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
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
-
/**
|
|
45
|
-
|
|
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
|
package/dist/constants.js.map
CHANGED
|
@@ -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
|
|
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,
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/manifest.d.ts
CHANGED
|
@@ -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
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
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
|
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,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE
|
|
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
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
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",
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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.
|
|
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.
|
|
46
|
-
"@integraledger/lcp-kernel": "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
|
-
/**
|
|
74
|
-
|
|
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
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
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",
|