@ledgerhq/hw-app-canton
Version:
Ledger Hardware Wallet Canton Application API
51 lines (43 loc) • 1.67 kB
text/typescript
import type { CantonPreparedTransaction } from "./Canton";
import type { CantonTransactionJson, CantonInputContract, CantonTransactionNode } from "./types";
import {
encodeDamlTransaction,
encodeInputContract,
encodeMetadata,
encodeNode,
} from "./encodeTransaction";
/**
* Splits a Canton transaction into components for prepared transaction signing.
* Converts protobuf transaction data into structured components that can be
* sent to the Ledger device for signing.
*
* @param transaction - The transaction JSON structure from the Gateway API
* @returns Prepared transaction components ready for device signing
*/
export function splitTransaction(transaction: CantonTransactionJson): CantonPreparedTransaction {
const { transaction: transactionData, metadata } = transaction;
// Process DAML transaction
const damlTransactionBytes = encodeDamlTransaction(transactionData);
// Process input contracts
const inputContracts = (metadata.inputContracts || []).map((contract: CantonInputContract) =>
encodeInputContract(contract),
);
// Process metadata
const metadataBytes = encodeMetadata(metadata, inputContracts.length);
// Process nodes
const nodesArray: CantonTransactionNode[] = transactionData.nodes || [];
const nodes = new Array(nodesArray.length);
const lastIndex = nodesArray.length - 1;
for (const node of nodesArray) {
const nodeId = Number.parseInt(node.nodeId || "0", 10);
const nodeBytes = encodeNode(node);
const pos = lastIndex - nodeId;
nodes[pos] = nodeBytes;
}
return {
damlTransaction: damlTransactionBytes,
nodes,
metadata: metadataBytes,
inputContracts,
};
}