@cardano-sdk/key-management 0.2.0-nightly.1

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 (224) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +1 -0
  4. package/dist/cjs/InMemoryKeyAgent.d.ts +23 -0
  5. package/dist/cjs/InMemoryKeyAgent.d.ts.map +1 -0
  6. package/dist/cjs/InMemoryKeyAgent.js +136 -0
  7. package/dist/cjs/InMemoryKeyAgent.js.map +1 -0
  8. package/dist/cjs/KeyAgentBase.d.ts +20 -0
  9. package/dist/cjs/KeyAgentBase.d.ts.map +1 -0
  10. package/dist/cjs/KeyAgentBase.js +77 -0
  11. package/dist/cjs/KeyAgentBase.js.map +1 -0
  12. package/dist/cjs/LedgerKeyAgent.d.ts +42 -0
  13. package/dist/cjs/LedgerKeyAgent.d.ts.map +1 -0
  14. package/dist/cjs/LedgerKeyAgent.js +208 -0
  15. package/dist/cjs/LedgerKeyAgent.js.map +1 -0
  16. package/dist/cjs/TrezorKeyAgent.d.ts +29 -0
  17. package/dist/cjs/TrezorKeyAgent.d.ts.map +1 -0
  18. package/dist/cjs/TrezorKeyAgent.js +134 -0
  19. package/dist/cjs/TrezorKeyAgent.js.map +1 -0
  20. package/dist/cjs/cip8/cip30signData.d.ts +22 -0
  21. package/dist/cjs/cip8/cip30signData.d.ts.map +1 -0
  22. package/dist/cjs/cip8/cip30signData.js +81 -0
  23. package/dist/cjs/cip8/cip30signData.js.map +1 -0
  24. package/dist/cjs/cip8/index.d.ts +2 -0
  25. package/dist/cjs/cip8/index.d.ts.map +1 -0
  26. package/dist/cjs/cip8/index.js +18 -0
  27. package/dist/cjs/cip8/index.js.map +1 -0
  28. package/dist/cjs/cip8/types.d.ts +4 -0
  29. package/dist/cjs/cip8/types.d.ts.map +1 -0
  30. package/dist/cjs/cip8/types.js +3 -0
  31. package/dist/cjs/cip8/types.js.map +1 -0
  32. package/dist/cjs/cip8/util.d.ts +7 -0
  33. package/dist/cjs/cip8/util.d.ts.map +1 -0
  34. package/dist/cjs/cip8/util.js +10 -0
  35. package/dist/cjs/cip8/util.js.map +1 -0
  36. package/dist/cjs/emip3.d.ts +4 -0
  37. package/dist/cjs/emip3.d.ts.map +1 -0
  38. package/dist/cjs/emip3.js +48 -0
  39. package/dist/cjs/emip3.js.map +1 -0
  40. package/dist/cjs/errors/AuthenticationError.d.ts +6 -0
  41. package/dist/cjs/errors/AuthenticationError.d.ts.map +1 -0
  42. package/dist/cjs/errors/AuthenticationError.js +16 -0
  43. package/dist/cjs/errors/AuthenticationError.js.map +1 -0
  44. package/dist/cjs/errors/HwMappingError.d.ts +6 -0
  45. package/dist/cjs/errors/HwMappingError.d.ts.map +1 -0
  46. package/dist/cjs/errors/HwMappingError.js +16 -0
  47. package/dist/cjs/errors/HwMappingError.js.map +1 -0
  48. package/dist/cjs/errors/InvalidMnemonicError.d.ts +5 -0
  49. package/dist/cjs/errors/InvalidMnemonicError.d.ts.map +1 -0
  50. package/dist/cjs/errors/InvalidMnemonicError.js +13 -0
  51. package/dist/cjs/errors/InvalidMnemonicError.js.map +1 -0
  52. package/dist/cjs/errors/InvalidSerializableDataError.d.ts +5 -0
  53. package/dist/cjs/errors/InvalidSerializableDataError.d.ts.map +1 -0
  54. package/dist/cjs/errors/InvalidSerializableDataError.js +15 -0
  55. package/dist/cjs/errors/InvalidSerializableDataError.js.map +1 -0
  56. package/dist/cjs/errors/ProofGenerationError.d.ts +6 -0
  57. package/dist/cjs/errors/ProofGenerationError.d.ts.map +1 -0
  58. package/dist/cjs/errors/ProofGenerationError.js +16 -0
  59. package/dist/cjs/errors/ProofGenerationError.js.map +1 -0
  60. package/dist/cjs/errors/TransportError.d.ts +6 -0
  61. package/dist/cjs/errors/TransportError.d.ts.map +1 -0
  62. package/dist/cjs/errors/TransportError.js +16 -0
  63. package/dist/cjs/errors/TransportError.js.map +1 -0
  64. package/dist/cjs/errors/index.d.ts +7 -0
  65. package/dist/cjs/errors/index.d.ts.map +1 -0
  66. package/dist/cjs/errors/index.js +23 -0
  67. package/dist/cjs/errors/index.js.map +1 -0
  68. package/dist/cjs/index.d.ts +12 -0
  69. package/dist/cjs/index.d.ts.map +1 -0
  70. package/dist/cjs/index.js +42 -0
  71. package/dist/cjs/index.js.map +1 -0
  72. package/dist/cjs/package.json +3 -0
  73. package/dist/cjs/restoreKeyAgent.d.ts +9 -0
  74. package/dist/cjs/restoreKeyAgent.d.ts.map +1 -0
  75. package/dist/cjs/restoreKeyAgent.js +31 -0
  76. package/dist/cjs/restoreKeyAgent.js.map +1 -0
  77. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  78. package/dist/cjs/types.d.ts +127 -0
  79. package/dist/cjs/types.d.ts.map +1 -0
  80. package/dist/cjs/types.js +43 -0
  81. package/dist/cjs/types.js.map +1 -0
  82. package/dist/cjs/util/KeyAgentTransactionSigner.d.ts +8 -0
  83. package/dist/cjs/util/KeyAgentTransactionSigner.d.ts.map +1 -0
  84. package/dist/cjs/util/KeyAgentTransactionSigner.js +38 -0
  85. package/dist/cjs/util/KeyAgentTransactionSigner.js.map +1 -0
  86. package/dist/cjs/util/bip39.d.ts +8 -0
  87. package/dist/cjs/util/bip39.d.ts.map +1 -0
  88. package/dist/cjs/util/bip39.js +39 -0
  89. package/dist/cjs/util/bip39.js.map +1 -0
  90. package/dist/cjs/util/createAsyncKeyAgent.d.ts +3 -0
  91. package/dist/cjs/util/createAsyncKeyAgent.d.ts.map +1 -0
  92. package/dist/cjs/util/createAsyncKeyAgent.js +26 -0
  93. package/dist/cjs/util/createAsyncKeyAgent.js.map +1 -0
  94. package/dist/cjs/util/index.d.ts +8 -0
  95. package/dist/cjs/util/index.d.ts.map +1 -0
  96. package/dist/cjs/util/index.js +24 -0
  97. package/dist/cjs/util/index.js.map +1 -0
  98. package/dist/cjs/util/key.d.ts +11 -0
  99. package/dist/cjs/util/key.d.ts.map +1 -0
  100. package/dist/cjs/util/key.js +30 -0
  101. package/dist/cjs/util/key.js.map +1 -0
  102. package/dist/cjs/util/mapHardwareSigningData.d.ts +38 -0
  103. package/dist/cjs/util/mapHardwareSigningData.d.ts.map +1 -0
  104. package/dist/cjs/util/mapHardwareSigningData.js +864 -0
  105. package/dist/cjs/util/mapHardwareSigningData.js.map +1 -0
  106. package/dist/cjs/util/ownSignatureKeyPaths.d.ts +4 -0
  107. package/dist/cjs/util/ownSignatureKeyPaths.d.ts.map +1 -0
  108. package/dist/cjs/util/ownSignatureKeyPaths.js +24 -0
  109. package/dist/cjs/util/ownSignatureKeyPaths.js.map +1 -0
  110. package/dist/cjs/util/stubSignTransaction.d.ts +4 -0
  111. package/dist/cjs/util/stubSignTransaction.d.ts.map +1 -0
  112. package/dist/cjs/util/stubSignTransaction.js +23 -0
  113. package/dist/cjs/util/stubSignTransaction.js.map +1 -0
  114. package/dist/esm/InMemoryKeyAgent.d.ts +23 -0
  115. package/dist/esm/InMemoryKeyAgent.d.ts.map +1 -0
  116. package/dist/esm/InMemoryKeyAgent.js +106 -0
  117. package/dist/esm/InMemoryKeyAgent.js.map +1 -0
  118. package/dist/esm/KeyAgentBase.d.ts +20 -0
  119. package/dist/esm/KeyAgentBase.d.ts.map +1 -0
  120. package/dist/esm/KeyAgentBase.js +73 -0
  121. package/dist/esm/KeyAgentBase.js.map +1 -0
  122. package/dist/esm/LedgerKeyAgent.d.ts +42 -0
  123. package/dist/esm/LedgerKeyAgent.d.ts.map +1 -0
  124. package/dist/esm/LedgerKeyAgent.js +178 -0
  125. package/dist/esm/LedgerKeyAgent.js.map +1 -0
  126. package/dist/esm/TrezorKeyAgent.d.ts +29 -0
  127. package/dist/esm/TrezorKeyAgent.d.ts.map +1 -0
  128. package/dist/esm/TrezorKeyAgent.js +127 -0
  129. package/dist/esm/TrezorKeyAgent.js.map +1 -0
  130. package/dist/esm/cip8/cip30signData.d.ts +22 -0
  131. package/dist/esm/cip8/cip30signData.d.ts.map +1 -0
  132. package/dist/esm/cip8/cip30signData.js +76 -0
  133. package/dist/esm/cip8/cip30signData.js.map +1 -0
  134. package/dist/esm/cip8/index.d.ts +2 -0
  135. package/dist/esm/cip8/index.d.ts.map +1 -0
  136. package/dist/esm/cip8/index.js +2 -0
  137. package/dist/esm/cip8/index.js.map +1 -0
  138. package/dist/esm/cip8/types.d.ts +4 -0
  139. package/dist/esm/cip8/types.d.ts.map +1 -0
  140. package/dist/esm/cip8/types.js +2 -0
  141. package/dist/esm/cip8/types.js.map +1 -0
  142. package/dist/esm/cip8/util.d.ts +7 -0
  143. package/dist/esm/cip8/util.d.ts.map +1 -0
  144. package/dist/esm/cip8/util.js +7 -0
  145. package/dist/esm/cip8/util.js.map +1 -0
  146. package/dist/esm/emip3.d.ts +4 -0
  147. package/dist/esm/emip3.d.ts.map +1 -0
  148. package/dist/esm/emip3.js +39 -0
  149. package/dist/esm/emip3.js.map +1 -0
  150. package/dist/esm/errors/AuthenticationError.d.ts +6 -0
  151. package/dist/esm/errors/AuthenticationError.d.ts.map +1 -0
  152. package/dist/esm/errors/AuthenticationError.js +12 -0
  153. package/dist/esm/errors/AuthenticationError.js.map +1 -0
  154. package/dist/esm/errors/HwMappingError.d.ts +6 -0
  155. package/dist/esm/errors/HwMappingError.d.ts.map +1 -0
  156. package/dist/esm/errors/HwMappingError.js +12 -0
  157. package/dist/esm/errors/HwMappingError.js.map +1 -0
  158. package/dist/esm/errors/InvalidMnemonicError.d.ts +5 -0
  159. package/dist/esm/errors/InvalidMnemonicError.d.ts.map +1 -0
  160. package/dist/esm/errors/InvalidMnemonicError.js +9 -0
  161. package/dist/esm/errors/InvalidMnemonicError.js.map +1 -0
  162. package/dist/esm/errors/InvalidSerializableDataError.d.ts +5 -0
  163. package/dist/esm/errors/InvalidSerializableDataError.d.ts.map +1 -0
  164. package/dist/esm/errors/InvalidSerializableDataError.js +11 -0
  165. package/dist/esm/errors/InvalidSerializableDataError.js.map +1 -0
  166. package/dist/esm/errors/ProofGenerationError.d.ts +6 -0
  167. package/dist/esm/errors/ProofGenerationError.d.ts.map +1 -0
  168. package/dist/esm/errors/ProofGenerationError.js +12 -0
  169. package/dist/esm/errors/ProofGenerationError.js.map +1 -0
  170. package/dist/esm/errors/TransportError.d.ts +6 -0
  171. package/dist/esm/errors/TransportError.d.ts.map +1 -0
  172. package/dist/esm/errors/TransportError.js +12 -0
  173. package/dist/esm/errors/TransportError.js.map +1 -0
  174. package/dist/esm/errors/index.d.ts +7 -0
  175. package/dist/esm/errors/index.d.ts.map +1 -0
  176. package/dist/esm/errors/index.js +7 -0
  177. package/dist/esm/errors/index.js.map +1 -0
  178. package/dist/esm/index.d.ts +12 -0
  179. package/dist/esm/index.d.ts.map +1 -0
  180. package/dist/esm/index.js +12 -0
  181. package/dist/esm/index.js.map +1 -0
  182. package/dist/esm/package.json +3 -0
  183. package/dist/esm/restoreKeyAgent.d.ts +9 -0
  184. package/dist/esm/restoreKeyAgent.d.ts.map +1 -0
  185. package/dist/esm/restoreKeyAgent.js +27 -0
  186. package/dist/esm/restoreKeyAgent.js.map +1 -0
  187. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  188. package/dist/esm/types.d.ts +127 -0
  189. package/dist/esm/types.d.ts.map +1 -0
  190. package/dist/esm/types.js +40 -0
  191. package/dist/esm/types.js.map +1 -0
  192. package/dist/esm/util/KeyAgentTransactionSigner.d.ts +8 -0
  193. package/dist/esm/util/KeyAgentTransactionSigner.d.ts.map +1 -0
  194. package/dist/esm/util/KeyAgentTransactionSigner.js +34 -0
  195. package/dist/esm/util/KeyAgentTransactionSigner.js.map +1 -0
  196. package/dist/esm/util/bip39.d.ts +8 -0
  197. package/dist/esm/util/bip39.d.ts.map +1 -0
  198. package/dist/esm/util/bip39.js +8 -0
  199. package/dist/esm/util/bip39.js.map +1 -0
  200. package/dist/esm/util/createAsyncKeyAgent.d.ts +3 -0
  201. package/dist/esm/util/createAsyncKeyAgent.d.ts.map +1 -0
  202. package/dist/esm/util/createAsyncKeyAgent.js +22 -0
  203. package/dist/esm/util/createAsyncKeyAgent.js.map +1 -0
  204. package/dist/esm/util/index.d.ts +8 -0
  205. package/dist/esm/util/index.d.ts.map +1 -0
  206. package/dist/esm/util/index.js +8 -0
  207. package/dist/esm/util/index.js.map +1 -0
  208. package/dist/esm/util/key.d.ts +11 -0
  209. package/dist/esm/util/key.d.ts.map +1 -0
  210. package/dist/esm/util/key.js +24 -0
  211. package/dist/esm/util/key.js.map +1 -0
  212. package/dist/esm/util/mapHardwareSigningData.d.ts +38 -0
  213. package/dist/esm/util/mapHardwareSigningData.d.ts.map +1 -0
  214. package/dist/esm/util/mapHardwareSigningData.js +833 -0
  215. package/dist/esm/util/mapHardwareSigningData.js.map +1 -0
  216. package/dist/esm/util/ownSignatureKeyPaths.d.ts +4 -0
  217. package/dist/esm/util/ownSignatureKeyPaths.d.ts.map +1 -0
  218. package/dist/esm/util/ownSignatureKeyPaths.js +17 -0
  219. package/dist/esm/util/ownSignatureKeyPaths.js.map +1 -0
  220. package/dist/esm/util/stubSignTransaction.d.ts +4 -0
  221. package/dist/esm/util/stubSignTransaction.d.ts.map +1 -0
  222. package/dist/esm/util/stubSignTransaction.js +16 -0
  223. package/dist/esm/util/stubSignTransaction.js.map +1 -0
  224. package/package.json +81 -0
