@ledgerhq/coin-stacks
Version:
Ledger Stacks Coin integration
73 lines • 3.08 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildSignOperation = void 0;
const errors_1 = require("@ledgerhq/errors");
const invariant_1 = __importDefault(require("invariant"));
const rxjs_1 = require("rxjs");
const utils_1 = require("../utils");
const buildOptimisticOperation_1 = require("./buildOptimisticOperation");
const misc_1 = require("./utils/misc");
const token_1 = require("./utils/token");
const transactions_1 = require("./utils/transactions");
const buildSignOperation = (signerContext) => ({ account, deviceId, transaction }) => new rxjs_1.Observable(o => {
async function main() {
const { derivationPath, address } = (0, misc_1.getAddress)(account);
const { xpub } = account;
(0, invariant_1.default)(xpub, "xpub is required");
const { fee, anchorMode, network, nonce } = transaction;
if (!xpub) {
throw new errors_1.InvalidAddress("", {
currencyName: account.currency.name,
});
}
if (!fee) {
throw new errors_1.FeeNotLoaded();
}
if (!nonce) {
throw new errors_1.InvalidNonce();
}
// Check if this is a token transaction
const subAccount = (0, token_1.getSubAccount)(account, transaction);
const tokenDetails = (0, transactions_1.getTokenContractDetails)(subAccount);
// Create transaction
const tx = await (0, transactions_1.createTransaction)(transaction, address, xpub, subAccount, fee, nonce);
o.next({
type: "device-signature-requested",
});
// Sign by device
const result = await signerContext(deviceId, async (signer) => {
return signer.sign((0, utils_1.getPath)(derivationPath), Buffer.from(tx.serialize()));
});
(0, utils_1.throwIfError)(result);
o.next({
type: "device-signature-granted",
});
// build signature on the correct format
const signature = `${result.signatureVRS.toString("hex")}`;
const operation = (0, buildOptimisticOperation_1.buildOptimisticOperation)(account, transaction);
o.next({
type: "signed",
signedOperation: {
operation,
signature,
rawData: {
xpub,
network,
anchorMode,
// Add token contract details if needed
...(tokenDetails && {
contractAddress: tokenDetails.contractAddress,
contractName: tokenDetails.contractName,
assetName: tokenDetails.assetName,
}),
},
},
});
}
main().then(() => o.complete(), e => o.error(e));
});
exports.buildSignOperation = buildSignOperation;
//# sourceMappingURL=signOperation.js.map