Repository navigation
Release/6.0.0: Protocol 30 support - #261
Conversation
Bump @stellar/stellar-sdk from 17.0.1 to 17.4.0 in all three packages. 17.4.0 decodes and encodes CAP-84 muxed contract (W...) addresses, so a transaction that contains one decodes in Stellar.decodeTransaction, in the key manager's Albedo and Freighter handlers, and in the soroban helpers. On 17.0.1 decoding it threw "unknown enum value 5". Tests: - core: decodeTransaction decodes a SAC transfer to a W address, and the classic transfer, pathPay and accountMerge builders keep refusing a W destination - soroban: scValByType renders all six ScAddress variants, and the exact W for mux IDs 0 and 2^64 - 1; getTokenInvocationArgs returns a W as `to` for a transfer and for a mint; scValByType throws on a map whose keys collide, as scValToNative does since stellar-sdk 17.3 - km: the Albedo and Freighter handlers return the signed transaction with its W recipient intact Docs: the soroban README and ArgsForTokenInvocation say `to` can be a W address, and scValByType documents the collision TypeError. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
isValidSep7Uri and parseSep7Uri accept a muxed contract (W...) address as a `pay` destination, and a `tx` uri whose transaction contains one. A contract (C...) or W destination can only be paid with a Stellar Asset Contract transfer. That is a Soroban transaction, and the network rejects a Soroban transaction that has a memo, so a wallet could only drop the memo. A `pay` uri with a C or W destination and a memo is now invalid. Before, a C destination with a memo was accepted. G and M destinations keep accepting a memo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since stellar-sdk 17.3, stellar.toml and federation responses are read
with TextDecoder("utf-8", { fatal: true }), which some React Native
TextDecoders, such as fast-text-encoding, can't build. The Hermes-like
sandbox now checks that every bundle still loads with such a decoder,
and that verifying a SEP-7 signature needs one that can decode strictly.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bump all three packages to 6.0.0 and add their changelog sections. A major release because of three breaking changes: on React Native, reading a stellar.toml needs a TextDecoder that supports `fatal` (from stellar-sdk 17.3); a SEP-7 `pay` uri with a C destination and a memo is now rejected; and scValByType throws on a map whose keys collide. The key manager has no breaking changes and moves to 6.0.0 to stay in lockstep. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
There was a problem hiding this comment.
🟢 Approval recommended
No active review issues remain; the remaining notes are limited to a moderate test-coverage suggestion and a changelog nit.
No open issues 🎉
What changed in this PR
This pull request releases all three wallet SDK packages as 6.0.0 with Protocol 30/CAP-84 muxed contract (W…) address support through @stellar/stellar-sdk 17.4.0.
Changes:
- Upgrades package versions, Stellar SDK dependencies, and lockfile resolutions.
- Adds
W…support to SEP-7, transaction decoding, Soroban helpers, and key-manager signing flows. - Rejects memos for contract and muxed-contract payment destinations.
- Documents and tests React Native
TextDecoderrequirements, Soroban map-key collisions, and muxed-contract behavior.
Review notes:
- Moderate: The React Native e2e test should also cover
Anchor.sep1()with strict and non-strictTextDecoderbehavior. - Nit: The key-manager changelog should describe
KeyManager.fetchAuthTokeninput rejection as a breaking change.
| File | Description |
|---|---|
yarn.lock |
Updates Stellar SDK and transitive dependency resolutions. |
@stellar/typescript-wallet-sdk/test/transaction.test.ts |
Verifies classic operations reject W… destinations. |
@stellar/typescript-wallet-sdk/test/stellar.test.ts |
Tests decoding and re-encoding transactions containing W… addresses. |
@stellar/typescript-wallet-sdk/test/sep7.test.ts |
Tests SEP-7 W… destinations and contract memo rejection. |
@stellar/typescript-wallet-sdk/test/fixtures/muxedContract.ts |
Adds shared muxed-contract address and transaction fixtures. |
@stellar/typescript-wallet-sdk/test/e2e/reactNative.test.ts |
Tests React Native bundle and strict TextDecoder behavior. |
@stellar/typescript-wallet-sdk/src/walletSdk/Uri/Sep7Pay.ts |
Documents contract and muxed-contract payment constraints. |
@stellar/typescript-wallet-sdk/src/walletSdk/Uri/sep7Parser.ts |
Accepts W… pay destinations and rejects contract memos. |
@stellar/typescript-wallet-sdk/package.json |
Bumps the core package and Stellar SDK versions. |
@stellar/typescript-wallet-sdk/CHANGELOG.MD |
Documents 6.0.0 changes and breaking behavior. |
@stellar/typescript-wallet-sdk-soroban/test/helpers.test.ts |
Adds W… token invocation, rendering, and collision tests. |
@stellar/typescript-wallet-sdk-soroban/src/Types/index.ts |
Documents muxed-contract recipients in token invocation results. |
@stellar/typescript-wallet-sdk-soroban/src/Helpers/scValByType.ts |
Documents muxed-address rendering and map-collision errors. |
@stellar/typescript-wallet-sdk-soroban/README.md |
Documents W… recipients and address rendering. |
@stellar/typescript-wallet-sdk-soroban/package.json |
Bumps the Soroban package and Stellar SDK versions. |
@stellar/typescript-wallet-sdk-soroban/CHANGELOG.MD |
Documents Soroban 6.0.0 changes. |
@stellar/typescript-wallet-sdk-km/test/freighter.test.ts |
Verifies Freighter preserves W… recipients when signing. |
@stellar/typescript-wallet-sdk-km/test/fixtures/muxedContract.ts |
Adds key-manager muxed-contract transaction fixtures. |
@stellar/typescript-wallet-sdk-km/test/albedo.test.ts |
Verifies Albedo preserves W… recipients when signing. |
@stellar/typescript-wallet-sdk-km/package.json |
Bumps the key-manager package and Stellar SDK versions. |
@stellar/typescript-wallet-sdk-km/CHANGELOG.MD |
Documents key-manager 6.0.0 changes. |
Review effort: Lite
Testnet runs Protocol 30 since ledger 5540313, so a W address can now go on chain. The test builds a native SAC transfer to a W with the SDK's builder, prepares it with RPC and passes it through a SEP-7 tx uri. The wallet side signs it and submits it with submitTransaction, then decodes the envelope Horizon recorded and checks the W. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tive The changelog's React Native breaking change says Anchor.sep1() rejects where TextDecoder can't decode strictly, but only verifySignature() had a sandbox test. The new test reads a stub stellar.toml through Wallet.anchor().sep1() with each decoder. On the 5.1.0 bundle (stellar-sdk 17.0.1), sep1() resolves with the non-strict decoder, so the test fails there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
stellar-sdk 17.3's WebAuth.readChallengeTx rejects a challenge whose client_domain operation has no source account or uses the server account. Sep10.authenticate, Server.signChallengeTransaction and KeyManager.fetchAuthToken validate challenges with it, and 5.1.0 accepted such a challenge. Each test checks the error. The Sep10 and key manager tests also check that the client domain signer wasn't asked to sign and nothing was posted back. With the two checks removed from stellar-sdk, all six cases fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
KeyManager.fetchAuthToken, Sep10.authenticate and Server.signChallengeTransaction reject a challenge that 5.1.0 accepted, so the entry moves from Changed to BREAKING CHANGES in the core and key manager changelogs. The key manager no longer says it has no breaking changes. The core's React Native entry now says each of its two claims has a sandbox test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🔵 Needs a closer look
Human release verification is warranted because the change combines a pinned external SDK upgrade with live testnet, Hermes/browser integration, and downstream bundler compatibility behavior that static review cannot independently validate.
No open issues 🎉
Review effort: Lite
parseSep7Uri rejects a pay URI that has a memo and a contract (C) or muxed contract (W) destination, but Sep7Pay could still build one. Its constructor and its destination and memo setters now throw Sep7ContractMemoError, so the call that creates that combination fails and leaves the URI unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both tests funded two accounts with friendbot one after the other, and a single friendbot call has been taking 13 to 26 seconds, while ledgers still close every 5 seconds. That alone used up most of their 30 and 45 second limits. They now fund both accounts in parallel and allow 90 seconds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Its beforeAll funded two accounts with friendbot one after the other within 30 seconds, and a single friendbot call has been taking 15 to 26 seconds, so the hook timed out and failed all four tests. Friendbot serves parallel calls at the same time, so the hook now funds both accounts in parallel and allows 90 seconds, like the account-modifying tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The SEP-10 header-token test, the SEP-6 setup and the account service setup each fund a new account with friendbot and then do more testnet work, all within 30 seconds. A single friendbot call has been taking 15 to 26 seconds, which timed out the SEP-10 test on CI and, in October, the SEP-6 setup. They now allow 90 seconds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The recovery integration test creates three new accounts, so it always funded them with friendbot one after the other before doing anything else, within 60 seconds. A single friendbot call has been taking 15 to 26 seconds, and the test timed out on CI. It now funds them in parallel and allows 120 seconds. The anchor platform setup makes one friendbot call within 30 seconds, so it now allows 90 seconds too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TL;DR
Adds Protocol 30 support and releases it as 6.0.0. All three packages move to
@stellar/stellar-sdk17.4.0, which understands CAP-84 muxed contract (W…) addresses. SEP-7 now accepts aWas apaydestination, and apayto aCorWcan no longer carry a memo, since the Soroban transaction that pays it can't have one.It's a major release because of four breaking changes: React Native apps that read an anchor's
stellar.tomlneed aTextDecoderthat supportsfatal, aCdestination with a memo is now rejected, SEP-10 sign-in rejects a challenge whoseclient_domainoperation has no source account or uses the server account as its source, andscValByTypethrows on a map whose keys collide.Closes stellar/wallet-eng-monorepo#112
Implementation details (for agents)
Every link below is a permalink at
4539a59fffb4ba63cbf4ecd1f47ae8503bb8ee7d.Commits
60bf978feat: support Protocol 30 muxed contract (W) addresses. The SDK bump,Wtests in all three packages, and the soroban docs.a74bfeefeat(sep7): accept W pay destinations, and refuse a memo for C and W.9bd8bcftest(e2e): check stellar-sdk's strict TextDecoder on React Native.c198fbcRelease 6.0.0. Versions and changelogs: core, key manager, soroban.7b0ee79test(sep7): submit a transfer to a W address from a tx uri on testnet.b927f55test(e2e): check Anchor.sep1() needs a strict TextDecoder on React Native.b7ed127test: pin the client_domain source checks on SEP-10 challenges.62d1e68docs(changelog): list the client_domain challenge rejection as breaking.4539a59feat(sep7): make Sep7Pay throw on a memo with a C or W destination.SDK bump
@stellar/stellar-sdkgoes from 17.0.1 to 17.4.0, still an exact pin, in all threepackage.jsonfiles. The lockfile also moves stellar-sdk's pinnedaxiosfrom 1.18.0 to 1.20.0 andform-datafrom 4.0.5 to 4.0.6, and addshasown2.0.4. 17.4.0 is the latest release. Decoding needed no source change, because everyScAddressgoes throughAddress.fromScAddress.SEP-7
typescript-wallet-sdk/@stellar/typescript-wallet-sdk/src/walletSdk/Uri/sep7Parser.ts
Lines 80 to 110 in 4539a59
Wdestination is accepted, checked withStrKey.isValidMuxedContractnext to the G, M and C checks.memois rejected when the destination is a C or W. Since Protocol 25, stellar-core fails a single-operationInvokeHostFunctiontransaction that has a memo withtxSOROBAN_INVALID(validateSorobanMemo, where it's applied). Testnet, now on Protocol 30, rejects a memo on a transfer to a C or a W withtx_soroban_invalid. A classic payment can't target a contract, so such a URI can't be paid as written.Sep7Paywon't build such a URI either. Its constructor and itsdestinationandmemosetters throwSep7ContractMemoErrorand leave the URI unchanged, so whichever call creates the combination is the one that throws. The core changelog lists it in the same breaking entry.memo=counts as no memo, as it does forSep7Pay.memo.Tests
Every
Wvalue in the fixtures was cross-checked with an independent strkey encoder against the SEP-23 test vector. The transfer fixture'sWargument also has the same bytes as the one testnet recorded for a real transfer to thatW.decodeTransactiontxvalidation andgetTransactiongetTokenInvocationArgsreturns theWastofor a transfer and a mintscValByTyperenders all sixScAddressvariants, and the exactWfor mux IDs 0 and 2^64 − 1scValByTypethrows on colliding map keysSep7Pay's constructor and setters, which throw for C and W, build a URI that parses once the memo is cleared, and still take a memo for G and M.transfer,pathPayandaccountMergekeep rejecting aW.txflow for a native SAC transfer to aW. The SDK's builder makes the transfer, RPC prepares it, and it goes through atxURI. The wallet side signs it, submits it withsubmitTransaction, and decodes the envelope Horizon recorded, which still pays theW. The rest of theWcoverage is unit-level.Wfailed on 17.0.1 withXdrError … unknown enum value 5, "Unsupported address type", or theWrejected as invalid, and they pass on 17.4.0. Two mutations of the memo rule, checkingmemo_typeinstead ofmemoand removing the rule, each make memo tests fail. TheSep7Paytests failed with "did not throw" before its check was added. MakingSep7Tx.getTransactionignore the URI's network passphrase makes the testnet test fail with a 400 from Horizon. On the 5.1.0 bundle the React NativeAnchor.sep1()test fails, and with stellar-sdk's twoclient_domainchecks removed, all six SEP-10 cases fail.React Native, the core package's breaking change
stellar-sdk 17.3 and later decodes
stellar.tomland federation responses withnew TextDecoder("utf-8", { fatal: true }), which it builds lazily in its bounded fetch.fast-text-encoding, a common React NativeTextDecoder, throws forfatal. So with it,Anchor.sep1()rejects and SEP-7verifySignature()returnsfalse. The same check returnstrueon the 17.0.x build onmain, and the bundles still load with such a decoder. Jest runs on Node, whoseTextDecodersupportsfatal, so this only shows up on a device or in a sandbox like the one below. ATextDecoderpolyfill that can decode strictly fixes it.The Hermes-like sandbox tests now pin both behaviors:
stellar.tomlwithAnchor.sep1()SEP-10
client_domainchecksstellar-sdk 17.3's
WebAuth.readChallengeTxrejects a challenge whoseclient_domainoperation has no source account or uses the server account as its source. SEP-10 requires that source to be the client domain's signing key.Sep10.authenticate,Server.signChallengeTransactionandKeyManager.fetchAuthTokenvalidate challenges with it, so 6.0.0 rejects a challenge that 5.1.0 accepted. The core and key manager changelogs list it as breaking. A test pins it for each, checking the error and, in the two sign-in flows, that nothing was signed or posted:Sep10.authenticateServer.signChallengeTransactionKeyManager.fetchAuthTokenVerification
Run at
4539a59, with testnet on Protocol 30 (since ledger 5540313 on 2026-11-03):yarn build: all 6 bundles compileyarn test:ci: 401 passed, 5 skipped. Six testnet tests instellar.test.ts(SponsoringBuilderandAccount Modifying) timed out while testnet was slow and passed when re-run.test:e2e:ci reactNative): 13 of 13 passedeslint . --ext .ts --max-warnings 0and Prettier on every.tsfile: cleantscon the source of all three packages: clean. The test tsconfigs show the same 10 errors asmain.Out of scope
TransactionBuilderoperations keep rejectingW, as stellar/wallet-eng-monorepo#112 says.W-specific changes.🤖 Generated with Claude Code