@cardano-sdk/hardware-ledger 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +1 -0
  4. package/dist/cjs/LedgerKeyAgent.d.ts +43 -0
  5. package/dist/cjs/LedgerKeyAgent.d.ts.map +1 -0
  6. package/dist/cjs/LedgerKeyAgent.js +269 -0
  7. package/dist/cjs/LedgerKeyAgent.js.map +1 -0
  8. package/dist/cjs/index.d.ts +4 -0
  9. package/dist/cjs/index.d.ts.map +1 -0
  10. package/dist/cjs/index.js +20 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/package.json +3 -0
  13. package/dist/cjs/transformers/assets.d.ts +4 -0
  14. package/dist/cjs/transformers/assets.d.ts.map +1 -0
  15. package/dist/cjs/transformers/assets.js +50 -0
  16. package/dist/cjs/transformers/assets.js.map +1 -0
  17. package/dist/cjs/transformers/auxiliaryData.d.ts +10 -0
  18. package/dist/cjs/transformers/auxiliaryData.d.ts.map +1 -0
  19. package/dist/cjs/transformers/auxiliaryData.js +13 -0
  20. package/dist/cjs/transformers/auxiliaryData.js.map +1 -0
  21. package/dist/cjs/transformers/certificates.d.ts +8 -0
  22. package/dist/cjs/transformers/certificates.d.ts.map +1 -0
  23. package/dist/cjs/transformers/certificates.js +238 -0
  24. package/dist/cjs/transformers/certificates.js.map +1 -0
  25. package/dist/cjs/transformers/collateralInputs.d.ts +5 -0
  26. package/dist/cjs/transformers/collateralInputs.d.ts.map +1 -0
  27. package/dist/cjs/transformers/collateralInputs.js +7 -0
  28. package/dist/cjs/transformers/collateralInputs.js.map +1 -0
  29. package/dist/cjs/transformers/collateralOutput.d.ts +17 -0
  30. package/dist/cjs/transformers/collateralOutput.d.ts.map +1 -0
  31. package/dist/cjs/transformers/collateralOutput.js +7 -0
  32. package/dist/cjs/transformers/collateralOutput.js.map +1 -0
  33. package/dist/cjs/transformers/index.d.ts +13 -0
  34. package/dist/cjs/transformers/index.d.ts.map +1 -0
  35. package/dist/cjs/transformers/index.js +29 -0
  36. package/dist/cjs/transformers/index.js.map +1 -0
  37. package/dist/cjs/transformers/keyPaths.d.ts +5 -0
  38. package/dist/cjs/transformers/keyPaths.d.ts.map +1 -0
  39. package/dist/cjs/transformers/keyPaths.js +28 -0
  40. package/dist/cjs/transformers/keyPaths.js.map +1 -0
  41. package/dist/cjs/transformers/referenceInputs.d.ts +4 -0
  42. package/dist/cjs/transformers/referenceInputs.d.ts.map +1 -0
  43. package/dist/cjs/transformers/referenceInputs.js +12 -0
  44. package/dist/cjs/transformers/referenceInputs.js.map +1 -0
  45. package/dist/cjs/transformers/requiredSigners.d.ts +7 -0
  46. package/dist/cjs/transformers/requiredSigners.d.ts.map +1 -0
  47. package/dist/cjs/transformers/requiredSigners.js +59 -0
  48. package/dist/cjs/transformers/requiredSigners.js.map +1 -0
  49. package/dist/cjs/transformers/tx.d.ts +7 -0
  50. package/dist/cjs/transformers/tx.d.ts.map +1 -0
  51. package/dist/cjs/transformers/tx.js +39 -0
  52. package/dist/cjs/transformers/tx.js.map +1 -0
  53. package/dist/cjs/transformers/txIn.d.ts +7 -0
  54. package/dist/cjs/transformers/txIn.d.ts.map +1 -0
  55. package/dist/cjs/transformers/txIn.js +27 -0
  56. package/dist/cjs/transformers/txIn.js.map +1 -0
  57. package/dist/cjs/transformers/txOut.d.ts +7 -0
  58. package/dist/cjs/transformers/txOut.d.ts.map +1 -0
  59. package/dist/cjs/transformers/txOut.js +100 -0
  60. package/dist/cjs/transformers/txOut.js.map +1 -0
  61. package/dist/cjs/transformers/withdrawals.d.ts +7 -0
  62. package/dist/cjs/transformers/withdrawals.d.ts.map +1 -0
  63. package/dist/cjs/transformers/withdrawals.js +84 -0
  64. package/dist/cjs/transformers/withdrawals.js.map +1 -0
  65. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  66. package/dist/cjs/types.d.ts +14 -0
  67. package/dist/cjs/types.d.ts.map +1 -0
  68. package/dist/cjs/types.js +8 -0
  69. package/dist/cjs/types.js.map +1 -0
  70. package/dist/esm/LedgerKeyAgent.d.ts +43 -0
  71. package/dist/esm/LedgerKeyAgent.d.ts.map +1 -0
  72. package/dist/esm/LedgerKeyAgent.js +239 -0
  73. package/dist/esm/LedgerKeyAgent.js.map +1 -0
  74. package/dist/esm/index.d.ts +4 -0
  75. package/dist/esm/index.d.ts.map +1 -0
  76. package/dist/esm/index.js +4 -0
  77. package/dist/esm/index.js.map +1 -0
  78. package/dist/esm/package.json +4 -0
  79. package/dist/esm/transformers/assets.d.ts +4 -0
  80. package/dist/esm/transformers/assets.d.ts.map +1 -0
  81. package/dist/esm/transformers/assets.js +46 -0
  82. package/dist/esm/transformers/assets.js.map +1 -0
  83. package/dist/esm/transformers/auxiliaryData.d.ts +10 -0
  84. package/dist/esm/transformers/auxiliaryData.d.ts.map +1 -0
  85. package/dist/esm/transformers/auxiliaryData.js +9 -0
  86. package/dist/esm/transformers/auxiliaryData.js.map +1 -0
  87. package/dist/esm/transformers/certificates.d.ts +8 -0
  88. package/dist/esm/transformers/certificates.d.ts.map +1 -0
  89. package/dist/esm/transformers/certificates.js +209 -0
  90. package/dist/esm/transformers/certificates.js.map +1 -0
  91. package/dist/esm/transformers/collateralInputs.d.ts +5 -0
  92. package/dist/esm/transformers/collateralInputs.d.ts.map +1 -0
  93. package/dist/esm/transformers/collateralInputs.js +3 -0
  94. package/dist/esm/transformers/collateralInputs.js.map +1 -0
  95. package/dist/esm/transformers/collateralOutput.d.ts +17 -0
  96. package/dist/esm/transformers/collateralOutput.d.ts.map +1 -0
  97. package/dist/esm/transformers/collateralOutput.js +3 -0
  98. package/dist/esm/transformers/collateralOutput.js.map +1 -0
  99. package/dist/esm/transformers/index.d.ts +13 -0
  100. package/dist/esm/transformers/index.d.ts.map +1 -0
  101. package/dist/esm/transformers/index.js +13 -0
  102. package/dist/esm/transformers/index.js.map +1 -0
  103. package/dist/esm/transformers/keyPaths.d.ts +5 -0
  104. package/dist/esm/transformers/keyPaths.d.ts.map +1 -0
  105. package/dist/esm/transformers/keyPaths.js +23 -0
  106. package/dist/esm/transformers/keyPaths.js.map +1 -0
  107. package/dist/esm/transformers/referenceInputs.d.ts +4 -0
  108. package/dist/esm/transformers/referenceInputs.d.ts.map +1 -0
  109. package/dist/esm/transformers/referenceInputs.js +8 -0
  110. package/dist/esm/transformers/referenceInputs.js.map +1 -0
  111. package/dist/esm/transformers/requiredSigners.d.ts +7 -0
  112. package/dist/esm/transformers/requiredSigners.d.ts.map +1 -0
  113. package/dist/esm/transformers/requiredSigners.js +31 -0
  114. package/dist/esm/transformers/requiredSigners.js.map +1 -0
  115. package/dist/esm/transformers/tx.d.ts +7 -0
  116. package/dist/esm/transformers/tx.d.ts.map +1 -0
  117. package/dist/esm/transformers/tx.js +35 -0
  118. package/dist/esm/transformers/tx.js.map +1 -0
  119. package/dist/esm/transformers/txIn.d.ts +7 -0
  120. package/dist/esm/transformers/txIn.d.ts.map +1 -0
  121. package/dist/esm/transformers/txIn.js +22 -0
  122. package/dist/esm/transformers/txIn.js.map +1 -0
  123. package/dist/esm/transformers/txOut.d.ts +7 -0
  124. package/dist/esm/transformers/txOut.d.ts.map +1 -0
  125. package/dist/esm/transformers/txOut.js +72 -0
  126. package/dist/esm/transformers/txOut.js.map +1 -0
  127. package/dist/esm/transformers/withdrawals.d.ts +7 -0
  128. package/dist/esm/transformers/withdrawals.d.ts.map +1 -0
  129. package/dist/esm/transformers/withdrawals.js +56 -0
  130. package/dist/esm/transformers/withdrawals.js.map +1 -0
  131. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  132. package/dist/esm/types.d.ts +14 -0
  133. package/dist/esm/types.d.ts.map +1 -0
  134. package/dist/esm/types.js +5 -0
  135. package/dist/esm/types.js.map +1 -0
  136. package/package.json +81 -0
