Skip to content

v31.0.0

Latest

Choose a tag to compare

@polymesh-bot polymesh-bot released this 14 Aug 15:11
1473bc3

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

  • expiresAt is now required on
    Instruction.generateOffChainAffirmationReceipt and
    Offering.generateOffChainFundingReceipt, and on
    OffChainAffirmationReceipt and OffChainFundingReceipt.
  • 🧨 Assets.transferFunds return type changed from
    void to Instruction | undefined. It resolves to the pending
    Instruction when a cross-DID transfer is left awaiting the
    receiver's affirmation, and undefined when the transfer settles
    immediately (same-DID, or the receiver auto-affirmed).
  • 🧨 The following exported types are removed, along with the
    modifyCorporateActionsAgent procedure:
  • ScopeClaimProof and AddInvestorUniquenessClaimParams — described
    identity.add_investor_uniqueness_claim, which does not exist on chain v8
  • ModifyPrimaryIssuanceAgentParams — the Primary Issuance Agent concept was
    superseded by External Agents
  • ModifyCorporateActionsAgentParams — 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 TransferStatus enum and its sole
    producer u8ToTransferStatus. TransferError — the enum actually
    populated, by Settlements.canTransfer — keeps its role, and its members'
    doc comments no longer refer to TransferStatus equivalents.
  • Removed TransferError.InvalidReceiverPortfolio. Its sole producer was
    the granularCanTransferResultToTransferBreakdown cascade deleted with v7
    support, and it cannot be re-mapped: the portfolio pallet has a single
    PortfolioDoesNotExist variant, already mapped to InvalidSenderPortfolio.
  • Added TransferError.InvalidReceiverIdentity for a receiving Identity
    that is not active. Both transfer-validation paths report this condition
    (nft.InvalidNFTTransferInvalidReceiverDID and
    asset.InvalidTransferInvalidReceiverDID) and neither was mapped, so it
    previously surfaced as a raw chain error name.
  • Removed the transfersCanTransfer mock option in testUtils, typed
    against a return type canTransfer no longer has.
  • See changelogs/v30.2.0-next.md for full
    migration guidance.
  • 🧨 - Removed TransferError.InvalidReceiverCdd,
    TransferError.InvalidSenderCdd and TransferError.ScopeClaimMissing.
    The first two cannot be produced because transfers are no longer CDD
    gated; ScopeClaimMissing relates to Investor Uniqueness, removed from
    the chain some time ago.
  • 🧨 - Removed TxGroup.RelayerManagement and
    RELAYER_MANAGEMENT_TX_TAGS. Every call in the relayer pallet is
    ensure_signed only, so the group never gated anything and no replacement
    grant is needed.
  • TxGroup.MultiSigManagement / MULTISIG_MANAGEMENT_TX_TAGS reduced 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_signed only, 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
    SettlementManagement grantees do not already have them.
  • Added TxGroup.DidRegistration / DID_REGISTRATION_TX_TAGS
    (identity.RegisterDid); TxGroup.CddRegistration is 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, across SettlementManagement, PortfolioManagement,
    StoManagement and CorporateActionsManagement.
  • Consumers building permission UIs from TX_GROUP_TO_TAGS_MAP,
    AGENT_TX_GROUP_VALUES or the individual *_TX_TAGS constants should
    re-check their output.
  • See changelogs/v30.2.0-next.md for full
    migration guidance.
  • 🧨 - SDK now only supports chain v8 — connecting to a v7 chain throws on
    initialization (SUPPORTED_SPEC_VERSION_RANGE narrowed to '8.0').
  • Removed: ChildIdentity entity 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
    destinationPortfolio param, AcceptPrimaryKeyRotationParams.cddAuth,
    SetStakingControllerParams/BondPolyxParams.controller.
  • Renamed: Identity.isCddProvider()Identity.isDidRegistrar().
  • Deprecated: Identities.registerIdentity (createCdd/expiry are now no-ops) —
    use registerDid/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.md for full migration guidance.