v31.0.0-beta.1
Pre-release
Pre-release
31.0.0-beta.1 (2026-08-10)
Bug Fixes
- 🐛 correct protocol fee mapping against v8 runtime (69ec025)
- 🐛 correct transaction tags against chain v8 metadata (e77224d)
- 🐛 declare the transactions procedures actually submit (672fcfd)
- 🐛 only require the DID Registrar role to issue a CDD claim (78abd14)
- 🐛 protocol fees no longer silently reported as zero (e30e51d)
- 🐛 report transfer failures instead of throwing (50fb337)
- 🐛 staking.getPayee returns null for an Account with no payee (4a8effc)
Features
- 🎸 align TransferError with the chain's transfer errors (52f1364)
- 🎸 Drop v7 support (4292be3)
- 🎸 rebuild transaction groups from the chain's permission model (b6cb8e5)
- 🎸 remove CDD transfer errors that cannot occur on v8 (10114e3)
BREAKING CHANGES
- 🧨 - Removed the
TransferStatusenum and its sole
produceru8ToTransferStatus.TransferError— the enum actually
populated, bySettlements.canTransfer— keeps its role, and its members'
doc comments no longer refer toTransferStatusequivalents.
- Removed
TransferError.InvalidReceiverPortfolio. Its sole producer was
thegranularCanTransferResultToTransferBreakdowncascade deleted with v7
support, and it cannot be re-mapped: theportfoliopallet has a single
PortfolioDoesNotExistvariant, already mapped toInvalidSenderPortfolio. - Added
TransferError.InvalidReceiverIdentityfor a receiving Identity
that is not active. Both transfer-validation paths report this condition
(nft.InvalidNFTTransferInvalidReceiverDIDand
asset.InvalidTransferInvalidReceiverDID) and neither was mapped, so it
previously surfaced as a raw chain error name. - Removed the
transfersCanTransfermock option intestUtils, typed
against a return typecanTransferno longer has. - See
changelogs/v30.2.0-next.mdfor full
migration guidance.
- 🧨 - Removed
TransferError.InvalidReceiverCdd,
TransferError.InvalidSenderCddandTransferError.ScopeClaimMissing.
The first two cannot be produced because transfers are no longer CDD
gated;ScopeClaimMissingrelates to Investor Uniqueness, removed from
the chain some time ago.
- See
changelogs/v30.2.0-next.mdfor full
migration guidance.
- 🧨 - Removed
TxGroup.RelayerManagementand
RELAYER_MANAGEMENT_TX_TAGS. Every call in therelayerpallet is
ensure_signedonly, so the group never gated anything and no replacement
grant is needed.
TxGroup.MultiSigManagement/MULTISIG_MANAGEMENT_TX_TAGSreduced to
multiSig.CreateMultisig, the only permission-checked call in the pallet.
The rest are executed under the MultiSig's own origin via a proposal, are
ensure_signedonly, or are primary-key only. What a MultiSig may do via
proposal is constrained by the permissions held by the MultiSig Account
itself, not by its signers'.- Added
TxGroup.InstructionMediation/INSTRUCTION_MEDIATION_TX_TAGS
(AffirmInstructionAsMediator,RejectInstructionAsMediator,
LockInstruction,UnlockInstruction). These are newly grantable, not
relocated — no group previously covered them, so existing
SettlementManagementgrantees do not already have them. - Added
TxGroup.DidRegistration/DID_REGISTRATION_TX_TAGS
(identity.RegisterDid);TxGroup.CddRegistrationis deprecated but
retained. - Removed tags for extrinsics no longer on chain:
settlement.AddInstructionWithMemo,settlement.AddAndAffirmInstructionWithMemo,
portfolio.MovePortfolioFundsV2. - Added tags for permission-checked v8 extrinsics no group previously
covered, acrossSettlementManagement,PortfolioManagement,
StoManagementandCorporateActionsManagement. - Consumers building permission UIs from
TX_GROUP_TO_TAGS_MAP,
AGENT_TX_GROUP_VALUESor the individual*_TX_TAGSconstants should
re-check their output. - See
changelogs/v30.2.0-next.mdfor full
migration guidance.
- 🧨 - SDK now only supports chain v8 — connecting to a v7 chain throws on
initialization (SUPPORTED_SPEC_VERSION_RANGEnarrowed to'8.0').
- Removed:
ChildIdentityentity and all child-identity APIs (Identities.createChild/
createChildren/getChildIdentity,Identity.*equivalents),Claims.getCddClaims,
Identity.hasValidCdd,RoleType.CddProvider/isCddProviderRole/CddProviderRole,
AccountManagement.subsidizeAccount,consumeAddRelayerPayingKeyAuthorization/
AuthorizationType.AddRelayerPayingKey,Instruction.withdraw/withdrawAsMediator/
InstructionAffirmationOperation.Withdraw/WithdrawAsMediator,Nft.controllerTransfer's
destinationPortfolioparam,AcceptPrimaryKeyRotationParams.cddAuth,
SetStakingControllerParams/BondPolyxParams.controller. - Renamed:
Identity.isCddProvider()→Identity.isDidRegistrar(). - Deprecated:
Identities.registerIdentity(createCdd/expiryare now no-ops) —
useregisterDid/selfRegisterDid. - Error message changes (update any string-matching code):
'Beneficiary/Subsidizer Account does not have a valid CDD Claim'→
'...does not have an associated Identity';
'Issuing Identity does not have a valid CDD claim'→'Issuing Identity does not exist';
'Issuer must be a CDD provider'→'Issuer must be a DID Registrar';
'MultiSig signers must be accounts as of v7'→'MultiSig signers must be accounts'. - See
changelogs/v30.2.0-next.mdfor full migration guidance.