@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
89 lines • 4.74 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.handlers = void 0;
const ledger_cal_service_1 = __importStar(require("@ledgerhq/ledger-cal-service"));
const live_signer_hyperliquid_1 = require("@ledgerhq/live-signer-hyperliquid");
const wallet_api_server_1 = require("@ledgerhq/wallet-api-server");
const types_1 = require("./types");
const converters_1 = require("../converters");
const wallet_api_core_1 = require("@ledgerhq/wallet-api-core");
const account_1 = require("../../account");
const rxjs_1 = require("rxjs");
const deviceAccess_1 = require("../../hw/deviceAccess");
const dmkUtils_1 = require("../../hw/dmkUtils");
const helpers_1 = require("../helpers");
const PERPS_APP_NAME = "Hyperliquid";
const handlers = ({ accounts, uiHooks: { "device.select": uiDeviceSelect }, }) => {
return {
"custom.perps.signActions": (0, wallet_api_server_1.customWrapper)(async (params) => {
if (!params) {
throw new wallet_api_core_1.ServerError((0, wallet_api_core_1.createUnknownError)({ message: "params is undefined" }));
}
// Retrieve account
const realAccountId = (0, converters_1.getAccountIdFromWalletAccountId)(params.accountId);
const account = accounts.find(acc => acc.id === realAccountId);
if (!account) {
throw new wallet_api_core_1.ServerError((0, wallet_api_core_1.createAccountNotFound)(params.accountId));
}
const derivationPath = (0, account_1.getMainAccount)(account, (0, account_1.getParentAccount)(account, accounts))?.freshAddressPath;
if (!derivationPath) {
throw new wallet_api_core_1.ServerError((0, wallet_api_core_1.createUnknownError)({ message: "unable to retrieve derivation path" }));
}
// Ask user to select a device via the UI
const device = await new Promise((resolve, reject) => {
uiDeviceSelect({
appName: PERPS_APP_NAME,
appOptions: params.options,
onSuccess: ({ device }) => resolve(device),
onCancel: () => reject(new Error("User cancelled device selection")),
});
});
// CALL Cal Service
const certificate = await ledger_cal_service_1.default.getCertificate(device.modelId, "perps_data");
return (0, rxjs_1.firstValueFrom)((0, deviceAccess_1.withDevice)(device.deviceId, device.deviceName ? { matchDeviceByName: device.deviceName } : undefined)(transport => (0, rxjs_1.from)((async () => {
if (!(0, dmkUtils_1.isDmkTransport)(transport)) {
throw new Error("Not DMK transport");
}
const { dmk, sessionId } = transport;
const hyperliquidSigner = new live_signer_hyperliquid_1.DmkSignerHyperliquid(dmk, sessionId);
const signatures = await hyperliquidSigner.signActions(derivationPath, (0, ledger_cal_service_1.convertCertificateToDeviceData)(certificate), new Uint8Array(Buffer.from((0, helpers_1.stripHexPrefix)(params.metadataWithSignature), "hex")), params.actions.map(types_1.convertAction));
return { signatures };
})())));
}),
};
};
exports.handlers = handlers;
//# sourceMappingURL=server.js.map