Releases: stellar/js-stellar-sdk
v16.0.0-rc.1
v16.0.0-rc.1: Protocol 27
There are a few major updates in this release detailed in the migration guide:
- JS Stellar Base (
@stellar/stellar-base) was rewritten
in TypeScript, which provides proper type definitions and fixes
inconsistencies caused by manual type declarations. ([#1399]) - JS Stellar Base is now merged into the JS Stellar SDK. Everything lives in one
place now. ([#1399]) - The JS SDK now has better tree-shaking, which should result in a lighter
bundle size. ([#1397]) - Protocol 27 support: the XDR was regenerated for CAP-71, and the Soroban
authorization helpers now build and sign the new address-bound
(SOROBAN_CREDENTIALS_ADDRESS_V2) and delegated
(SOROBAN_CREDENTIALS_ADDRESS_WITH_DELEGATES) credential types. ([#1429])
1. Breaking Changes
These break code, builds, or installs until you change something.
Install & runtime
-
Drop
@stellar/stellar-basefrom your dependencies if you were importing
it manually. It is now bundled into@stellar/stellar-sdk. Remove the package
and switch all imports from@stellar/stellar-baseto@stellar/stellar-sdk.
([#1399]) -
Upgrade to Node 22 or later.
engines.nodeis now>=22.0.0; CI tests
against[22, 24]. ([#1408]) -
Stop using the default import.
import StellarBase from '@stellar/stellar-sdk'no longer works. Useimport * as StellarBaseor named imports. ([#1396]) -
Adjust deep
lib/imports. Library output paths moved:- ESM at
lib/esm/, - CJS at
lib/cjs/, - axios variants at
lib/axios/esm/andlib/axios/cjs/, - type declarations alongside the ESM output at
lib/esm/(e.g.lib/esm/index.d.ts).
The
dist/UMD bundle filenames are unchanged. ([#1397]) - ESM at
-
The package.json
browserfield and browser export conditions were
removed. Bundlers no longer auto-substitute the prebuilt UMD bundle for the
package entry — they bundle the ESM/CJS source directly. Load the UMD build
from its explicitdist/path if you need it. ([#1396], [#1397])
HTTP client
- Default HTTP client switched from axios to fetch. If you rely on axios
behavior (interceptors, adapters, regression fallback), import from the
alternative entry point@stellar/stellar-sdk/axiosinstead. ([#1394]) - The
no-eventsourcebuild variant is gone.eventsourcewas upgraded to
v4, which usesfetchinternally and works in every supported runtime (Node
22+, browsers, Deno, Bun,workerd). Remove anyno-eventsource
build/import; the default build covers all environments. ([#1395]) - The
/no-axiosand/minimalsubpath exports are removed, along with
their/contractand/rpcvariants. Axios is now opt-in through the@stellar/stellar-sdk/axiosfamily (/axios,/axios/contract,/axios/rpc, and@stellar/stellar-sdk/http-client/axios); the minimal build
no longer exists. ([#1394]) Horizon.Server.serverURLandrpc.Server.serverURLare now nativeURL
objects (andreadonly) instead ofurijsURIinstances. Code that called
urijs methods on them (server.serverURL.protocol(),.clone(),.segment(),.query()) must move to the WHATWGURLAPI (e.g.serverURL.protocol === "https:",serverURL.hostname). ([#1402])
Transaction & TransactionBuilder
-
Transaction.minAccountSequenceAgeis nowbigint. The underlying XDR
type is 64-bit; consuming code must switch fromnumberto nativebigint
(the runtime value is no longer anxdr.UnsignedHyperobject either). ([#1399]) -
TransactionBuilder.setMinAccountSequenceAgerequiresbigint. Pass60ninstead of60.TransactionBuilderOptions.minAccountSequenceAgeis
alsobigint. ([#1399]) -
Transaction.extraSignersis nowxdr.SignerKey[]. It always was at
runtime — only the type was wrong. UseSignerKey.encodeSignerKey()to get
StrKey strings. ([#1399]) -
Transactionis no longer generic. Remove<TMemo, TOps>parameters
(e.g.,Transaction<Memo<MemoType.Text>>no longer compiles). ([#1399]) -
Operation.isValidAmount(),Operation.constructAmountRequirementsError(),
andOperation.setSourceAccount()are no longer on the runtimeOperation
class. JavaScript callers that reached for these need to drop them — they
remain only as internal helpers insrc/base/util/operations.ts. ([#1399]) -
Revoke-sponsorship operation
typeis split into seven strings."revokeSponsorship"is replaced by"revokeAccountSponsorship","revokeTrustlineSponsorship","revokeOfferSponsorship","revokeDataSponsorship","revokeClaimableBalanceSponsorship","revokeLiquidityPoolSponsorship","revokeSignerSponsorship". The runtime
always returned the specific strings; consumers that switched ontypeshould
update their cases. ([#1399])
Asset, Keypair, signing helpers
Asset.codeandAsset.issuerare nowreadonly. Stop mutating them in
place — construct a newAssetinstead. ([#1399])Asset.issueris typed asstring | undefined. Native assets have no
issuer; add nullish checks. ([#1399])FastSigningconstant removed. Signing now goes through@noble/ed25519exclusively — drop the import. ([#1401])TransactionIremoved. UseTransactionBaseinstead. ([#1399])authorizeInvocation()takes a single object parameter. Switch fromauthorizeInvocation(signer, validUntilLedgerSeq, invocation, publicKey, networkPassphrase)
toauthorizeInvocation({ signer, validUntilLedgerSeq, invocation, networkPassphrase, publicKey }).
([#1399])authorizeEntry()no longer defaultsnetworkPassphrasetoNetworks.FUTURENET. Pass the network passphrase explicitly at every call
site. ([#1399])
2. Should know (type-only or behavior changes that may surface)
Won't fail at install. May fail at compile time, or change behavior at runtime,
depending on how you use the API.
TypeScript-only
CreateInvocation.tokenrenamed toCreateInvocation.assetin the type
declarations — runtime was already.asset. ([#1399])ScIntTypeadds'timepoint'and'duration'. Exhaustive switches onScIntTypeneed new cases. ([#1399])XdrLargeInt.getType()returnsScIntType | undefinedinstead of a raw
lowercased string; non-integer types yieldundefined. ([#1399])SorobanDataBuilder.fromXDRreturn type corrected toxdr.SorobanTransactionData. Runtime always returned this — only the type was
wrong. ([#1399])SetOptions.clearFlags/setFlagsaccept arbitrary numeric bitmasks.
The type was widened fromAuthFlagtoAuthFlags(AuthFlag | (number & {})),
so you can now pass combined flag values without a cast. This is a widening —
existing code keeps compiling. ([#1399])supportMuxingparameter removed fromdecodeAddressToMuxedAccount/encodeMuxedAccountToAddresstype declarations. It was silently ignored at
runtime. ([#1399])
Runtime behavior
Keypair.rawSecretKey()throws on public-key-only instances withError("no secret seed available")instead of returningundefined. ([#1399])TransactionBase.txreturns a defensive copy. External mutation no longer
affects the transaction that will be signed or serialized. If you were
intentionally mutatingtx, you'll need a different approach. ([#1399])TransactionBuilderconstructor preserves0nforminAccountSequenceAgeinstead of coercing falsy values tonull. This may
fliphasV2Preconditions()totruewhen the field is set to0n. ([#1399])toXDRPricerejects more bad input earlier. Zero/negative/NaN/Infinitynumeric prices now throw"price must be positive"before reachingbest_r(). Zero denominators also rejected (d <= 0). ([#1399])- Constructor and input validation now throw where the SDK was previously
lenient.MuxedAccountvalidates uint64 IDs;Claimantrejects falsy
destinations;AccountrejectsNaNsequences;Memois fully immutable and
throws on invalid types instead of returningnull;Memo.id()rejects
non-plain-digit strings;allow_trustthrows whenauthorizeis missing;setTrustLineFlagsrejects non-boolean flag values;Asset.getAssetType()
throws for unknown types instead of returning"unknown". (set_optionsalso
no longer mutates the caller's signer fields.) ([#1399]) TransactionBuildernow validates and throws.build()throws on
total-fee overflow pastuint32max;cloneFrom()throws on zero-operation
inputs; the constructor rejects negative or invertedtimebounds/ledgerbounds. ([#1399])Operation.setOptions()rejects malformed numeric strings. Flag, weight,
and threshold fields (setFlags,clearFlags,masterWeight, the signer
weight, and the*Thresholdoptions) now reject values like"123abc"thatparseFloat()previously accepted by reading only the leading digits. ([#1399])XdrLargeInt/ScIntbuilt from an array of limbs now decode correctly.
Passing multiple big-endian integer parts (fori128/u128/i256/u256)
previously wrapped them in a nested array and produced wrong values; the limbs
are now passed through correctly. ([#1399])- Large-integer conversions reject out-of-range / malformed input.
nativeToScValbounds-checksu32/i32values and rejects non-numeric
strings like"123abc";XdrLargeInt.toI128()/toI256()reject unsigned
values exceeding the signed range instead of silently flipping the sign bit.
([#1399]) - **
bignumber.jsupgraded to v11; v9'sDEBUGguar...
v15.1.0
v15.1.0
Fixed
- Security:
FederationServer.createForDomainand theFederationServerconstructor now validate domains per RFC 1035, rejecting malformed domains before issuing federation orstellar.tomlrequests. Port numbers are also accepted (#1393). RpcServer.pollTransactionoff-by-one: the polling loop used<instead of<=, causing one fewer attempt than configured(#1373).requestAirdroperror path: fixed incorrect property access (error.response.detailinstead oferror.response.data.detail) when checking forcreateAccountAlreadyExist(#1373).Spec.typeRefnow properly handlesscSpecTypeResultby returning the JSON schema for theokType, instead of silently breaking out of the switch (#1373).structToJsonSchemanow placesadditionalProperties: falseon the schema object itself rather than incorrectly nesting it insideproperties(#1373).- Fixed bigint-to-U32/I32 conversion in
SpecusingNumber(val)instead ofval as number(a no-op for bigints) (#1373). - WASM custom section parser: when a section was skipped (invalid name length), the offset was not advanced, causing an infinite loop or incorrect parsing of subsequent sections (#1373).
FederationServerURL mutation:resolveAddress,resolveAccountId, andresolveTransactionIdmutated the sharedserverURLby appending query params on each call. Fixed by cloning the URL before modifying (#1373).CallBuilder.stream()URL mutation:stream()mutated the sharedthis.urlby adding query params, corrupting the builder for subsequent calls. Fixed by cloning the URL (#1373).AssembledTransactionrestore path: whenbuildWithOpwas used and automatic state restoration was needed, the rebuild incorrectly reconstructed the operation viacontract.call()instead of reusing the original operation (#1373).SERVER_TIME_MAPport collision: the Horizon time-sync cache keyed entries by hostname only, so two servers on different ports of the same host shared a cache entry. Fixed by including the port in the key (#1373).Spec.funcResToNativenow correctly returns anErrinstance when a contract function with aResultreturn type returns an error, instead of throwing while decoding it as theOktype (#1373).- SEP-10:
verifyChallengeTxSignersnow rejects challenges signed only by the server andclient_domainkey with no actual client signer, instead of returning an empty signers list (#1372). getAssetBalanceused incorrect flag bitmask constants (AuthRequiredFlag,AuthRevocableFlag,AuthClawbackEnabledFlag) which are account-level flags, not trustline-level flags. Replaced with the correct trustline flag bitmasks (0x1,0x2,0x4) (#1372).AssembledTransaction.simulatedid not clearthis.builtbefore re-simulating after a state restoration rebuild, causing it to assemble stale transaction data (#1372).AssembledTransaction.signAndSendmutated the sharedthis.options.submitflag to prevent double submission. Replaced with a wrapper aroundsignTransactionthat injectssubmit: falsewithout mutating shared state (#1372).- Fetch HTTP client: async request interceptors were not awaited — the synchronous
try/catchloop passed unresolved promise objects as the config. Replaced with a proper.then()chain matching Axios interceptor semantics (#1372). - Fetch HTTP client: cancellation now preserves custom cancel reasons and
isCancelno longer depends on exact error-message text (#1390). - Fetch HTTP client: instance default headers and params now merge correctly with per-request overrides on the no-axios / minimal builds, including requests that use bounded options (#1390).
- Fetch HTTP client:
maxRedirectsandmaxContentLengthwere silently ignored on the no-axios / minimal builds, turning SDK-set SSRF and DoS guards (StellarToml.Resolver.resolve,FederationServer) into no-ops. A new bounded adapter activates when either option is set, refusing redirects pastmaxRedirectsand streaming the response body with a running-total check so oversized responses abort mid-stream (#1390). - Fetch HTTP client: the no-axios bounded path now more closely matches Axios behavior for object request bodies,
baseURL, timeout errors, redirect method/body handling, and stripping credential-bearing headers on cross-origin redirects (#1390). src/bindings/config.tsimported../../package.jsonwith a relative path that resolved incorrectly for thelib/no-axios/andlib/minimal/build outputs, making those libs unloadable. Replaced with the__PACKAGE_VERSION__compile-time define (#1390).- Updated the production
axiosdependency from1.14.0to1.15.0(#1381).
Added
AccountResponseconstructor now uses explicit field-by-field assignment instead ofObject.entriesdynamic assignment for type safety (#1373).- Added
transactionscollection toApi.AccountRecordandAccountResponse(#1373). - Added range checks for U32/I32 values in
Spec: bigint values are now validated against min/max bounds before conversion, throwing aRangeErrorinstead of silently truncating (#1373). rpc.Server.getLatestLedger()now includescloseTime,headerXdr, andmetadataXdrin the typed response, withheaderXdr/metadataXdrparsed into XDR objects instead of raw base64 strings (#1389).
Deprecated
BalanceResponse.revocableis deprecated in favor ofauthorizedToMaintainLiabilities, which correctly reflects the trustline flag semantics (#1372).
Full Changelog: v15.0.1...v15.1.0
v15.0.1: Protocol 26
v15.0.1: Protocol 26
Breaking Changes
- XDR has been upgraded to support Protocol 26, please refer to the
@stellar/stellar-baserelease notes for details and other breaking changes.
Fixed
- Sanitize identifiers and escape string literals in generated TypeScript bindings to prevent code injection via malicious contract spec names.
sanitizeIdentifiernow strips non-identifier characters, and a newescapeStringLiteralhelper escapes quotes and newlines in string contexts (#1345). AssembledTransaction.fromXDR()andfromJSON()now validate that the deserialized transaction targets the expected contract, rejecting mismatched contract IDs and non-invokeContract operations. (#1349).- Pin exact version on axios dependency (#1365)
Contributors
Full Changelog: v14.6.1...v15.0.1
v14.6.1
v14.6.1
Fixed
- Fix
assembleTransactiondouble-counting the resource fee when the input transaction already has Soroban data attached (e.g. when re-assembling a previously simulated transaction) (#1343). - Removed adding
resourceFeeinrpc.assembleTransactionas it's now handled byTransactionBuilder.build()(#1343).
Full Changelog: v14.6.0...v14.6.1
v14.6.0
v14.6.0
Added
- Upgraded underlying
@stellar/stellar-baselibrary to include its new features and fixes (release notes).
Full Changelog: v14.5.0...v14.6.0
v14.5.0
v14.5.0
Added
- Introduced CLI functionality for generating smart contract bindings (#1287).
- Added
BindingGenerationclass for parsing contract specs into fully typed TypeScript libraries for calling contract methods (#1287). - Introduced
rpc.Server.fundAddressthat supports funding contract and account addresses via Friendbot (#1314). - Updated the
StellarTomlinterface with SEP 45 fieldsWEB_AUTH_FOR_CONTRACTS_ENDPOINTandWEB_AUTH_CONTRACT_ID(#1326).
Fixed
- X-App-Name and X-App-Version headers are now included when using
CallBuilder.stream()(#1317). CallBuildernow correctly uses the configured server URL for all requests, including pagination and linked resources. Previously, URLs returned by Horizon in_linkswould bypass reverse proxies (#1318).
Deprecated
rpc.Server.requestAirdropis deprecated in favor ofrpc.Server.fundAddress(#1314).
Contributors
@ElliotFriend, @leighmcculloch, @Ryang-21, @wpalmeri made their first contribution in #1321, and @joaquinsoza made their first contribution in #1314
Full Changelog: v14.4.3...v14.5.0
v14.4.3
v14.4.2
v14.4.1
v14.4.0
v14.4.0
Added
- Introduced an
rpc.Server.getAssetBalance()helper to fetch asset balances both for contracts and accounts (#1286). rpc.Api.BalanceResponsenow can include arevocablefield in itsbalanceEntryfor when trustlines are fetched (#1286).- Added Timepoint and Duration support to
Spec(#1288) Api.GetHealthResponseinterface now includeslatestLedger,ledgerRetentionWindow, andoldestLedgerfields (#1297).- Added
publicKey,signTransaction, andsignAuthEntryas optional fields tocontract.MethodOptions(#1293).
Fixed
Api.RawEventResponse.topicsis now optional to reflect topicless events (#1292).parseRawEventscorrectly checks ifApi.RawEventResponse.topicsis undefined (#1292).- Remove
WebAssemblyusage in favor of manual wasm parsing (#1300). - Fixed URL contamination in
Horizon.Servermethods (#1296).
Contributors
- @chadoh, @corymsmith, @Shaptic, @Ryang-2, @mootz12 made their first contribution in #1288
Full Changelog: v14.3.3...v14.4.0