Skip to content

SDK Updates for Protocol 30 Compatibility #175

Open

Description

@Ryang-21

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:

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 its W... 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 W is allowed: only where M is, meaning MuxedAddress params such as the SAC transfer to. Reject W... as a contract to invoke, as an auth signer, in storage keys, and in balance lookups.
  • Events: SAC transfer/mint to a W... use the CAP-67 format: the to topic is the base C... and the data is { amount, to_muxed_id }. If you already handle M... 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.

Reference Implementations

Activity

  1. christian-rogobete commented on Oct 21, 2026

    @christian-rogobete
    Member

    Thank you for adding this issue. I will take care of it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions