@ledgerhq/coin-filecoin
Version:
Ledger Filecoin Coin integration
69 lines • 2.99 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildSignOperation = void 0;
const rxjs_1 = require("rxjs");
const logs_1 = require("@ledgerhq/logs");
const errors_1 = require("@ledgerhq/errors");
const buildOptimisticOperation_1 = require("./buildOptimisticOperation");
const serializer_1 = require("./serializer");
const utils_1 = require("../common-logic/utils");
const utils_2 = require("./utils");
const buildSignOperation = (signerContext) => ({ account, deviceId, transaction }) => new rxjs_1.Observable(o => {
async function main() {
const { method, version, nonce, gasFeeCap, gasLimit, gasPremium } = transaction;
const { derivationPath } = (0, utils_1.getAddress)(account);
const subAccount = (0, utils_1.getSubAccount)(account, transaction);
const tokenAccountTxn = subAccount?.type === utils_2.AccountType.TokenAccount;
if (!gasFeeCap.gt(0) || !gasLimit.gt(0)) {
(0, logs_1.log)("debug", `signOperation missingData --> gasFeeCap=${gasFeeCap} gasLimit=${gasLimit}`);
throw new errors_1.FeeNotLoaded();
}
o.next({
type: "device-signature-requested",
});
// Serialize tx
const toCBORResponse = await (0, serializer_1.toCBOR)(account, transaction);
const { txPayload, parsedSender, recipientToBroadcast, encodedParams, amountToBroadcast: finalAmount, } = toCBORResponse;
(0, logs_1.log)("debug", `[signOperation] serialized CBOR tx: [${txPayload.toString("hex")}]`);
// Sign by device
const { r } = await signerContext(deviceId, async (signer) => {
const r = await signer.sign(derivationPath, txPayload);
return { r };
});
o.next({
type: "device-signature-granted",
});
if (!r.signature_compact) {
throw new Error("Signature compact is null");
}
// build signature on the correct format
const signature = `${Buffer.from(r.signature_compact).toString("base64")}`;
const operation = await (0, buildOptimisticOperation_1.buildOptimisticOperation)(account, transaction, toCBORResponse);
// Necessary for broadcast
const additionalTxFields = {
sender: parsedSender,
recipient: recipientToBroadcast,
params: encodedParams,
gasLimit,
gasFeeCap,
gasPremium,
method,
version,
nonce,
signatureType: 1,
tokenTransfer: tokenAccountTxn,
value: finalAmount.toString(),
};
o.next({
type: "signed",
signedOperation: {
operation,
signature,
rawData: additionalTxFields,
},
});
}
main().then(() => o.complete(), e => o.error(e));
});
exports.buildSignOperation = buildSignOperation;
//# sourceMappingURL=signOperation.js.map
;