@@ -0,0 +1,43 @@
1
+ import * as Crypto from '@cardano-sdk/crypto';
2
+ import { Cardano } from '@cardano-sdk/core';
3
+ import { CommunicationType, KeyAgentBase, KeyAgentDependencies, SerializableLedgerKeyAgentData, SignBlobResult } from '@cardano-sdk/key-management';
4
+ import { LedgerTransportType } from './types';
5
+ import LedgerConnection, { GetVersionResponse, Transaction, TransactionSigningMode } from '@cardano-foundation/ledgerjs-hw-app-cardano';
6
+ import type LedgerTransport from '@ledgerhq/hw-transport';
7
+ export interface LedgerKeyAgentProps extends Omit<SerializableLedgerKeyAgentData, '__typename'> {
8
+ deviceConnection?: LedgerConnection;
9
+ }
10
+ export interface CreateLedgerKeyAgentProps {
11
+ chainId: Cardano.ChainId;
12
+ accountIndex?: number;
13
+ communicationType: CommunicationType;
14
+ deviceConnection?: LedgerConnection | null;
15
+ }
16
+ export interface GetLedgerXpubProps {
17
+ deviceConnection?: LedgerConnection;
18
+ communicationType: CommunicationType;
19
+ accountIndex: number;
20
+ }
21
+ export interface CreateLedgerTransportProps {
22
+ communicationType: CommunicationType;
23
+ activeTransport?: LedgerTransportType;
24
+ devicePath?: string;
25
+ }
26
+ export declare class LedgerKeyAgent extends KeyAgentBase {
27
+ #private;
28
+ readonly deviceConnection?: LedgerConnection;
29
+ constructor({ deviceConnection, ...serializableData }: LedgerKeyAgentProps, dependencies: KeyAgentDependencies);
30
+ static getHidDeviceList(communicationType: CommunicationType): Promise<string[]>;
31
+ static createTransport({ communicationType, activeTransport, devicePath }: CreateLedgerTransportProps): Promise<LedgerTransportType>;
32
+ static createDeviceConnection(activeTransport: LedgerTransport): Promise<LedgerConnection>;
33
+ static establishDeviceConnection(communicationType: CommunicationType, devicePath?: string): Promise<LedgerConnection>;
34
+ static checkDeviceConnection(communicationType: CommunicationType, deviceConnection?: LedgerConnection): Promise<LedgerConnection>;
35
+ static getXpub({ deviceConnection, communicationType, accountIndex }: GetLedgerXpubProps): Promise<Crypto.Bip32PublicKeyHex>;
36
+ static getAppVersion(communicationType: CommunicationType, deviceConnection?: LedgerConnection): Promise<GetVersionResponse>;
37
+ static createWithDevice({ chainId, accountIndex, communicationType, deviceConnection }: CreateLedgerKeyAgentProps, dependencies: KeyAgentDependencies): Promise<LedgerKeyAgent>;
38
+ static getSigningMode(tx: Transaction): TransactionSigningMode;
39
+ signTransaction({ body, hash }: Cardano.TxBodyWithHash): Promise<Cardano.Signatures>;
40
+ signBlob(): Promise<SignBlobResult>;
41
+ exportRootPrivateKey(): Promise<Crypto.Bip32PrivateKeyHex>;
42
+ }
43
+ //# sourceMappingURL=LedgerKeyAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LedgerKeyAgent.d.ts","sourceRoot":"","sources":["../../src/LedgerKeyAgent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAuB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAGL,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EAEpB,8BAA8B,EAC9B,cAAc,EAEf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAI9C,OAAO,gBAAgB,EAAE,EAGvB,kBAAkB,EAKlB,WAAW,EACX,sBAAsB,EAEvB,MAAM,6CAA6C,CAAC;AAGrD,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAE1D,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,8BAA8B,EAAE,YAAY,CAAC;IAC7F,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA2DD,qBAAa,cAAe,SAAQ,YAAY;;IAC9C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;gBAGjC,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB;WASjG,gBAAgB,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;WAWzE,eAAe,CAAC,EAC3B,iBAAiB,EACjB,eAAe,EACf,UAAe,EAChB,EAAE,0BAA0B,GAAG,OAAO,CAAC,mBAAmB,CAAC;WAgB/C,sBAAsB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;WAcnF,yBAAyB,CACpC,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC;WA+Bf,qBAAqB,CAChC,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,gBAAgB,CAAC;WAmBf,OAAO,CAAC,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACb,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;WAoB5C,aAAa,CACxB,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,kBAAkB,CAAC;WASjB,gBAAgB,CAC3B,EAAE,OAAO,EAAE,YAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,EAAE,yBAAyB,EAC7F,YAAY,EAAE,oBAAoB;IA+BpC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,sBAAsB;IAqCxD,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;IA+CpF,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAInC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;CAGjE"}
@@ -0,0 +1,239 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _LedgerKeyAgent_communicationType;
13
+ import * as Crypto from '@cardano-sdk/crypto';
14
+ import { NotImplementedError } from '@cardano-sdk/core';
15
+ import { CardanoKeyConst, Cip1852PathLevelIndexes, CommunicationType, KeyAgentBase, KeyAgentType, errors } from '@cardano-sdk/key-management';
16
+ import { ManagedFreeableScope } from '@cardano-sdk/util';
17
+ import { str_to_path } from '@cardano-foundation/ledgerjs-hw-app-cardano/dist/utils/address';
18
+ import { toLedgerTx } from './transformers';
19
+ import LedgerConnection, { CertificateType, PoolKeyType, PoolOwnerType, StakeCredentialParamsType, TransactionSigningMode, TxOutputDestinationType } from '@cardano-foundation/ledgerjs-hw-app-cardano';
20
+ import TransportNodeHid from '@ledgerhq/hw-transport-node-hid-noevents';
21
+ import TransportWebHID from '@ledgerhq/hw-transport-webhid';
22
+ const transportTypedError = (error) => new errors.TransportError('Ledger transport failed', error);
23
+ const hasRegistrationOrRetirementCerts = (certificates) => {
24
+ if (!certificates)
25
+ return false;
26
+ return (certificates.some((cert) => cert.type === CertificateType.STAKE_POOL_RETIREMENT) ||
27
+ certificates.some((cert) => cert.type === CertificateType.STAKE_POOL_REGISTRATION));
28
+ };
29
+ const stakeCredentialCert = (cert) => cert.type === CertificateType.STAKE_REGISTRATION ||
30
+ cert.type === CertificateType.STAKE_DEREGISTRATION ||
31
+ cert.type === CertificateType.STAKE_DELEGATION;
32
+ const containsOnlyScriptHashCreds = (tx) => {
33
+ const withdrawalsAllScriptHash = !tx.withdrawals?.some((withdrawal) => withdrawal.stakeCredential.type !== StakeCredentialParamsType.SCRIPT_HASH);
34
+ if (tx.certificates) {
35
+ for (const cert of tx.certificates) {
36
+ if (!stakeCredentialCert(cert))
37
+ return false;
38
+ const certParams = cert.params;
39
+ if (certParams.stakeCredential.type !== StakeCredentialParamsType.SCRIPT_HASH)
40
+ return false;
41
+ }
42
+ }
43
+ return withdrawalsAllScriptHash;
44
+ };
45
+ const isMultiSig = (tx) => {
46
+ const result = false;
47
+ const allThirdPartyInputs = !tx.inputs.some((input) => input.path !== null);
48
+ const allThirdPartyOutputs = !tx.outputs.some((out) => out.destination.type !== TxOutputDestinationType.THIRD_PARTY);
49
+ if (allThirdPartyInputs &&
50
+ allThirdPartyOutputs &&
51
+ !tx.collateralInputs &&
52
+ !tx.requiredSigners &&
53
+ !hasRegistrationOrRetirementCerts(tx.certificates) &&
54
+ containsOnlyScriptHashCreds(tx)) {
55
+ return true;
56
+ }
57
+ return result;
58
+ };
59
+ export class LedgerKeyAgent extends KeyAgentBase {
60
+ constructor({ deviceConnection, ...serializableData }, dependencies) {
61
+ super({ ...serializableData, __typename: KeyAgentType.Ledger }, dependencies);
62
+ _LedgerKeyAgent_communicationType.set(this, void 0);
63
+ this.deviceConnection = deviceConnection;
64
+ __classPrivateFieldSet(this, _LedgerKeyAgent_communicationType, serializableData.communicationType, "f");
65
+ }
66
+ static async getHidDeviceList(communicationType) {
67
+ try {
68
+ return communicationType === CommunicationType.Node ? TransportNodeHid.list() : TransportWebHID.list();
69
+ }
70
+ catch (error) {
71
+ throw new errors.TransportError('Cannot fetch device list', error);
72
+ }
73
+ }
74
+ static async createTransport({ communicationType, activeTransport, devicePath = '' }) {
75
+ try {
76
+ if (communicationType === CommunicationType.Node) {
77
+ return await TransportNodeHid.open(devicePath);
78
+ }
79
+ return await (activeTransport && activeTransport instanceof TransportWebHID
80
+ ? TransportWebHID.open(activeTransport.device)
81
+ : TransportWebHID.request());
82
+ }
83
+ catch (error) {
84
+ throw new errors.TransportError('Creating transport failed', error);
85
+ }
86
+ }
87
+ static async createDeviceConnection(activeTransport) {
88
+ try {
89
+ const deviceConnection = new LedgerConnection(activeTransport);
90
+ await deviceConnection.getVersion();
91
+ return deviceConnection;
92
+ }
93
+ catch (error) {
94
+ throw new errors.TransportError('Cannot communicate with Ledger Cardano App', error);
95
+ }
96
+ }
97
+ static async establishDeviceConnection(communicationType, devicePath) {
98
+ let transport;
99
+ try {
100
+ transport = await LedgerKeyAgent.createTransport({ communicationType, devicePath });
101
+ if (!transport || !transport.deviceModel) {
102
+ throw new errors.TransportError('Missing transport');
103
+ }
104
+ const isSupportedLedgerModel = transport.deviceModel.id === 'nanoS' ||
105
+ transport.deviceModel.id === 'nanoX' ||
106
+ transport.deviceModel.id === 'nanoSP';
107
+ if (!isSupportedLedgerModel) {
108
+ throw new errors.TransportError(`Ledger device model: "${transport.deviceModel.id}" is not supported`);
109
+ }
110
+ return await LedgerKeyAgent.createDeviceConnection(transport);
111
+ }
112
+ catch (error) {
113
+ if (error.innerError.message.includes('cannot open device with path')) {
114
+ throw new errors.TransportError('Connection already established', error);
115
+ }
116
+ if (transport) {
117
+ transport.close();
118
+ }
119
+ throw new errors.TransportError('Establishing device connection failed', error);
120
+ }
121
+ }
122
+ static async checkDeviceConnection(communicationType, deviceConnection) {
123
+ try {
124
+ if (!deviceConnection) {
125
+ return await LedgerKeyAgent.establishDeviceConnection(communicationType);
126
+ }
127
+ return await LedgerKeyAgent.createDeviceConnection(deviceConnection.transport);
128
+ }
129
+ catch (error) {
130
+ if (error.name === 'DisconnectedDeviceDuringOperation') {
131
+ return await LedgerKeyAgent.establishDeviceConnection(communicationType);
132
+ }
133
+ throw error;
134
+ }
135
+ }
136
+ static async getXpub({ deviceConnection, communicationType, accountIndex }) {
137
+ try {
138
+ const recoveredDeviceConnection = await LedgerKeyAgent.checkDeviceConnection(communicationType, deviceConnection);
139
+ const derivationPath = `${CardanoKeyConst.PURPOSE}'/${CardanoKeyConst.COIN_TYPE}'/${accountIndex}'`;
140
+ const extendedPublicKey = await recoveredDeviceConnection.getExtendedPublicKey({
141
+ path: str_to_path(derivationPath)
142
+ });
143
+ const xPubHex = `${extendedPublicKey.publicKeyHex}${extendedPublicKey.chainCodeHex}`;
144
+ return Crypto.Bip32PublicKeyHex(xPubHex);
145
+ }
146
+ catch (error) {
147
+ if (error.code === 28169) {
148
+ throw new errors.AuthenticationError('Failed to export extended account public key', error);
149
+ }
150
+ throw transportTypedError(error);
151
+ }
152
+ }
153
+ static async getAppVersion(communicationType, deviceConnection) {
154
+ const recoveredDeviceConnection = await LedgerKeyAgent.checkDeviceConnection(communicationType, deviceConnection);
155
+ return await recoveredDeviceConnection.getVersion();
156
+ }
157
+ static async createWithDevice({ chainId, accountIndex = 0, communicationType, deviceConnection }, dependencies) {
158
+ const deviceListPaths = await LedgerKeyAgent.getHidDeviceList(communicationType);
159
+ const activeDeviceConnection = await (deviceConnection
160
+ ? LedgerKeyAgent.checkDeviceConnection(communicationType, deviceConnection)
161
+ : LedgerKeyAgent.establishDeviceConnection(communicationType, deviceListPaths[0]));
162
+ const extendedAccountPublicKey = await LedgerKeyAgent.getXpub({
163
+ accountIndex,
164
+ communicationType,
165
+ deviceConnection: activeDeviceConnection
166
+ });
167
+ return new LedgerKeyAgent({
168
+ accountIndex,
169
+ chainId,
170
+ communicationType,
171
+ deviceConnection: activeDeviceConnection,
172
+ extendedAccountPublicKey,
173
+ knownAddresses: []
174
+ }, dependencies);
175
+ }
176
+ static getSigningMode(tx) {
177
+ if (tx.certificates) {
178
+ for (const cert of tx.certificates) {
179
+ if (cert.type === CertificateType.STAKE_POOL_REGISTRATION &&
180
+ cert.params.poolOwners.some((owner) => owner.type === PoolOwnerType.DEVICE_OWNED))
181
+ return TransactionSigningMode.POOL_REGISTRATION_AS_OWNER;
182
+ if (cert.type === CertificateType.STAKE_POOL_REGISTRATION &&
183
+ cert.params.poolKey.type === PoolKeyType.DEVICE_OWNED)
184
+ return TransactionSigningMode.POOL_REGISTRATION_AS_OPERATOR;
185
+ }
186
+ }
187
+ if (tx.collateralInputs || tx.requiredSigners) {
188
+ return TransactionSigningMode.PLUTUS_TRANSACTION;
189
+ }
190
+ if (isMultiSig(tx)) {
191
+ return TransactionSigningMode.MULTISIG_TRANSACTION;
192
+ }
193
+ return TransactionSigningMode.ORDINARY_TRANSACTION;
194
+ }
195
+ async signTransaction({ body, hash }) {
196
+ const scope = new ManagedFreeableScope();
197
+ try {
198
+ const ledgerTxData = await toLedgerTx(body, {
199
+ chainId: this.chainId,
200
+ inputResolver: this.inputResolver,
201
+ knownAddresses: this.knownAddresses
202
+ });
203
+ const deviceConnection = await LedgerKeyAgent.checkDeviceConnection(__classPrivateFieldGet(this, _LedgerKeyAgent_communicationType, "f"), this.deviceConnection);
204
+ const signingMode = LedgerKeyAgent.getSigningMode(ledgerTxData);
205
+ const result = await deviceConnection.signTransaction({
206
+ signingMode,
207
+ tx: ledgerTxData
208
+ });
209
+ if (result.txHashHex !== hash) {
210
+ throw new errors.HwMappingError('Ledger computed a different transaction id');
211
+ }
212
+ return new Map(await Promise.all(result.witnesses.map(async (witness) => {
213
+ const publicKey = await this.derivePublicKey({
214
+ index: witness.path[Cip1852PathLevelIndexes.INDEX],
215
+ role: witness.path[Cip1852PathLevelIndexes.ROLE]
216
+ });
217
+ const signature = Crypto.Ed25519SignatureHex(witness.witnessSignatureHex);
218
+ return [publicKey, signature];
219
+ })));
220
+ }
221
+ catch (error) {
222
+ if (error.code === 28169) {
223
+ throw new errors.AuthenticationError('Transaction signing aborted', error);
224
+ }
225
+ throw transportTypedError(error);
226
+ }
227
+ finally {
228
+ scope.dispose();
229
+ }
230
+ }
231
+ async signBlob() {
232
+ throw new NotImplementedError('signBlob');
233
+ }
234
+ async exportRootPrivateKey() {
235
+ throw new NotImplementedError('Operation not supported!');
236
+ }
237
+ }
238
+ _LedgerKeyAgent_communicationType = new WeakMap();
239
+ //# sourceMappingURL=LedgerKeyAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LedgerKeyAgent.js","sourceRoot":"","sources":["../../src/LedgerKeyAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './transformers';
2
+ export * from './LedgerKeyAgent';
3
+ export * from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './transformers';
2
+ export * from './LedgerKeyAgent';
3
+ export * from './types';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ {
2
+ "type": "module",
3
+ "sideEffects": false
4
+ }
@@ -0,0 +1,4 @@
1
+ import * as Ledger from '@cardano-foundation/ledgerjs-hw-app-cardano';
2
+ import { Cardano } from '@cardano-sdk/core';
3
+ export declare const mapTokenMap: (tokenMap: Cardano.TokenMap | undefined) => Ledger.AssetGroup[] | null;
4
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/transformers/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,6CAA6C,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA6C5C,eAAO,MAAM,WAAW,aAAc,QAAQ,QAAQ,GAAG,SAAS,+BAIjE,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { Cardano } from '@cardano-sdk/core';
2
+ const compareAssetNameCanonically = (a, b) => {
3
+ if (a.assetNameHex === b.assetNameHex) {
4
+ return a.assetNameHex > b.assetNameHex ? 1 : -1;
5
+ }
6
+ else if (a.assetNameHex.length > b.assetNameHex.length)
7
+ return 1;
8
+ return -1;
9
+ };
10
+ const comparePolicyIdCanonically = (a, b) => {
11
+ if (a.policyIdHex === b.policyIdHex) {
12
+ return a.policyIdHex > b.policyIdHex ? 1 : -1;
13
+ }
14
+ else if (a.policyIdHex.length > b.policyIdHex.length)
15
+ return 1;
16
+ return -1;
17
+ };
18
+ const tokenMapToAssetGroup = (tokenMap) => {
19
+ const map = new Map();
20
+ for (const [key, value] of tokenMap.entries()) {
21
+ const policyId = Cardano.AssetId.getPolicyId(key);
22
+ const assetName = Cardano.AssetId.getAssetName(key);
23
+ if (!map.has(policyId))
24
+ map.set(policyId, new Array());
25
+ map.get(policyId).push({
26
+ amount: value,
27
+ assetNameHex: assetName
28
+ });
29
+ }
30
+ const tokenMapAssetsGroup = [];
31
+ for (const [key, value] of map.entries()) {
32
+ value.sort(compareAssetNameCanonically);
33
+ tokenMapAssetsGroup.push({
34
+ policyIdHex: key,
35
+ tokens: value
36
+ });
37
+ }
38
+ tokenMapAssetsGroup.sort(comparePolicyIdCanonically);
39
+ return tokenMapAssetsGroup;
40
+ };
41
+ export const mapTokenMap = (tokenMap) => {
42
+ if (!tokenMap)
43
+ return null;
44
+ return tokenMapToAssetGroup(tokenMap);
45
+ };
46
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/transformers/assets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,MAAM,2BAA2B,GAAG,CAAC,CAAe,EAAE,CAAe,EAAE,EAAE;IACvE,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY,EAAE;QACrC,OAAO,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACjD;SAAM,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,CAAoB,EAAE,CAAoB,EAAE,EAAE;IAChF,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,EAAE;QACnC,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC/C;SAAM,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,QAA0B,EAAuB,EAAE;IAC/E,MAAM,GAAG,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;QAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,KAAK,EAAgB,CAAC,CAAC;QAErE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;YACtB,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,SAAS;SACxB,CAAC,CAAC;KACJ;IAED,MAAM,mBAAmB,GAAG,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE;QACxC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,mBAAmB,CAAC,IAAI,CAAC;YACvB,WAAW,EAAE,GAAG;YAChB,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;KACJ;IAED,mBAAmB,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAErD,OAAO,mBAAmB,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAsC,EAAE,EAAE;IACpE,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import * as Crypto from '@cardano-sdk/crypto';
2
+ import * as Ledger from '@cardano-foundation/ledgerjs-hw-app-cardano';
3
+ export declare const mapAuxiliaryData: (auxiliaryDataHash?: Crypto.Hash32ByteBase16) => {
4
+ type: Ledger.TxAuxiliaryDataType.ARBITRARY_HASH;
5
+ params: Ledger.TxAuxiliaryDataArbitraryHashParams;
6
+ } | {
7
+ type: Ledger.TxAuxiliaryDataType.CIP36_REGISTRATION;
8
+ params: Ledger.CIP36VoteRegistrationParams;
9
+ } | null;
10
+ //# sourceMappingURL=auxiliaryData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auxiliaryData.d.ts","sourceRoot":"","sources":["../../../src/transformers/auxiliaryData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,6CAA6C,CAAC;AAWtE,eAAO,MAAM,gBAAgB,uBAAwB,OAAO,gBAAgB;;;;;;QACb,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { TxAuxiliaryDataType } from '@cardano-foundation/ledgerjs-hw-app-cardano/dist/types/public';
2
+ const toAuxiliaryData = (auxiliaryDataHash) => ({
3
+ params: {
4
+ hashHex: auxiliaryDataHash
5
+ },
6
+ type: TxAuxiliaryDataType.ARBITRARY_HASH
7
+ });
8
+ export const mapAuxiliaryData = (auxiliaryDataHash) => auxiliaryDataHash ? toAuxiliaryData(auxiliaryDataHash) : null;
9
+ //# sourceMappingURL=auxiliaryData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auxiliaryData.js","sourceRoot":"","sources":["../../../src/transformers/auxiliaryData.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+DAA+D,CAAC;AAEpG,MAAM,eAAe,GAA+D,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC1G,MAAM,EAAE;QACN,OAAO,EAAE,iBAAiB;KAC3B;IACD,IAAI,EAAE,mBAAmB,CAAC,cAAc;CACzC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,iBAA2C,EAAE,EAAE,CAC9E,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ import * as Ledger from '@cardano-foundation/ledgerjs-hw-app-cardano';
2
+ import { Cardano } from '@cardano-sdk/core';
3
+ import { Transform } from '@cardano-sdk/util';
4
+ import { LedgerTxTransformerContext } from '../types';
5
+ export declare const stakeDelegationCertificate: Transform<Cardano.StakeDelegationCertificate, Ledger.Certificate, LedgerTxTransformerContext>;
6
+ export declare const poolRegistrationCertificate: Transform<Cardano.PoolRegistrationCertificate, Ledger.Certificate, LedgerTxTransformerContext>;
7
+ export declare const mapCerts: (certs: Cardano.Certificate[] | undefined, context: LedgerTxTransformerContext) => Ledger.Certificate[] | null;
8
+ //# sourceMappingURL=certificates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certificates.d.ts","sourceRoot":"","sources":["../../../src/transformers/certificates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,6CAA6C,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAwB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AA2DtD,eAAO,MAAM,0BAA0B,EAAE,SAAS,CAChD,OAAO,CAAC,0BAA0B,EAClC,MAAM,CAAC,WAAW,EAClB,0BAA0B,CA6C3B,CAAC;AAeF,eAAO,MAAM,2BAA2B,EAAE,SAAS,CACjD,OAAO,CAAC,2BAA2B,EACnC,MAAM,CAAC,WAAW,EAClB,0BAA0B,CAwF3B,CAAC;AA2CF,eAAO,MAAM,QAAQ,UACZ,QAAQ,WAAW,EAAE,GAAG,SAAS,WAC/B,0BAA0B,KAClC,OAAO,WAAW,EAAE,GAAG,IAIzB,CAAC"}
@@ -0,0 +1,209 @@
1
+ import * as Ledger from '@cardano-foundation/ledgerjs-hw-app-cardano';
2
+ import { Cardano } from '@cardano-sdk/core';
3
+ import { InvalidArgumentError } from '@cardano-sdk/util';
4
+ import { stakeKeyPathFromGroupedAddress } from './keyPaths';
5
+ const getStakeAddressCertificate = (certificate, context, type) => {
6
+ const knownAddress = context?.knownAddresses.find((address) => Cardano.RewardAccount.toHash(address.rewardAccount) === certificate.stakeKeyHash);
7
+ const rewardAddress = knownAddress ? Cardano.Address.fromBech32(knownAddress.rewardAccount)?.asReward() : null;
8
+ const path = stakeKeyPathFromGroupedAddress(knownAddress);
9
+ const credentialType = rewardAddress
10
+ ? rewardAddress.getPaymentCredential().type
11
+ : Ledger.StakeCredentialParamsType.SCRIPT_HASH;
12
+ let credential;
13
+ switch (credentialType) {
14
+ case Cardano.CredentialType.KeyHash: {
15
+ credential = path
16
+ ? {
17
+ keyPath: path,
18
+ type: Ledger.StakeCredentialParamsType.KEY_PATH
19
+ }
20
+ : {
21
+ keyHashHex: certificate.stakeKeyHash,
22
+ type: Ledger.StakeCredentialParamsType.KEY_HASH
23
+ };
24
+ break;
25
+ }
26
+ case Cardano.CredentialType.ScriptHash:
27
+ default: {
28
+ credential = {
29
+ scriptHashHex: certificate.stakeKeyHash,
30
+ type: Ledger.StakeCredentialParamsType.SCRIPT_HASH
31
+ };
32
+ }
33
+ }
34
+ return {
35
+ params: {
36
+ stakeCredential: credential
37
+ },
38
+ type
39
+ };
40
+ };
41
+ export const stakeDelegationCertificate = (certificate, context) => {
42
+ const poolIdKeyHash = Cardano.PoolId.toKeyHash(certificate.poolId);
43
+ const knownAddress = context?.knownAddresses.find((address) => Cardano.RewardAccount.toHash(address.rewardAccount) === certificate.stakeKeyHash);
44
+ const rewardAddress = knownAddress ? Cardano.Address.fromBech32(knownAddress.rewardAccount)?.asReward() : null;
45
+ const credentialType = rewardAddress
46
+ ? rewardAddress.getPaymentCredential().type
47
+ : Ledger.StakeCredentialParamsType.SCRIPT_HASH;
48
+ const path = stakeKeyPathFromGroupedAddress(knownAddress);
49
+ let credential;
50
+ switch (credentialType) {
51
+ case Cardano.CredentialType.KeyHash: {
52
+ credential = path
53
+ ? {
54
+ keyPath: path,
55
+ type: Ledger.StakeCredentialParamsType.KEY_PATH
56
+ }
57
+ : {
58
+ keyHashHex: certificate.stakeKeyHash,
59
+ type: Ledger.StakeCredentialParamsType.KEY_HASH
60
+ };
61
+ break;
62
+ }
63
+ case Cardano.CredentialType.ScriptHash:
64
+ default: {
65
+ credential = {
66
+ scriptHashHex: certificate.stakeKeyHash,
67
+ type: Ledger.StakeCredentialParamsType.SCRIPT_HASH
68
+ };
69
+ }
70
+ }
71
+ return {
72
+ params: {
73
+ poolKeyHashHex: poolIdKeyHash,
74
+ stakeCredential: credential
75
+ },
76
+ type: Ledger.CertificateType.STAKE_DELEGATION
77
+ };
78
+ };
79
+ const toPoolMetadata = (metadataJson) => ({
80
+ metadataHashHex: metadataJson.hash,
81
+ metadataUrl: metadataJson.url
82
+ });
83
+ const getPoolOperatorKeyPath = (operator, context) => {
84
+ const knownAddress = context?.knownAddresses.find((address) => address.rewardAccount === operator);
85
+ return stakeKeyPathFromGroupedAddress(knownAddress);
86
+ };
87
+ export const poolRegistrationCertificate = (certificate, context) => {
88
+ const poolOperatorKeyPath = getPoolOperatorKeyPath(certificate.poolParameters.rewardAccount, context);
89
+ const poolOperatorKeyHash = Cardano.RewardAccount.toHash(certificate.poolParameters.rewardAccount);
90
+ return {
91
+ params: {
92
+ cost: certificate.poolParameters.cost,
93
+ margin: certificate.poolParameters.margin,
94
+ metadata: certificate.poolParameters.metadataJson
95
+ ? toPoolMetadata(certificate.poolParameters.metadataJson)
96
+ : undefined,
97
+ pledge: certificate.poolParameters.pledge,
98
+ poolKey: poolOperatorKeyPath
99
+ ? {
100
+ params: {
101
+ path: poolOperatorKeyPath
102
+ },
103
+ type: Ledger.PoolKeyType.DEVICE_OWNED
104
+ }
105
+ : {
106
+ params: {
107
+ keyHashHex: poolOperatorKeyHash
108
+ },
109
+ type: Ledger.PoolKeyType.THIRD_PARTY
110
+ },
111
+ poolOwners: certificate.poolParameters.owners.map((owner) => {
112
+ const poolOwnerKeyPath = getPoolOperatorKeyPath(owner, context);
113
+ const poolOwnerKeyHash = Cardano.RewardAccount.toHash(owner);
114
+ return poolOwnerKeyPath
115
+ ? {
116
+ params: {
117
+ stakingPath: poolOwnerKeyPath
118
+ },
119
+ type: Ledger.PoolOwnerType.DEVICE_OWNED
120
+ }
121
+ : {
122
+ params: {
123
+ stakingKeyHashHex: poolOwnerKeyHash
124
+ },
125
+ type: Ledger.PoolOwnerType.THIRD_PARTY
126
+ };
127
+ }),
128
+ relays: certificate.poolParameters.relays.map((relay) => {
129
+ switch (relay.__typename) {
130
+ case 'RelayByAddress':
131
+ return {
132
+ params: {
133
+ ipv4: relay.ipv4,
134
+ ipv6: relay.ipv6,
135
+ portNumber: relay.port
136
+ },
137
+ type: 0
138
+ };
139
+ case 'RelayByName':
140
+ return {
141
+ params: {
142
+ dnsName: relay.hostname,
143
+ portNumber: relay.port
144
+ },
145
+ type: 1
146
+ };
147
+ case 'RelayByNameMultihost':
148
+ return {
149
+ params: {
150
+ dnsName: relay.dnsName
151
+ },
152
+ type: 1
153
+ };
154
+ }
155
+ }),
156
+ rewardAccount: poolOperatorKeyPath
157
+ ? {
158
+ params: {
159
+ path: poolOperatorKeyPath
160
+ },
161
+ type: Ledger.PoolRewardAccountType.DEVICE_OWNED
162
+ }
163
+ : {
164
+ params: {
165
+ rewardAccountHex: Cardano.Address.fromBech32(certificate.poolParameters.rewardAccount).toBytes()
166
+ },
167
+ type: Ledger.PoolRewardAccountType.THIRD_PARTY
168
+ },
169
+ vrfKeyHashHex: certificate.poolParameters.vrf
170
+ },
171
+ type: Ledger.CertificateType.STAKE_POOL_REGISTRATION
172
+ };
173
+ };
174
+ const poolRetirementCertificate = (certificate, context) => {
175
+ const poolIdKeyHash = Cardano.PoolId.toKeyHash(certificate.poolId);
176
+ const knownAddress = context?.knownAddresses.find((address) => Cardano.RewardAccount.toHash(address.rewardAccount) === poolIdKeyHash);
177
+ const poolKeyPath = stakeKeyPathFromGroupedAddress(knownAddress);
178
+ if (!poolKeyPath)
179
+ throw new InvalidArgumentError('certificate', 'Missing key matching pool retirement certificate.');
180
+ return {
181
+ params: {
182
+ poolKeyPath,
183
+ retirementEpoch: certificate.epoch
184
+ },
185
+ type: Ledger.CertificateType.STAKE_POOL_RETIREMENT
186
+ };
187
+ };
188
+ const toCert = (cert, context) => {
189
+ switch (cert.__typename) {
190
+ case Cardano.CertificateType.StakeKeyRegistration:
191
+ return getStakeAddressCertificate(cert, context, Ledger.CertificateType.STAKE_REGISTRATION);
192
+ case Cardano.CertificateType.StakeKeyDeregistration:
193
+ return getStakeAddressCertificate(cert, context, Ledger.CertificateType.STAKE_DEREGISTRATION);
194
+ case Cardano.CertificateType.StakeDelegation:
195
+ return stakeDelegationCertificate(cert, context);
196
+ case Cardano.CertificateType.PoolRegistration:
197
+ return poolRegistrationCertificate(cert, context);
198
+ case Cardano.CertificateType.PoolRetirement:
199
+ return poolRetirementCertificate(cert, context);
200
+ default:
201
+ throw new InvalidArgumentError('cert', `Certificate ${cert.__typename} not supported.`);
202
+ }
203
+ };
204
+ export const mapCerts = (certs, context) => {
205
+ if (!certs)
206
+ return null;
207
+ return certs.map((coreCert) => toCert(coreCert, context));
208
+ };
209
+ //# sourceMappingURL=certificates.js.map