Skip to content
This repository was archived by the owner on Aug 12, 2022. It is now read-only.

Commit 875324c

Browse files
committed
Add support for Cardano
1 parent db58b5b commit 875324c

File tree

4 files changed

+147
-0
lines changed

4 files changed

+147
-0
lines changed

API.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ Note that the lenght of the action is not tied to the actual device actions. You
152152
| getEntropy | size:&nbsp;number | Promise&lt;Response<br>&lt;{ bytes:&nbsp;string }&gt;&gt;&gt; | random data |
153153
| getAddress | path:&nbsp;Array&lt;number&gt;<br>coin:&nbsp;string<br>display:&nbsp;boolean | Promise&lt;Response<br>&lt;{ address:&nbsp;string }&gt;&gt;&gt; | Gets address with a given path.<br>Coin is the name of coin ("bitcoin", "testnet", "litecoin",...)<br>if `display` is true, the address is displayed on TREZOR and user has to confirm. |
154154
| ethereumGetAddress | address_n:&nbsp;Array&lt;number&gt;<br>display:&nbsp;?boolean | Promise&lt;Response<br>&lt;{ address:&nbsp;string, path:&nbsp;Array&lt;number&gt; }&gt;&gt; | Gets Ethereum address from a given path.<br>if `display` is true, the address is displayed on TREZOR and user has to confirm. |
155+
| adaGetAddress | address_n:&nbsp;Array&lt;number&gt;<br>show_display:&nbsp;?boolean | Promise&lt;MessageResponse<br>&lt;trezor.CardanoAddress&gt;&gt; | Gets Cardano address<br>if `show_display` is true, the address is displayed on TREZOR and user has to confirm. |
156+
| getAdaPublicKey | address_n:&nbsp;Array&lt;number&gt; | Promise&lt;MessageResponse<br>&lt;trezor.CardanoPublicKey&gt;&gt; | Gets Cardano public node and root hd passphrase from a given path. |
157+
| verifyAdaMessage | publicKey:&nbsp;string<br>signature:&nbsp;string<br>message:&nbsp;string | Promise&lt;MessageResponse&lt;trezor.Success&gt;&gt; | Verifies Cardano message against public key and signature. |
158+
| signAdaMessage | address_n:&nbsp;Array&lt;number&gt;<br>message:&nbsp;string | Promise&lt;MessageResponse&lt;trezor.MessageSignature&gt;&gt; | Sign Cardano message with keys from given path. |
159+
| signAdaTransaction | inputs:&nbsp;Array&lt;trezor.CardanoTxInputType&gt;<br>outputs:&nbsp;Array&lt;trezor.CardanoTxOutputType&gt;<br>transactions:&nbsp;Array&lt;string&gt; | Promise&lt;MessageResponse&lt;trezor.CardanoSignedTransaction&gt;&gt; | For provided inputs, outputs, raw transactions bodies will sign transaction |
155160
| verifyAddress | path:&nbsp;Array&lt;number&gt;<br>refAddress:&nbsp;string&nbsp;<br>coin:&nbsp;string&nbsp; | Promise&lt;boolean&gt; | Gets address with the given path, displays it on display and compares to the `refAddress`.<br><br>Note: promise doesn't reject on different result, but resolves with **false**. It rejects on user not confirming on device. |
156161
| getHDNode | path:&nbsp;Array&lt;number&gt;<br>coin:&nbsp;string&nbsp; | Promise&lt;HDNode&gt; | Returns [bitcoin.js HDNode](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/src/hdnode.js) with the given path. (No confirmation needed; it's public node.) |
157162
| wipeDevice | | Promise | Wipes the device (after user confirms). |

src/session.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import * as hdnodeUtils from './utils/hdnode';
99
import * as signTxHelper from './utils/signtx';
1010
import * as signBjsTxHelper from './utils/signbjstx';
1111
import * as signEthTxHelper from './utils/signethtx';
12+
import * as signAdaTxHelper from './utils/signadatx';
1213
import {CallHelper} from './utils/call';
1314

1415
import * as trezor from './trezortypes';
@@ -165,6 +166,35 @@ export default class Session extends EventEmitter {
165166
});
166167
}
167168

