31.0.0 (2026-08-14)
- fix!: ๐ require expiresAt on off-chain settlement and STO receipts (1473bc3)
Bug Fixes
- ๐ authorise ballot voting as a holder action (aa36fc0), closes #1643
- ๐ base transferFunds authorization on signing key, add NFT checks (64adfd9)
- ๐ check agent permissions for the accept-side transaction (394fb58)
- ๐ compare NFT ownership by address for MultiSig Account holders in transferFunds (816a5f7)
- ๐ correct protocol fee mapping against v8 runtime (69ec025)
- ๐ correct transaction tags against chain v8 metadata (e77224d)
- ๐ declare the transaction revokeIdentityToCreatePortfolios submits (debc1d0)
- ๐ declare the transactions procedures actually submit (672fcfd)
- ๐ distinguish immediate execution from a pending instruction (9c40cf9)
- ๐ drop permission declarations the chain never checks (ec0ddbb)
- ๐ drop remaining permission declarations the chain never checks (fdb8f75)
- ๐ make generate:consts idempotent (1c9b080)
- ๐ 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)
- ๐ return null from getNextCheckpoint after every Schedule is removed (75d0b0e)
- ๐ staking.getPayee returns null for an Account with no payee (4a8effc)
Features
- ๐ธ add Checkpoint.Schedules.getNextCheckpoint getter (31db08c)
- ๐ธ add CorporateActionBase.getDocuments getter (edef2cb)
- ๐ธ align TransferError with the chain's transfer errors (52f1364)
- ๐ธ allow transferFunds between asset holders on different DIDs (458bfd5)
- ๐ธ Drop v7 support (4292be3)
- ๐ธ make nft.createNftCollection grantable to External Agents (32753ef)
- ๐ธ rebuild transaction groups from the chain's permission model (b6cb8e5)
- ๐ธ remove CDD transfer errors that cannot occur on v8 (10114e3)
- ๐ธ remove types and a procedure for extrinsics that no longer exist (2fb7fec)
BREAKING CHANGES
expiresAtis now required on
Instruction.generateOffChainAffirmationReceiptand
Offering.generateOffChainFundingReceipt, and on
OffChainAffirmationReceiptandOffChainFundingReceipt.- ๐งจ
Assets.transferFundsreturn type changed from
voidtoInstruction | undefined. It resolves to the pending
Instructionwhen a cross-DID transfer is left awaiting the
receiver's affirmation, andundefinedwhen the transfer settles
immediately (same-DID, or the receiver auto-affirmed). - ๐งจ The following exported types are removed, along with the
modifyCorporateActionsAgentprocedure:
ScopeClaimProofandAddInvestorUniquenessClaimParamsโ described
identity.add_investor_uniqueness_claim, which does not exist on chain v8ModifyPrimaryIssuanceAgentParamsโ the Primary Issuance Agent concept was
superseded by External AgentsModifyCorporateActionsAgentParamsโ its procedure's only caller,
CorporateActions.setAgent, was removed in v22.0.0 in favour of
Permissions.inviteAgent, but the procedure was left behind
None had any reference in the SDK and no procedure accepted or returned them.
There is no replacement because there is no longer an operation to describe.
testUtils Asset entity mocks no longer default a primaryIssuanceAgents
field, which AssetDetails has not had since v22.0.0.
- ๐งจ - 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.