@@ -0,0 +1,864 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.txToTrezor = exports.txToLedger = void 0;
30
+ const ledger = __importStar(require("@cardano-foundation/ledgerjs-hw-app-cardano"));
31
+ const trezor = __importStar(require("trezor-connect"));
32
+ const core_1 = require("@cardano-sdk/core");
33
+ const types_1 = require("../types");
34
+ const errors_1 = require("../errors");
35
+ const key_1 = require("./key");
36
+ const util_1 = require("@cardano-sdk/util");
37
+ const concat_1 = __importDefault(require("lodash/concat"));
38
+ const uniq_1 = __importDefault(require("lodash/uniq"));
39
+ const sortTokensCanonically = (tokens) => {
40
+ tokens.sort((a, b) => {
41
+ const assetNameA = 'assetNameBytes' in a ? a.assetNameBytes : a.assetNameHex;
42
+ const assetNameB = 'assetNameBytes' in b ? b.assetNameBytes : b.assetNameHex;
43
+ if (assetNameA.length === assetNameB.length) {
44
+ return assetNameA > assetNameB ? 1 : -1;
45
+ }
46
+ else if (assetNameA.length > assetNameB.length)
47
+ return 1;
48
+ return -1;
49
+ });
50
+ };
51
+ const getRewardAccountKeyHash = (rewardAccount) => Buffer.from(core_1.CSL.RewardAddress.from_address(core_1.CSL.Address.from_bech32(rewardAccount.toString()))
52
+ .payment_cred()
53
+ .to_keyhash()
54
+ .to_bytes()).toString('hex');
55
+ const bytesToIp = (bytes) => {
56
+ if (!bytes)
57
+ return null;
58
+ if (bytes.length === 4) {
59
+ return bytes.join('.');
60
+ }
61
+ else if (bytes.length === 16) {
62
+ let ipv6 = '';
63
+ for (let i = 0; i < bytes.length; i += 2) {
64
+ ipv6 += `${bytes[i].toString(16) + bytes[i + 1].toString(16)}:`;
65
+ }
66
+ ipv6 = ipv6.slice(0, -1);
67
+ return ipv6;
68
+ }
69
+ return null;
70
+ };
71
+ const matchGroupedAddress = (knownAddresses, outputAddress) => {
72
+ const outputAddressBech32 = ledger.utils.bech32_encodeAddress(outputAddress);
73
+ return knownAddresses.find(({ address }) => address.toString() === outputAddressBech32);
74
+ };
75
+ const prepareTrezorInputs = async (inputs, inputResolver, knownAddresses) => {
76
+ const trezorInputs = [];
77
+ for (let i = 0; i < inputs.len(); i++) {
78
+ const input = inputs.get(i);
79
+ const coreInput = core_1.cslToCore.txIn(input);
80
+ const paymentAddress = await inputResolver.resolveInputAddress(coreInput);
81
+ let trezorInput = {
82
+ prev_hash: Buffer.from(input.transaction_id().to_bytes()).toString('hex'),
83
+ prev_index: input.index()
84
+ };
85
+ let paymentKeyPath = null;
86
+ if (paymentAddress) {
87
+ const knownAddress = knownAddresses.find(({ address }) => address === paymentAddress);
88
+ if (knownAddress) {
89
+ paymentKeyPath = [
90
+ (0, key_1.harden)(types_1.CardanoKeyConst.PURPOSE),
91
+ (0, key_1.harden)(types_1.CardanoKeyConst.COIN_TYPE),
92
+ (0, key_1.harden)(knownAddress.accountIndex),
93
+ knownAddress.type,
94
+ knownAddress.index
95
+ ];
96
+ trezorInput = {
97
+ ...trezorInput,
98
+ path: paymentKeyPath
99
+ };
100
+ }
101
+ }
102
+ trezorInputs.push(trezorInput);
103
+ }
104
+ return trezorInputs;
105
+ };
106
+ const prepareTrezorOutputs = (outputs, knownAddresses) => {
107
+ const trezorOutputs = [];
108
+ for (let i = 0; i < outputs.len(); i++) {
109
+ const output = outputs.get(i);
110
+ const multiAsset = output.amount().multiasset();
111
+ const tokenBundle = [];
112
+ if (multiAsset) {
113
+ for (let j = 0; j < multiAsset.keys().len(); j++) {
114
+ const policy = multiAsset.keys().get(j);
115
+ const assets = multiAsset.get(policy);
116
+ const tokens = [];
117
+ if (assets) {
118
+ for (let k = 0; k < assets.keys().len(); k++) {
119
+ const assetName = assets.keys().get(k);
120
+ const amount = assets.get(assetName);
121
+ if (assetName && amount) {
122
+ tokens.push({
123
+ amount: amount.to_str(),
124
+ assetNameBytes: Buffer.from(assetName.name()).toString('hex')
125
+ });
126
+ }
127
+ }
128
+ }
129
+ sortTokensCanonically(tokens);
130
+ tokenBundle.push({
131
+ policyId: Buffer.from(policy.to_bytes()).toString('hex'),
132
+ tokenAmounts: tokens
133
+ });
134
+ }
135
+ }
136
+ const outputAddress = Buffer.from(output.address().to_bytes());
137
+ const ownAddress = matchGroupedAddress(knownAddresses, outputAddress);
138
+ const destination = ownAddress
139
+ ? {
140
+ addressParameters: {
141
+ addressType: trezor.CardanoAddressType.BASE,
142
+ path: `m/${types_1.CardanoKeyConst.PURPOSE}'/${types_1.CardanoKeyConst.COIN_TYPE}'/${ownAddress.accountIndex}'/${ownAddress.type}/${ownAddress.index}`,
143
+ stakingPath: `m/${types_1.CardanoKeyConst.PURPOSE}'/${types_1.CardanoKeyConst.COIN_TYPE}'/${ownAddress.accountIndex}'/${key_1.STAKE_KEY_DERIVATION_PATH.role}/${key_1.STAKE_KEY_DERIVATION_PATH.index}`
144
+ }
145
+ }
146
+ : {
147
+ address: output.address().to_bech32()
148
+ };
149
+ const outputRes = {
150
+ ...destination,
151
+ amount: output.amount().coin().to_str(),
152
+ tokenBundle
153
+ };
154
+ trezorOutputs.push(outputRes);
155
+ }
156
+ return trezorOutputs;
157
+ };
158
+ const prepareTrezorCertificates = (certificates, rewardAccountKeyPath, rewardAccountKeyHash) => {
159
+ let signingMode;
160
+ const certs = [];
161
+ for (let i = 0; i < certificates.len(); i++) {
162
+ const cert = certificates.get(i);
163
+ const certificate = {};
164
+ if (cert.kind() === 0) {
165
+ const credential = cert.as_stake_registration()?.stake_credential();
166
+ const credentialScriptHash = credential?.to_scripthash();
167
+ certificate.type = trezor.CardanoCertificateType.STAKE_REGISTRATION;
168
+ if (credential?.kind() === 0) {
169
+ certificate.path = rewardAccountKeyPath;
170
+ }
171
+ else if (credential && credentialScriptHash) {
172
+ certificate.scriptHash = Buffer.from(credentialScriptHash.to_bytes()).toString('hex');
173
+ }
174
+ }
175
+ else if (cert.kind() === 1) {
176
+ const credential = cert.as_stake_deregistration()?.stake_credential();
177
+ const credentialScriptHash = credential?.to_scripthash();
178
+ certificate.type = trezor.CardanoCertificateType.STAKE_DEREGISTRATION;
179
+ if (credential?.kind() === 0) {
180
+ certificate.path = rewardAccountKeyPath;
181
+ }
182
+ else if (credential && credentialScriptHash) {
183
+ certificate.scriptHash = Buffer.from(credentialScriptHash.to_bytes()).toString('hex');
184
+ }
185
+ }
186
+ else if (cert.kind() === 2) {
187
+ const delegation = cert.as_stake_delegation();
188
+ const delegationPoolKeyHash = delegation?.pool_keyhash();
189
+ const credential = delegation?.stake_credential();
190
+ const credentialScriptHash = credential?.to_scripthash();
191
+ certificate.type = trezor.CardanoCertificateType.STAKE_DELEGATION;
192
+ if (credential?.kind() === 0) {
193
+ certificate.path = rewardAccountKeyPath;
194
+ }
195
+ else if (credentialScriptHash) {
196
+ certificate.scriptHash = Buffer.from(credentialScriptHash.to_bytes()).toString('hex');
197
+ }
198
+ if (delegationPoolKeyHash) {
199
+ certificate.pool = Buffer.from(delegationPoolKeyHash.to_bytes()).toString('hex');
200
+ }
201
+ }
202
+ else if (cert.kind() === 3) {
203
+ const params = cert.as_pool_registration()?.pool_params();
204
+ if (!params) {
205
+ throw new errors_1.HwMappingError('Missing pool registration pool parameters.');
206
+ }
207
+ certificate.type = trezor.CardanoCertificateType.STAKE_POOL_REGISTRATION;
208
+ const owners = params?.pool_owners();
209
+ const poolOwners = [];
210
+ if (owners) {
211
+ for (let j = 0; j < owners.len(); j++) {
212
+ const keyHash = Buffer.from(owners.get(j).to_bytes()).toString('hex');
213
+ if (keyHash === rewardAccountKeyHash) {
214
+ signingMode = trezor.CardanoTxSigningMode.POOL_REGISTRATION_AS_OWNER;
215
+ poolOwners.push({
216
+ stakingKeyPath: rewardAccountKeyPath
217
+ });
218
+ }
219
+ else {
220
+ poolOwners.push({
221
+ stakingKeyHash: keyHash
222
+ });
223
+ }
224
+ }
225
+ }
226
+ const relays = params?.relays();
227
+ const trezorRelays = [];
228
+ if (relays) {
229
+ for (let k = 0; k < relays.len(); k++) {
230
+ const relay = relays.get(k);
231
+ if (relay.kind() === 0) {
232
+ const singleHostAddr = relay.as_single_host_addr();
233
+ const type = trezor.CardanoPoolRelayType.SINGLE_HOST_IP;
234
+ const port = singleHostAddr?.port();
235
+ const ipv4Address = singleHostAddr?.ipv4() ? bytesToIp(singleHostAddr.ipv4()?.ip()) : null;
236
+ const ipv6Address = singleHostAddr?.ipv6() ? bytesToIp(singleHostAddr.ipv6()?.ip()) : null;
237
+ trezorRelays.push({
238
+ ipv4Address: ipv4Address || undefined,
239
+ ipv6Address: ipv6Address || undefined,
240
+ port,
241
+ type
242
+ });
243
+ }
244
+ else if (relay.kind() === 1) {
245
+ const type = trezor.CardanoPoolRelayType.SINGLE_HOST_NAME;
246
+ const singleHostName = relay.as_single_host_name();
247
+ if (singleHostName) {
248
+ const port = singleHostName.port();
249
+ const hostName = singleHostName.dns_name().record();
250
+ trezorRelays.push({
251
+ hostName,
252
+ port,
253
+ type
254
+ });
255
+ }
256
+ }
257
+ else if (relay.kind() === 2) {
258
+ const type = trezor.CardanoPoolRelayType.MULTIPLE_HOST_NAME;
259
+ const multiHostName = relay.as_multi_host_name();
260
+ const hostName = multiHostName?.dns_name().record();
261
+ if (hostName) {
262
+ trezorRelays.push({
263
+ hostName,
264
+ type
265
+ });
266
+ }
267
+ }
268
+ }
269
+ }
270
+ const cost = params?.cost().to_str();
271
+ const margin = params?.margin();
272
+ const pledge = params?.pledge().to_str();
273
+ const poolId = Buffer.from(params.operator().to_bytes()).toString('hex');
274
+ const poolMetadata = params.pool_metadata();
275
+ if (!poolMetadata) {
276
+ throw new errors_1.HwMappingError('Missing pool metadata.');
277
+ }
278
+ const metadata = {
279
+ hash: Buffer.from(poolMetadata.pool_metadata_hash().to_bytes()).toString('hex'),
280
+ url: poolMetadata.url().url()
281
+ };
282
+ const rewardAccount = params.reward_account().to_address().to_bech32();
283
+ const vrfKeyHash = Buffer.from(params.vrf_keyhash().to_bytes()).toString('hex');
284
+ certificate.poolParameters = {
285
+ cost,
286
+ margin: {
287
+ denominator: margin.denominator().to_str(),
288
+ numerator: margin.numerator().to_str()
289
+ },
290
+ metadata,
291
+ owners: poolOwners,
292
+ pledge,
293
+ poolId,
294
+ relays: trezorRelays,
295
+ rewardAccount,
296
+ vrfKeyHash
297
+ };
298
+ }
299
+ certs.push(certificate);
300
+ }
301
+ return {
302
+ certs,
303
+ signingMode
304
+ };
305
+ };
306
+ const prepareTrezorWithdrawals = (withdrawals, rewardAccountKeyPath) => {
307
+ const trezorWithdrawals = [];
308
+ for (let i = 0; i < withdrawals.keys().len(); i++) {
309
+ const withdrawal = {};
310
+ const rewardAddress = withdrawals.keys().get(i);
311
+ const paymentCredentials = rewardAddress.payment_cred();
312
+ const paymentCredentialsScriptHash = paymentCredentials.to_scripthash();
313
+ if (rewardAddress.payment_cred().kind() === 0) {
314
+ withdrawal.path = rewardAccountKeyPath;
315
+ }
316
+ else if (paymentCredentialsScriptHash) {
317
+ withdrawal.scriptHash = Buffer.from(paymentCredentialsScriptHash.to_bytes()).toString('hex');
318
+ }
319
+ const withdrawalAmount = withdrawals.get(rewardAddress);
320
+ if (!withdrawalAmount) {
321
+ throw new errors_1.HwMappingError('Withdrawal amount is not defined.');
322
+ }
323
+ withdrawal.amount = withdrawalAmount.to_str();
324
+ trezorWithdrawals.push(withdrawal);
325
+ }
326
+ return trezorWithdrawals;
327
+ };
328
+ const prepareTrezorMintBundle = (mint, paymentKeyPaths, rewardAccountKeyPath) => {
329
+ const additionalWitnessPaths = [];
330
+ const mintAssetsGroup = [];
331
+ for (let j = 0; j < mint.keys().len(); j++) {
332
+ const policy = mint.keys().get(j);
333
+ const assets = mint.get(policy);
334
+ const tokens = [];
335
+ if (assets) {
336
+ for (let k = 0; k < assets.keys().len(); k++) {
337
+ const assetName = assets.keys().get(k);
338
+ const amount = assets.get(assetName);
339
+ const positiveAmount = amount?.as_positive()?.to_str();
340
+ const negativeAmount = amount?.as_negative()?.to_str();
341
+ if (!amount || !positiveAmount || !negativeAmount) {
342
+ throw new errors_1.HwMappingError('Missing token amount.');
343
+ }
344
+ tokens.push({
345
+ amount: amount.is_positive() ? positiveAmount : `-${negativeAmount}`,
346
+ assetNameBytes: Buffer.from(assetName.name()).toString('hex')
347
+ });
348
+ }
349
+ }
350
+ sortTokensCanonically(tokens);
351
+ mintAssetsGroup.push({
352
+ policyId: Buffer.from(policy.to_bytes()).toString('hex'),
353
+ tokenAmounts: tokens
354
+ });
355
+ }
356
+ if (paymentKeyPaths)
357
+ (0, concat_1.default)(additionalWitnessPaths, paymentKeyPaths);
358
+ if (rewardAccountKeyPath)
359
+ additionalWitnessPaths.push(rewardAccountKeyPath);
360
+ return {
361
+ additionalWitnessPaths,
362
+ mintAssetsGroup
363
+ };
364
+ };
365
+ const prepareLedgerInputs = async (inputs, inputResolver, knownAddresses) => {
366
+ const ledgerInputs = [];
367
+ for (let i = 0; i < inputs.len(); i++) {
368
+ const input = inputs.get(i);
369
+ const coreInput = core_1.cslToCore.txIn(input);
370
+ const paymentAddress = await inputResolver.resolveInputAddress(coreInput);
371
+ let paymentKeyPath = null;
372
+ if (paymentAddress) {
373
+ const knownAddress = knownAddresses.find(({ address }) => address === paymentAddress);
374
+ if (knownAddress) {
375
+ paymentKeyPath = [
376
+ (0, key_1.harden)(types_1.CardanoKeyConst.PURPOSE),
377
+ (0, key_1.harden)(types_1.CardanoKeyConst.COIN_TYPE),
378
+ (0, key_1.harden)(knownAddress.accountIndex),
379
+ knownAddress.type,
380
+ knownAddress.index
381
+ ];
382
+ }
383
+ }
384
+ ledgerInputs.push({
385
+ outputIndex: input.index(),
386
+ path: paymentKeyPath,
387
+ txHashHex: Buffer.from(input.transaction_id().to_bytes()).toString('hex')
388
+ });
389
+ }
390
+ return ledgerInputs;
391
+ };
392
+ const prepareLedgerOutputs = (outputs, knownAddresses) => {
393
+ const ledgerOutputs = [];
394
+ for (let i = 0; i < outputs.len(); i++) {
395
+ const output = outputs.get(i);
396
+ const multiAsset = output.amount().multiasset();
397
+ const tokenBundle = [];
398
+ if (multiAsset) {
399
+ for (let j = 0; j < multiAsset.keys().len(); j++) {
400
+ const policy = multiAsset.keys().get(j);
401
+ const assets = multiAsset.get(policy);
402
+ const tokens = [];
403
+ if (assets) {
404
+ for (let k = 0; k < assets.keys().len(); k++) {
405
+ const assetName = assets.keys().get(k);
406
+ const amount = assets.get(assetName);
407
+ if (assetName && amount) {
408
+ tokens.push({
409
+ amount: amount.to_str(),
410
+ assetNameHex: Buffer.from(assetName.name()).toString('hex')
411
+ });
412
+ }
413
+ }
414
+ }
415
+ sortTokensCanonically(tokens);
416
+ tokenBundle.push({
417
+ policyIdHex: Buffer.from(policy.to_bytes()).toString('hex'),
418
+ tokens
419
+ });
420
+ }
421
+ }
422
+ const outputAddress = Buffer.from(output.address().to_bytes());
423
+ const ownAddress = matchGroupedAddress(knownAddresses, outputAddress);
424
+ const destination = ownAddress
425
+ ? {
426
+ params: {
427
+ params: {
428
+ spendingPath: [
429
+ (0, key_1.harden)(types_1.CardanoKeyConst.PURPOSE),
430
+ (0, key_1.harden)(types_1.CardanoKeyConst.COIN_TYPE),
431
+ (0, key_1.harden)(ownAddress.accountIndex),
432
+ ownAddress.type,
433
+ ownAddress.index
434
+ ],
435
+ stakingPath: [
436
+ (0, key_1.harden)(types_1.CardanoKeyConst.PURPOSE),
437
+ (0, key_1.harden)(types_1.CardanoKeyConst.COIN_TYPE),
438
+ (0, key_1.harden)(ownAddress.accountIndex),
439
+ key_1.STAKE_KEY_DERIVATION_PATH.role,
440
+ key_1.STAKE_KEY_DERIVATION_PATH.index
441
+ ]
442
+ },
443
+ type: ledger.AddressType.BASE_PAYMENT_KEY_STAKE_KEY
444
+ },
445
+ type: ledger.TxOutputDestinationType.DEVICE_OWNED
446
+ }
447
+ : {
448
+ params: {
449
+ addressHex: outputAddress.toString('hex')
450
+ },
451
+ type: ledger.TxOutputDestinationType.THIRD_PARTY
452
+ };
453
+ const outputDataHash = output.data_hash();
454
+ const datumHashHex = outputDataHash ? Buffer.from(outputDataHash.to_bytes()).toString('hex') : null;
455
+ const outputRes = {
456
+ amount: output.amount().coin().to_str(),
457
+ datumHashHex,
458
+ destination,
459
+ tokenBundle
460
+ };
461
+ ledgerOutputs.push(outputRes);
462
+ }
463
+ return ledgerOutputs;
464
+ };
465
+ const prepareLedgerCertificates = (certificates, knownAddresses, rewardAccountKeyPath, rewardAccountKeyHash) => {
466
+ let signingMode;
467
+ const certs = [];
468
+ for (let i = 0; i < certificates.len(); i++) {
469
+ const cert = certificates.get(i);
470
+ const certificate = {};
471
+ if (cert.kind() === 0) {
472
+ const credential = cert.as_stake_registration()?.stake_credential();
473
+ const credentialScriptHash = credential?.to_scripthash();
474
+ certificate.type = ledger.CertificateType.STAKE_REGISTRATION;
475
+ if (credential?.kind() === 0) {
476
+ certificate.params = {
477
+ stakeCredential: {
478
+ keyPath: rewardAccountKeyPath,
479
+ type: ledger.StakeCredentialParamsType.KEY_PATH
480
+ }
481
+ };
482
+ }
483
+ else if (credential && credentialScriptHash) {
484
+ const scriptHashHex = Buffer.from(credentialScriptHash.to_bytes()).toString('hex');
485
+ certificate.params = {
486
+ stakeCredential: {
487
+ scriptHashHex,
488
+ type: ledger.StakeCredentialParamsType.SCRIPT_HASH
489
+ }
490
+ };
491
+ }
492
+ }
493
+ else if (cert.kind() === 1) {
494
+ const credential = cert.as_stake_deregistration()?.stake_credential();
495
+ const credentialScriptHash = credential?.to_scripthash();
496
+ certificate.type = ledger.CertificateType.STAKE_DEREGISTRATION;
497
+ if (credential?.kind() === 0) {
498
+ certificate.params = {
499
+ stakeCredential: {
500
+ keyPath: rewardAccountKeyPath,
501
+ type: ledger.StakeCredentialParamsType.KEY_PATH
502
+ }
503
+ };
504
+ }
505
+ else if (credential && credentialScriptHash) {
506
+ const scriptHashHex = Buffer.from(credentialScriptHash.to_bytes()).toString('hex');
507
+ certificate.params = {
508
+ stakeCredential: {
509
+ scriptHashHex,
510
+ type: ledger.StakeCredentialParamsType.SCRIPT_HASH
511
+ }
512
+ };
513
+ }
514
+ }
515
+ else if (cert.kind() === 2) {
516
+ const delegation = cert.as_stake_delegation();
517
+ const delegationPoolKeyHash = delegation?.pool_keyhash();
518
+ const credential = delegation?.stake_credential();
519
+ const credentialScriptHash = credential?.to_scripthash();
520
+ certificate.type = ledger.CertificateType.STAKE_DELEGATION;
521
+ if (credential?.kind() === 0) {
522
+ certificate.params = {
523
+ stakeCredential: {
524
+ keyPath: rewardAccountKeyPath,
525
+ type: ledger.StakeCredentialParamsType.KEY_PATH
526
+ }
527
+ };
528
+ }
529
+ else if (credentialScriptHash) {
530
+ const scriptHashHex = Buffer.from(credentialScriptHash.to_bytes()).toString('hex');
531
+ certificate.params = {
532
+ stakeCredential: {
533
+ scriptHashHex,
534
+ type: ledger.StakeCredentialParamsType.SCRIPT_HASH
535
+ }
536
+ };
537
+ }
538
+ if (delegationPoolKeyHash) {
539
+ certificate.params = {
540
+ ...certificate.params,
541
+ poolKeyHashHex: Buffer.from(delegationPoolKeyHash.to_bytes()).toString('hex')
542
+ };
543
+ }
544
+ }
545
+ else if (cert.kind() === 3) {
546
+ const params = cert.as_pool_registration()?.pool_params();
547
+ if (!params) {
548
+ throw new errors_1.HwMappingError('Missing pool registration pool parameters.');
549
+ }
550
+ certificate.type = ledger.CertificateType.STAKE_POOL_REGISTRATION;
551
+ const owners = params?.pool_owners();
552
+ const poolOwners = [];
553
+ if (owners) {
554
+ for (let j = 0; j < owners.len(); j++) {
555
+ const keyHash = Buffer.from(owners.get(j).to_bytes()).toString('hex');
556
+ if (keyHash === rewardAccountKeyHash) {
557
+ signingMode = ledger.TransactionSigningMode.POOL_REGISTRATION_AS_OWNER;
558
+ poolOwners.push({
559
+ params: {
560
+ stakingPath: rewardAccountKeyPath
561
+ },
562
+ type: ledger.PoolOwnerType.DEVICE_OWNED
563
+ });
564
+ }
565
+ else {
566
+ poolOwners.push({
567
+ params: {
568
+ stakingKeyHashHex: keyHash
569
+ },
570
+ type: ledger.PoolOwnerType.THIRD_PARTY
571
+ });
572
+ }
573
+ }
574
+ }
575
+ const relays = params?.relays();
576
+ const ledgerRelays = [];
577
+ if (relays) {
578
+ for (let k = 0; k < relays.len(); k++) {
579
+ const relay = relays.get(k);
580
+ if (relay.kind() === 0) {
581
+ const singleHostAddr = relay.as_single_host_addr();
582
+ const type = 0;
583
+ const portNumber = singleHostAddr?.port();
584
+ const ipv4 = singleHostAddr?.ipv4() ? bytesToIp(singleHostAddr.ipv4()?.ip()) : null;
585
+ const ipv6 = singleHostAddr?.ipv6() ? bytesToIp(singleHostAddr.ipv6()?.ip()) : null;
586
+ ledgerRelays.push({ params: { ipv4, ipv6, portNumber }, type });
587
+ }
588
+ else if (relay.kind() === 1) {
589
+ const type = 1;
590
+ const singleHostName = relay.as_single_host_name();
591
+ if (singleHostName) {
592
+ const portNumber = singleHostName.port();
593
+ const dnsName = singleHostName.dns_name().record();
594
+ ledgerRelays.push({
595
+ params: { dnsName, portNumber },
596
+ type
597
+ });
598
+ }
599
+ }
600
+ else if (relay.kind() === 2) {
601
+ const type = 2;
602
+ const multiHostName = relay.as_multi_host_name();
603
+ const dnsName = multiHostName?.dns_name().record();
604
+ if (dnsName) {
605
+ ledgerRelays.push({
606
+ params: { dnsName },
607
+ type
608
+ });
609
+ }
610
+ }
611
+ }
612
+ }
613
+ const cost = params?.cost().to_str();
614
+ const margin = params?.margin();
615
+ const pledge = params?.pledge().to_str();
616
+ const operator = Buffer.from(params.operator().to_bytes()).toString('hex');
617
+ let poolKey;
618
+ if (operator === rewardAccountKeyHash) {
619
+ signingMode = ledger.TransactionSigningMode.POOL_REGISTRATION_AS_OPERATOR;
620
+ poolKey = {
621
+ params: { path: rewardAccountKeyPath },
622
+ type: ledger.PoolKeyType.DEVICE_OWNED
623
+ };
624
+ }
625
+ else {
626
+ poolKey = {
627
+ params: { keyHashHex: operator },
628
+ type: ledger.PoolKeyType.THIRD_PARTY
629
+ };
630
+ }
631
+ const poolMetadata = params.pool_metadata();
632
+ const metadata = poolMetadata
633
+ ? {
634
+ metadataHashHex: Buffer.from(poolMetadata.pool_metadata_hash().to_bytes()).toString('hex'),
635
+ metadataUrl: poolMetadata.url().url()
636
+ }
637
+ : null;
638
+ const rewardAccountBytes = Buffer.from(params.reward_account().to_address().to_bytes());
639
+ const isDeviceOwned = knownAddresses.some(({ address }) => address.toString() === ledger.utils.bech32_encodeAddress(rewardAccountBytes));
640
+ const rewardAccount = isDeviceOwned
641
+ ? {
642
+ params: { path: rewardAccountKeyPath },
643
+ type: ledger.PoolRewardAccountType.DEVICE_OWNED
644
+ }
645
+ : {
646
+ params: { rewardAccountHex: rewardAccountBytes.toString('hex') },
647
+ type: ledger.PoolRewardAccountType.THIRD_PARTY
648
+ };
649
+ const vrfKeyHashHex = Buffer.from(params.vrf_keyhash().to_bytes()).toString('hex');
650
+ certificate.params = {
651
+ cost,
652
+ margin: {
653
+ denominator: margin.denominator().to_str(),
654
+ numerator: margin.numerator().to_str()
655
+ },
656
+ metadata,
657
+ pledge,
658
+ poolKey,
659
+ poolOwners,
660
+ relays: ledgerRelays,
661
+ rewardAccount,
662
+ vrfKeyHashHex
663
+ };
664
+ }
665
+ certs.push(certificate);
666
+ }
667
+ return {
668
+ certs,
669
+ signingMode
670
+ };
671
+ };
672
+ const prepareLedgerWithdrawals = (withdrawals, rewardAccountKeyPath) => {
673
+ const ledgerWithdrawals = [];
674
+ for (let i = 0; i < withdrawals.keys().len(); i++) {
675
+ const withdrawal = { stakeCredential: {} };
676
+ const rewardAddress = withdrawals.keys().get(i);
677
+ const paymentCredentials = rewardAddress.payment_cred();
678
+ const paymentCredentialsScriptHash = paymentCredentials.to_scripthash();
679
+ if (rewardAddress.payment_cred().kind() === 0) {
680
+ const stakeCredential = {
681
+ keyPath: rewardAccountKeyPath,
682
+ type: ledger.StakeCredentialParamsType.KEY_PATH
683
+ };
684
+ withdrawal.stakeCredential = stakeCredential;
685
+ }
686
+ else if (paymentCredentialsScriptHash) {
687
+ const stakeCredential = {
688
+ scriptHashHex: Buffer.from(paymentCredentialsScriptHash.to_bytes()).toString('hex'),
689
+ type: ledger.StakeCredentialParamsType.SCRIPT_HASH
690
+ };
691
+ withdrawal.stakeCredential = stakeCredential;
692
+ }
693
+ const withdrawalAmount = withdrawals.get(rewardAddress);
694
+ if (!withdrawalAmount) {
695
+ throw new errors_1.HwMappingError('Withdrawal amount is not defined.');
696
+ }
697
+ ledgerWithdrawals.push({
698
+ ...withdrawal,
699
+ amount: withdrawalAmount.to_str()
700
+ });
701
+ }
702
+ return ledgerWithdrawals;
703
+ };
704
+ const prepareLedgerMintBundle = (mint, paymentKeyPaths, rewardAccountKeyPath) => {
705
+ const additionalWitnessPaths = [];
706
+ const mintAssetsGroup = [];
707
+ for (let j = 0; j < mint.keys().len(); j++) {
708
+ const policy = mint.keys().get(j);
709
+ const assets = mint.get(policy);
710
+ const tokens = [];
711
+ if (assets) {
712
+ for (let k = 0; k < assets.keys().len(); k++) {
713
+ const assetName = assets.keys().get(k);
714
+ const amount = assets.get(assetName);
715
+ const positiveAmount = amount?.as_positive()?.to_str();
716
+ const negativeAmount = amount?.as_negative()?.to_str();
717
+ if (!amount || !positiveAmount || !negativeAmount) {
718
+ throw new errors_1.HwMappingError('Missing token amount.');
719
+ }
720
+ tokens.push({
721
+ amount: amount.is_positive() ? positiveAmount : `-${negativeAmount}`,
722
+ assetNameHex: Buffer.from(assetName.name()).toString('hex')
723
+ });
724
+ }
725
+ }
726
+ sortTokensCanonically(tokens);
727
+ mintAssetsGroup.push({
728
+ policyIdHex: Buffer.from(policy.to_bytes()).toString('hex'),
729
+ tokens
730
+ });
731
+ }
732
+ if (paymentKeyPaths)
733
+ (0, concat_1.default)(additionalWitnessPaths, paymentKeyPaths);
734
+ if (rewardAccountKeyPath)
735
+ additionalWitnessPaths.push(rewardAccountKeyPath);
736
+ return {
737
+ additionalWitnessPaths,
738
+ mintAssetsGroup
739
+ };
740
+ };
741
+ const txToLedger = async ({ cslTxBody, networkId, inputResolver: inputAddressResolver, knownAddresses, protocolMagic }) => {
742
+ const accountAddress = knownAddresses[0];
743
+ const rewardAccount = accountAddress.rewardAccount;
744
+ const rewardAccountKeyHash = getRewardAccountKeyHash(rewardAccount);
745
+ const rewardAccountKeyPath = [
746
+ (0, key_1.harden)(types_1.CardanoKeyConst.PURPOSE),
747
+ (0, key_1.harden)(types_1.CardanoKeyConst.COIN_TYPE),
748
+ (0, key_1.harden)(accountAddress.accountIndex),
749
+ key_1.STAKE_KEY_DERIVATION_PATH.role,
750
+ key_1.STAKE_KEY_DERIVATION_PATH.index
751
+ ];
752
+ const ledgerInputs = await prepareLedgerInputs(cslTxBody.inputs(), inputAddressResolver, knownAddresses);
753
+ const ledgerOutputs = prepareLedgerOutputs(cslTxBody.outputs(), knownAddresses);
754
+ const cslWithdrawals = cslTxBody.withdrawals();
755
+ const ledgerWithdrawals = cslWithdrawals ? prepareLedgerWithdrawals(cslWithdrawals, rewardAccountKeyPath) : null;
756
+ const cslCertificates = cslTxBody.certs();
757
+ const ledgerCertificatesData = cslCertificates
758
+ ? prepareLedgerCertificates(cslCertificates, knownAddresses, rewardAccountKeyPath, rewardAccountKeyHash.toString())
759
+ : null;
760
+ const signingMode = ledgerCertificatesData?.signingMode || ledger.TransactionSigningMode.ORDINARY_TRANSACTION;
761
+ const fee = cslTxBody.fee().to_str();
762
+ const ttl = cslTxBody.ttl();
763
+ const validityStartInterval = cslTxBody.validity_start_interval();
764
+ const txBodyAuxDataHash = cslTxBody.auxiliary_data_hash();
765
+ const auxiliaryData = txBodyAuxDataHash
766
+ ? {
767
+ params: {
768
+ hashHex: Buffer.from(txBodyAuxDataHash.to_bytes()).toString('hex')
769
+ },
770
+ type: ledger.TxAuxiliaryDataType.ARBITRARY_HASH
771
+ }
772
+ : null;
773
+ const cslMint = cslTxBody.multiassets();
774
+ let ledgerMintBundle = null;
775
+ if (cslMint) {
776
+ const paymentKeyPaths = (0, uniq_1.default)(ledgerInputs.map((ledgerInput) => ledgerInput.path).filter(util_1.isNotNil));
777
+ ledgerMintBundle = prepareLedgerMintBundle(cslMint, paymentKeyPaths, rewardAccountKeyPath);
778
+ }
779
+ const additionalWitnessPaths = ledgerMintBundle?.additionalWitnessPaths || [];
780
+ const ledgerTx = {
781
+ auxiliaryData,
782
+ certificates: ledgerCertificatesData?.certs,
783
+ fee,
784
+ inputs: ledgerInputs,
785
+ mint: ledgerMintBundle?.mintAssetsGroup,
786
+ network: {
787
+ networkId,
788
+ protocolMagic
789
+ },
790
+ outputs: ledgerOutputs,
791
+ ttl,
792
+ validityStartInterval,
793
+ withdrawals: ledgerWithdrawals
794
+ };
795
+ for (const key of Object.keys(ledgerTx)) {
796
+ const objKey = key;
797
+ !ledgerTx[objKey] && ledgerTx[objKey] !== 0 && delete ledgerTx[objKey];
798
+ }
799
+ return {
800
+ additionalWitnessPaths,
801
+ signingMode,
802
+ tx: ledgerTx
803
+ };
804
+ };
805
+ exports.txToLedger = txToLedger;
806
+ const txToTrezor = async ({ cslTxBody, networkId, inputResolver: inputAddressResolver, knownAddresses, protocolMagic }) => {
807
+ const accountAddress = knownAddresses[0];
808
+ const rewardAccount = accountAddress.rewardAccount;
809
+ const rewardAccountKeyHash = getRewardAccountKeyHash(rewardAccount);
810
+ const rewardAccountKeyPath = [
811
+ (0, key_1.harden)(types_1.CardanoKeyConst.PURPOSE),
812
+ (0, key_1.harden)(types_1.CardanoKeyConst.COIN_TYPE),
813
+ (0, key_1.harden)(accountAddress.accountIndex),
814
+ key_1.STAKE_KEY_DERIVATION_PATH.role,
815
+ key_1.STAKE_KEY_DERIVATION_PATH.index
816
+ ];
817
+ const trezorInputs = await prepareTrezorInputs(cslTxBody.inputs(), inputAddressResolver, knownAddresses);
818
+ const trezorOutputs = prepareTrezorOutputs(cslTxBody.outputs(), knownAddresses);
819
+ const cslWithdrawals = cslTxBody.withdrawals();
820
+ const trezorWithdrawals = cslWithdrawals ? prepareTrezorWithdrawals(cslWithdrawals, rewardAccountKeyPath) : undefined;
821
+ const cslCertificates = cslTxBody.certs();
822
+ let trezorCertificatesData;
823
+ if (cslCertificates) {
824
+ trezorCertificatesData = prepareTrezorCertificates(cslCertificates, rewardAccountKeyPath, rewardAccountKeyHash.toString());
825
+ }
826
+ const signingMode = trezorCertificatesData?.signingMode || trezor.CardanoTxSigningMode.ORDINARY_TRANSACTION;
827
+ const fee = cslTxBody.fee().to_str();
828
+ let ttl;
829
+ const cslTTL = cslTxBody.ttl();
830
+ if (cslTTL) {
831
+ ttl = cslTTL.toString();
832
+ }
833
+ const validityIntervalStart = cslTxBody.validity_start_interval();
834
+ const txBodyAuxDataHash = cslTxBody.auxiliary_data_hash();
835
+ let auxiliaryData;
836
+ if (txBodyAuxDataHash) {
837
+ auxiliaryData = {
838
+ hash: Buffer.from(txBodyAuxDataHash.to_bytes()).toString('hex')
839
+ };
840
+ }
841
+ const cslMint = cslTxBody.multiassets();
842
+ let trezorMintBundle = null;
843
+ if (cslMint) {
844
+ const paymentKeyPaths = (0, uniq_1.default)(trezorInputs.map((trezorInput) => trezorInput.path).filter(util_1.isNotNil));
845
+ trezorMintBundle = prepareTrezorMintBundle(cslMint, paymentKeyPaths, rewardAccountKeyPath);
846
+ }
847
+ return {
848
+ additionalWitnessRequests: trezorMintBundle?.additionalWitnessPaths,
849
+ auxiliaryData,
850
+ certificates: trezorCertificatesData?.certs,
851
+ fee,
852
+ inputs: trezorInputs,
853
+ mint: trezorMintBundle?.mintAssetsGroup,
854
+ networkId,
855
+ outputs: trezorOutputs,
856
+ protocolMagic,
857
+ signingMode,
858
+ ttl,
859
+ validityIntervalStart: validityIntervalStart?.toString(),
860
+ withdrawals: trezorWithdrawals
861
+ };
862
+ };
863
+ exports.txToTrezor = txToTrezor;
864
+ //# sourceMappingURL=mapHardwareSigningData.js.map