169+
@integrityCheck
170+
adaGetAddress(
171+
address_n: Array<number>,
172+
show_display: ?boolean
173+
): Promise<MessageResponse<trezor.CardanoAddress>> {
174+
return this.typedCall('CardanoGetAddress', 'CardanoAddress', {
175+
address_n,
176+
show_display: !!show_display,
177+
});
178+
}
179+
180+
@integrityCheck
181+
getAdaPublicKey(
182+
address_n: Array<number>,
183+
): Promise<MessageResponse<trezor.CardanoPublicKey>> {
184+
return this.typedCall('CardanoGetPublicKey', 'CardanoPublicKey', {
185+
address_n: address_n,
186+
});
187+
}
188+
189+
@integrityCheck
190+
signAdaTransaction(
191+
inputs: Array<trezor.CardanoTxInputType>,
192+
outputs: Array<trezor.CardanoTxOutputType>,
193+
transactions: Array<string>
194+
): Promise<MessageResponse<trezor.CardanoSignedTransaction>> {
195+
return signAdaTxHelper.signAdaTx(this, inputs, outputs, transactions);
196+
}
197+
168198
@integrityCheck
169199
getPublicKey(
170200
address_n: Array<number>,
@@ -295,6 +325,19 @@ export default class Session extends EventEmitter {
295325
});
296326
}
297327

328+
@integrityCheck
329+
verifyAdaMessage(
330+
publicKey: string,
331+
signature: string,
332+
message: string
333+
): Promise<MessageResponse<trezor.Success>> {
334+
return this.typedCall('CardanoVerifyMessage', 'Success', {
335+
public_key: publicKey,
336+
signature: signature,
337+
message: message,
338+
});
339+
}
340+
298341
signMessage(
299342
address_n: Array<number>,
300343
message: string,
@@ -319,6 +362,17 @@ export default class Session extends EventEmitter {
319362
});
320363
}
321364

365+
@integrityCheck
366+
signAdaMessage(
367+
address_n: Array<number>,
368+
message: string
369+
): Promise<MessageResponse<trezor.MessageSignature>> {
370+
return this.typedCall('CardanoSignMessage', 'CardanoMessageSignature', {
371+
address_n: address_n,
372+
message: message,
373+
});
374+
}
375+
322376
signIdentity(
323377
identity: trezor.Identity,
324378
challenge_hidden: string,

src/trezortypes.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,47 @@ export type SignTxInfoToTrezor = {
212212
extra_data_len?: number;
213213
};
214214

215+
export type CardanoDerivationPath = {
216+
address_n: Array<number>;
217+
};
218+
219+
export type CardanoXpubKey = {
220+
xpub_key: string;
221+
public_key: string;
222+
chain_code: string;
223+
address_n: Array<number>;
224+
root_hd_passphrase: string;
225+
};
226+
227+
export type CardanoSignedTransaction = {
228+
tx_hash?: string;
229+
tx_body?: string;
230+
};
231+
232+
export type CardanoTxInputType = {
233+
tx_hash: string;
234+
address_n: Array<number>;
235+
output_index: number;
236+
type?: number;
237+
};
238+
239+
export type CardanoTxOutputType = {
240+
address?: string;
241+
address_n?: Array<number>;
242+
amount: number;
243+
};
244+
245+
export type CardanoAddress = {
246+
address: string;
247+
address_n?: Array<number>;
248+
};
249+
250+
export type CardanoAddresses = {
251+
addresses: CardanoAddress;
252+
};
253+
254+
export type CardanoTxRequest = {
255+
tx_index?: number;
256+
tx_hash?: string;
257+
tx_body?: string;
258+
};

src/utils/signadatx.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/* @flow */
2+
'use strict';
3+
4+
import * as trezor from '../trezortypes';
5+
6+
import type Session, {MessageResponse} from '../session';
7+
8+
function processTxRequest(
9+
session: Session,
10+
request: trezor.CardanoTxRequest,
11+
transactions: Array<string>
12+
): Promise<MessageResponse<trezor.CardanoSignedTransaction>> {
13+
if (request.tx_index === null || request.tx_index === undefined) {
14+
return Promise.resolve({
15+
message: request,
16+
type: 'trezor.CardanoSignedTransaction',
17+
});
18+
}
19+
20+
const transaction = transactions[request.tx_index];
21+
22+
return session.typedCall('CardanoTxAck', 'CardanoTxRequest', {transaction: transaction}).then(
23+
(response) => processTxRequest(
24+
session,
25+
response.message,
26+
transactions
27+
)
28+
);
29+
}
30+
31+
export function signAdaTx(
32+
session: Session,
33+
inputs: Array<trezor.CardanoTxInputType>,
34+
outputs: Array<trezor.CardanoTxOutputType>,
35+
transactions: Array<string>
36+
): Promise<MessageResponse<trezor.CardanoSignedTransaction>> {
37+
return session.typedCall('CardanoSignTransaction', 'CardanoTxRequest', {
38+
inputs: inputs,
39+
outputs: outputs,
40+
transactions_count: transactions.length,
41+
}).then((res) =>
42+
processTxRequest(session, res.message, transactions)
43+
);
44+
}

0 commit comments

Comments
 (0)