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

Commit 8802378

Browse files
committed
Add support for Cardano
1 parent db58b5b commit 8802378

File tree

4 files changed

+160
-0
lines changed

4 files changed

+160
-0
lines changed

API.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@ 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+
| adaGetAddresses | paths:&nbsp;Array&lt;trezor.CardanoDerivationPath&gt;<br>show_display:&nbsp;?boolean | Promise&lt;MessageResponse<br>&lt;trezor.CardanoAddresses&gt;&gt; | Gets Cardano addresses<br>if `show_display` is true, the address is displayed on TREZOR and user has to confirm. |
156+
| adaGetAddress | path:&nbsp;trezor.CardanoDerivationPath<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. |
157+
| getAdaXpubKey | address_n:&nbsp;Array&lt;number&gt; | Promise&lt;MessageResponse<br>&lt;trezor.CardanoXpubKey&gt;&gt; | Gets Cardano xpub key from a given path. |
158+
| 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. |
159+
| 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. |
160+
| signAdaTransaction | inputs:&nbsp;Array&lt;trezor.CardanoTxInputType&gt;<br>outputs:&nbsp;Array&lt;trezor.CardanoTxOutputType&gt;<br>attributes:&nbsp;Array&lt;string&gt;<br>transactions:&nbsp;Array&lt;string&gt; | Promise&lt;MessageResponse&lt;trezor.CardanoSignedTransaction&gt;&gt; | For provided inputs, outputs, attributes, raw transactions bodies will sign transaction |
155161
| 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. |
156162
| 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.) |
157163
| wipeDevice | | Promise | Wipes the device (after user confirms). |

src/session.js

Lines changed: 68 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,49 @@ export default class Session extends EventEmitter {
165166
});
166167
}
167168

169+
@integrityCheck
170+
adaGetAddresses(
171+
paths: Array<trezor.CardanoDerivationPath>,
172+
show_display: ?boolean
173+
): Promise<MessageResponse<{
174+
addresses: Array<trezor.CardanoAddress>
175+
}>> {
176+
return this.typedCall('CardanoGetAddresses', 'CardanoAddresses', {
177+
paths,
178+
show_display: !!show_display,
179+
});
180+
}
181+
182+
@integrityCheck
183+
adaGetAddress(
184+
path: Array<trezor.CardanoDerivationPath>,
185+
show_display: ?boolean
186+
): Promise<MessageResponse<trezor.CardanoAddress>> {
187+
return this.typedCall('CardanoGetAddress', 'CardanoAddress', {
188+
path,
189+
show_display: !!show_display,
190+
});
191+
}
192+
193+
@integrityCheck
194+
getAdaXpubKey(
195+
address_n: Array<number>,
196+
): Promise<MessageResponse<trezor.CardanoXpubKey>> {
197+
return this.typedCall('CardanoGetXpubKey', 'CardanoXpubKey', {
198+
address_n: address_n,
199+
});
200+
}
201+
202+
@integrityCheck
203+
signAdaTransaction(
204+
inputs: Array<trezor.CardanoTxInputType>,
205+
outputs: Array<trezor.CardanoTxOutputType>,
206+
attributes: Array<string>,
207+
transactions: Array<string>
208+
): Promise<MessageResponse<trezor.CardanoSignedTransaction>> {
209+
return signAdaTxHelper.signAdaTx(this, inputs, outputs, attributes, transactions);
210+
}
211+
168212
@integrityCheck
169213
getPublicKey(
170214
address_n: Array<number>,
@@ -295,6 +339,19 @@ export default class Session extends EventEmitter {
295339
});
296340
}
297341

342+
@integrityCheck
343+
verifyAdaMessage(
344+
publicKey: string,
345+
signature: string,
346+
message: string
347+
): Promise<MessageResponse<trezor.Success>> {
348+
return this.typedCall('CardanoVerifyMessage', 'Success', {
349+
public_key: publicKey,
350+
signature: signature,
351+
message: message,
352+
});
353+
}
354+
298355
signMessage(
299356
address_n: Array<number>,
300357
message: string,
@@ -319,6 +376,17 @@ export default class Session extends EventEmitter {
319376
});
320377
}
321378

379+
@integrityCheck
380+
signAdaMessage(
381+
address_n: Array<number>,
382+
message: string
383+
): Promise<MessageResponse<trezor.MessageSignature>> {
384+
return this.typedCall('CardanoSignMessage', 'CardanoMessageSignature', {
385+
address_n: address_n,
386+
message: message,
387+
});
388+
}
389+
322390
signIdentity(
323391
identity: trezor.Identity,
324392
challenge_hidden: string,

src/trezortypes.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,43 @@ 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 CardanoTxRequest = {
251+
tx_index?: number;
252+
tx_hash?: string;
253+
tx_body?: string;
254+
}

src/utils/signadatx.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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+
attributes: Array<string>,
36+
transactions: Array<string>
37+
): Promise<MessageResponse<trezor.CardanoSignedTransaction>> {
38+
return session.typedCall('CardanoSignTransaction', 'CardanoTxRequest', {
39+
inputs: inputs,
40+
outputs: outputs,
41+
attributes: attributes,
42+
transactions_count: transactions.length,
43+
}).then((res) =>
44+
processTxRequest(session, res.message, transactions)
45+
);
46+
}

0 commit comments

Comments
 (0)