This repository has been archived by the owner on Jul 15, 2022. It is now read-only.
/
libcore-signOperation.js
79 lines (69 loc) · 2.22 KB
/
libcore-signOperation.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// @flow
import { BigNumber } from "bignumber.js";
import Xrp from "@ledgerhq/hw-app-xrp";
import type { Operation } from "../../types";
import type { CoreRippleLikeTransaction, Transaction } from "./types";
import { makeSignOperation } from "../../libcore/signOperation";
import buildTransaction from "./libcore-buildTransaction";
import {
libcoreBigIntToBigNumber,
libcoreAmountToBigNumber
} from "../../libcore/buildBigNumber";
async function signTransaction({
account: { freshAddress, freshAddressPath, id: accountId, balance },
transport,
transaction,
coreTransaction,
onDeviceSignatureRequested,
onDeviceSignatureGranted
}) {
const hwApp = new Xrp(transport);
const serialized = await coreTransaction.serialize();
onDeviceSignatureRequested();
const result = await hwApp.signTransaction(freshAddressPath, serialized);
onDeviceSignatureGranted();
await coreTransaction.setDERSignature(result);
const signature = await coreTransaction.serialize();
// build optimistic update
const txHash = ""; // will be resolved at broadcast() time
const senders = [freshAddress];
const receiver = await coreTransaction.getReceiver();
const recipients = [await receiver.toBase58()];
const feeRaw = await coreTransaction.getFees();
const fee = await libcoreAmountToBigNumber(feeRaw);
const tag = await coreTransaction.getDestinationTag();
const transactionSequenceNumberRaw = await coreTransaction.getSequence();
const transactionSequenceNumber = (
await libcoreBigIntToBigNumber(transactionSequenceNumberRaw)
).toNumber();
const operation: $Exact<Operation> = {
id: `${accountId}-${txHash}-OUT`,
hash: txHash,
type: "OUT",
value: transaction.useAllAmount
? balance.minus(
transaction.networkInfo ? transaction.networkInfo.baseReserve : 0
)
: BigNumber(transaction.amount || 0).plus(fee),
fee,
blockHash: null,
blockHeight: null,
senders,
recipients,
accountId,
date: new Date(),
transactionSequenceNumber,
extra: {
tag
}
};
return {
signature,
operation,
expirationDate: null // TODO
};
}
export default makeSignOperation<Transaction, CoreRippleLikeTransaction>({
signTransaction,
buildTransaction
});