canton-network-docs/Release NotesWallet SDK
0.10.0
0.10.0
Released on October 2nd, 2025
- Self-issue feature app rights
you can now grant yourself feature app rights (similar to the wallet UI) for both internal and external parties
// For external parties
const [command,disclosedContracts] = sdk.tokenStandard!.selfGrantFeatureAppRights()
await sdk.userLedger?.prepareSignExecuteAndWaitFor(
command,
keyPair.privateKey,
v4(),
disclosedContracts
)
// For internal parties
await sdk.tokenStandard!.grantFeatureAppRightsForInternalParty()
- localNet variation for AppProvider & AppUser
you can now use both the appProvider and AppUser easily for show operations between two validators
const providerSDK = new WalletSDKImpl().configure({
logger,
authFactory: localNetAuthDefault,
ledgerFactory: localNetLedgerAppProvider, //new variations here
topologyFactory: localNetTopologyAppProvider, //new variations here
tokenStandardFactory: localNetTokenStandardAppProvider, //new variations here
validatorFactory: localValidatorDefault,
})
const userSDK = new WalletSDKImpl().configure({
logger,
authFactory: localNetAuthDefault,
ledgerFactory: localNetLedgerAppUser, //new variations here
topologyFactory: localNetTopologyAppUser, //new variations here
tokenStandardFactory: localNetTokenStandardAppUser, //new variations here
validatorFactory: localValidatorDefault,
})
LocalNet..Default still exists, they as previously defaults to the appUser validator
- topology transaction recalculate hash
you can now offline validate a topology transaction by recomputing the hash
const recomputeHash = await TopologyController.computeTopologyTxHash(
prepared!.partyTransactions
)
if (recomputeHash !== prepared!.combinedHash) {
throw new Error(
'Recomputed hash does not match prepared combined hash'
)
}
- new awaiting variation with
prepareSignExecuteAndWaitFor & executeSubmissionAndWaitFor
release 0.7.0 introduced the waitForCompletion, we have now backed that into the executions
// PREVIOUS CODE EXAMPLE
//it is recommended to fetch ledger offset before preparing your command
const offsetLatest = (await sdk.userLedger?.ledgerEnd())?.offset ?? 0
const transferCommandId =
// prepareSignAndExecuteTransaction & prepareSign now returns the commandId
await sdk.userLedger?.prepareSignAndExecuteTransaction(
[{ ExerciseCommand: transferCommand }],
keyPairSender.privateKey,
v4(),
disclosedContracts2
)
//new command that scans the ledger to ensure the command have completed
const completion = await sdk.userLedger?.waitForCompletion(
offsetLatest, //where to start from
5000, //optional timeout in ms
transferCommandId! //the command to look for
)
// NEW VARIATION
const completion =
await sdk.userLedger?.prepareSignExecuteAndWaitFor(
transferCommand,
keyPairSender.privateKey,
v4(),
disclosedContracts,
10000 // 10 second timeout, if no value is provided here a default of 15 seconds is used
)
// VARIATION FOR `ExecuteSubmission`
const completion =
await onlineSDK.userLedger?.executeSubmissionAndWaitFor(
transferCommand,
signedHash,
keyPairSender.publicKey,
v4()
)
executeSubmission now returns the submissionId similarly to prepareSignAndExecuteTransaction
- fixed thrown exception for missing seed when using
TopologyController.createTransactionHash
prepareSubmission now has same command input signature as prepareSignAndExecuteTransaction