Repository navigation
SDK Updates for Protocol 30 Compatibility #175
Description
Protocol 30: SDK Changes
XDR Changes
Upgrade to the stellar-xdr v30.0 release (4f524bb), the Protocol 30 XDR. All CAPs are ungated, so no preprocessing feature flags are needed. It covers:
- CAP-84: Muxed Contract Addresses: needs the changes below.
- CAP-88: Millisecond-Resolution Close Times: needs the changes below.
- CAP-87: ML-DSA Signature Verification: regenerate only. It adds
ContractCostTypevalues 86–94.
This range also includes stellar-xdr#312: contract spec UDT names go from string<60> to string<1024>, and SCSpecEventV0.name goes from SCSymbol to string<1024>. If a binding generator checks those limits, remove the checks.
CAP-88: Millisecond Close Times
StellarValue.ext gains STELLAR_VALUE_SIGNED_MS = 3 and STELLAR_VALUE_EMPTY_TX_SET_MS = 4, each adding a TimePointMs closeTimeMs field. Every ledger after the upgrade uses one of them, so without the new XDR you cannot decode ledger headers or LedgerCloseMeta (RPC getLedgers, Horizon header_xdr).
Treat the _MS arms like STELLAR_VALUE_SIGNED and STELLAR_VALUE_EMPTY_TX_SET. closeTime is unchanged (whole seconds, closeTimeMs / 1000), and all transaction time bounds stay in seconds, so nothing else changes.
CAP-84: Muxed Contract Addresses
SCAddress gains SC_ADDRESS_TYPE_MUXED_CONTRACT = 5 (MuxedContract { uint64 id; ContractID contractId; }), with a new W... strkey.
- Strkey: version byte
22 << 3(0xb0); payload is the 32-byte contract ID followed by the 8-byte big-endian ID. Follow SEP-23 and use itsW...test vectors. - Address type: convert arm 5 to and from
W...(including equality and SCVal-to-native). Without this, any return value or event holding a muxed contract fails to decode. - Where
Wis allowed: only whereMis, meaningMuxedAddressparams such as the SACtransferto. RejectW...as a contract to invoke, as an auth signer, in storage keys, and in balance lookups. - Events: SAC
transfer/mintto aW...use the CAP-67 format: thetotopic is the baseC...and the data is{ amount, to_muxed_id }. If you already handleM...destinations, nothing changes.
RPC API Changes
getEvents no longer returns inSuccessfulContractCall (stellar-rpc#1050). The removal ships in the same RPC release but is not part of a Protocol 30 CAP. Make the field optional or remove it from your event model, or parsing will fail.
Horizon API Changes
The contract_credited effect gains optional contract_muxed (the W... address) and contract_muxed_id (a decimal string, like account_muxed_id) fields when a SAC transfer or mint goes to a muxed contract (stellar-horizon#237). Add both as optional fields in your effect model.
Activity
christian-rogobete commentedon Oct 21, 2026
Thank you for adding this issue. I will take care of it.