@ledgerhq/coin-multiversx
Version:
Ledger MultiversX Coin integration
65 lines • 2.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildSignOperation = void 0;
const rxjs_1 = require("rxjs");
const errors_1 = require("@ledgerhq/errors");
const buildOptimisticOperation_1 = require("./buildOptimisticOperation");
const buildTransaction_1 = require("./buildTransaction");
const account_1 = require("@ledgerhq/coin-framework/account");
const logic_1 = require("./logic");
const constants_1 = require("./constants");
/**
* Sign Transaction with Ledger hardware
*/
const buildSignOperation = (signerContext) => ({ account, transaction, deviceId }) => new rxjs_1.Observable(o => {
let cancelled = false;
async function main() {
if (!transaction.fees) {
throw new errors_1.FeeNotLoaded();
}
// Collect data for an ESDT transfer
const { subAccounts } = account;
const { subAccountId } = transaction;
const tokenAccount = !subAccountId
? null
: subAccounts && subAccounts.find(ta => ta.id === subAccountId);
await signerContext(deviceId, signer => signer.setAddress(account.freshAddressPath));
if (tokenAccount) {
const { token } = await (0, account_1.decodeTokenAccountId)(tokenAccount.id);
if (!token) {
throw new Error("Invalid token");
}
await signerContext(deviceId, signer => signer.provideESDTInfo(token.ticker, (0, logic_1.extractTokenId)(token.id), token.units[0].magnitude, constants_1.CHAIN_ID, token.ledgerSignature));
}
const unsignedTx = await (0, buildTransaction_1.buildTransactionToSign)(account, transaction);
o.next({
type: "device-signature-requested",
});
const { signature } = await signerContext(deviceId, signer => signer.sign(account.freshAddressPath, unsignedTx));
if (cancelled)
return;
o.next({
type: "device-signature-granted",
});
if (!signature) {
throw new Error("No signature");
}
const parsedUnsignedTx = JSON.parse(unsignedTx);
const operation = (0, buildOptimisticOperation_1.buildOptimisticOperation)(account, transaction, parsedUnsignedTx);
o.next({
type: "signed",
signedOperation: {
operation,
signature: signature.toString("hex"),
rawData: parsedUnsignedTx,
},
});
}
main().then(() => o.complete(), e => o.error(e));
return () => {
cancelled = true;
};
});
exports.buildSignOperation = buildSignOperation;
exports.default = exports.buildSignOperation;
//# sourceMappingURL=signOperation.js.map