mirror of
https://github.com/pezkuwichain/pezkuwi-common.git
synced 2026-04-22 02:07:56 +00:00
118 lines
5.0 KiB
JavaScript
118 lines
5.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.Ledger = exports.packageInfo = void 0;
|
|
const ledger_substrate_1 = require("@zondax/ledger-substrate");
|
|
const hw_ledger_transports_1 = require("@pezkuwi/hw-ledger-transports");
|
|
const util_1 = require("@pezkuwi/util");
|
|
const constants_js_1 = require("./constants.js");
|
|
const defaults_js_1 = require("./defaults.js");
|
|
var packageInfo_js_1 = require("./packageInfo.js");
|
|
Object.defineProperty(exports, "packageInfo", { enumerable: true, get: function () { return packageInfo_js_1.packageInfo; } });
|
|
/** @internal Wraps a SubstrateApp call, checking the result for any errors which result in a rejection */
|
|
async function wrapError(promise) {
|
|
const result = await promise;
|
|
if (result.return_code !== constants_js_1.LEDGER_SUCCESS_CODE) {
|
|
throw new Error(result.error_message);
|
|
}
|
|
return result;
|
|
}
|
|
/** @internal Wraps a sign/signRaw call and returns the associated signature */
|
|
function sign(method, message, accountOffset = 0, addressOffset = 0, { account = constants_js_1.LEDGER_DEFAULT_ACCOUNT, addressIndex = constants_js_1.LEDGER_DEFAULT_INDEX, change = constants_js_1.LEDGER_DEFAULT_CHANGE } = {}) {
|
|
return async (app) => {
|
|
const { signature } = await wrapError(app[method](account + accountOffset, change, addressIndex + addressOffset, (0, util_1.u8aToBuffer)(message)));
|
|
return {
|
|
signature: (0, util_1.hexAddPrefix)(signature.toString('hex'))
|
|
};
|
|
};
|
|
}
|
|
/**
|
|
* @name Ledger
|
|
*
|
|
* @description
|
|
* Legacy wrapper for a ledger app -
|
|
* - it connects automatically on use, creating an underlying interface as required
|
|
* - Promises reject with errors (unwrapped errors from @zondax/ledger-substrate)
|
|
* @deprecated Use LedgerGeneric for up to date integration with ledger
|
|
*/
|
|
class Ledger {
|
|
#ledgerName;
|
|
#transportDef;
|
|
#app = null;
|
|
constructor(transport, chain) {
|
|
const ledgerName = defaults_js_1.ledgerApps[chain];
|
|
const transportDef = hw_ledger_transports_1.transports.find(({ type }) => type === transport);
|
|
if (!ledgerName) {
|
|
throw new Error(`Unsupported Ledger chain ${chain}`);
|
|
}
|
|
else if (!transportDef) {
|
|
throw new Error(`Unsupported Ledger transport ${transport}`);
|
|
}
|
|
this.#ledgerName = ledgerName;
|
|
this.#transportDef = transportDef;
|
|
}
|
|
/**
|
|
* Returns the address associated with a specific account & address offset. Optionally
|
|
* asks for on-device confirmation
|
|
*/
|
|
async getAddress(confirm = false, accountOffset = 0, addressOffset = 0, { account = constants_js_1.LEDGER_DEFAULT_ACCOUNT, addressIndex = constants_js_1.LEDGER_DEFAULT_INDEX, change = constants_js_1.LEDGER_DEFAULT_CHANGE } = {}) {
|
|
return this.withApp(async (app) => {
|
|
const { address, pubKey } = await wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
|
|
return {
|
|
address,
|
|
publicKey: (0, util_1.hexAddPrefix)(pubKey)
|
|
};
|
|
});
|
|
}
|
|
/**
|
|
* Returns the version of the Ledger application on the device
|
|
*/
|
|
async getVersion() {
|
|
return this.withApp(async (app) => {
|
|
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await wrapError(app.getVersion());
|
|
return {
|
|
isLocked,
|
|
isTestMode,
|
|
version: [major, minor, patch]
|
|
};
|
|
});
|
|
}
|
|
/**
|
|
* Signs a transaction on the Ledger device
|
|
*/
|
|
async sign(message, accountOffset, addressOffset, options) {
|
|
return this.withApp(sign('sign', message, accountOffset, addressOffset, options));
|
|
}
|
|
/**
|
|
* Signs a message (non-transactional) on the Ledger device
|
|
*/
|
|
async signRaw(message, accountOffset, addressOffset, options) {
|
|
return this.withApp(sign('signRaw', (0, util_1.u8aWrapBytes)(message), accountOffset, addressOffset, options));
|
|
}
|
|
/**
|
|
* @internal
|
|
*
|
|
* Returns a created SubstrateApp to perform operations against. Generally
|
|
* this is only used internally, to ensure consistent bahavior.
|
|
*/
|
|
async withApp(fn) {
|
|
try {
|
|
if (!this.#app) {
|
|
const transport = await this.#transportDef.create();
|
|
// We need this override for the actual type passing - the Deno environment
|
|
// is quite a bit stricter and it yields invalids between the two (specifically
|
|
// since we mangle the imports from .default in the types for CJS/ESM and between
|
|
// esm.sh versions this yields problematic outputs)
|
|
//
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
|
this.#app = (0, ledger_substrate_1.newSubstrateApp)(transport, this.#ledgerName);
|
|
}
|
|
return await fn(this.#app);
|
|
}
|
|
catch (error) {
|
|
this.#app = null;
|
|
throw error;
|
|
}
|
|
}
|
|
}
|
|
exports.Ledger = Ledger;
|