Skip to content

obsidiansystems/hw-app-kda

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

hw-app-kda

JavaScript bindings for Kadena Ledger App, based on LedgerJS.

Using LedgerJS for Kadena

Here is a sample app for Node:

const Transport = require("@ledgerhq/hw-transport").default;
const Kadena = require("hw-app-kda").default;

const getPublicKey = async () => {
  const kadena = new Kadena(await Transport.create());
  return await kadena.getPublicKey("44'/626'/0'/0/0");
};

const signTransaction = async () => {
  const transport = await Transport.create();
  const kadena = new Kadena(await Transport.create());
  return await kadena.signTransaction(
    "44'/626'/0'/0/0",
    "<transaction contents>"
  );
};

const getVersion = async () => {
  const transport = await Transport.create();
  const kadena = new Kadena(await Transport.create());
  return await kadena.getVersion();
};

const doAll = async () => {
  console.log(await getPublicKey());
  console.log(await signTransaction());
  console.log(await getVersion());
};

doAll().catch(err => console.log(err));

API

Table of Contents

Parameters

  • transport Transport<any>
  • scrambleKey string (optional, default "Kadena")

Examples

import Kadena from "hw-app-kda";
const kadena = new Kadena(transport);

getPublicKey

Get Kadena address for a given BIP-32 path.

Parameters

  • path string a path in BIP-32 format

Examples

const publicKey = await kadena.getPublicKey("44'/626'/0'/0/0");

Returns Promise<string> an object with a public key.

signTransferTx, signTransferCreateTx and signTransferCrossChainTx

These APIs signs a transfer transaction constructed from the input parameters and returns the Pact Command and the public key.

  • signTransferTx is for a same chain transfer, when the recipient account already exists.

  • signTransferCreateTx should be used if the recipient account does not exist on the chain.

This would create a "k:<recipient_pubkey>" account on the chain using the coin.transfer-create and the keyset {"pred":"keys-all","keys":[<recipient_pubkey>]}

  • signTransferCrossChainTx should be used for cross-chain transfers.

The recipient's keyset on the target chain will be {"pred":"keys-all","keys":[<recipient_pubkey>]}

Parameters

An object> containing the following fields

  • recipient string Public key or 'k:' account of the recipient.

    The recipient account will be the "k:<recipient_pubkey>". It is not possible to specify non-k recipient accounts. For sending to non-k accounts please use signTransaction

  • recipient_chainId number (required only for signTransferCrossChainTx). Should be a number between 0 and 19, and different from chainId.

  • amount string Transfer amount.

  • chainId number Sender's chainId. Should be a number between 0 and 19.

  • network string

  • path string (Optional, default value = "44'/626'/0'/0/0")

    Signing key's derivation path in BIP-32 format. Must be of the format "44'/626'/<account>'/<change>/<address_index>"

  • namespace string (Optional, default value = "")

    Token namespace, example: free If the namespace is specified then the module must also be specified.

  • module string (Optional, default value = "")

    Token module, example: anedak If the module is specified then the namespace must also be specified.

  • gasPrice string (Optional, default value = "1.0e-6")

  • gasLimit string (Optional, default value = "2300")

  • creationTime string (Optional, default value = current time)

  • ttl string (Optional, default value = "600")

  • nonce string (Optional, default value = "")

Examples

const { pact_command, pubkey } = await kadena.signTransferTx({
  recipient: "k:b818be69f485c5bbd07ef916d31f6610fb74aba6ec87f7883b77fe0c3bbd20ad",
  amount: "23.456",
  chainId: 1,
  network: "mainnet01",
  });
const { pact_command, pubkey } = await kadena.signTransferCreateTx({
  recipient: "k:b818be69f485c5bbd07ef916d31f6610fb74aba6ec87f7883b77fe0c3bbd20ad",
  amount: "23.456",
  chainId: 1,
  network: "mainnet01",
  });
const { pact_command, pubkey } = await kadena.signTransferCrossChainTx({
  recipient: "k:b818be69f485c5bbd07ef916d31f6610fb74aba6ec87f7883b77fe0c3bbd20ad",
  recipient_chainId: 2,
  amount: "23.456",
  chainId: 1,
  network: "mainnet01",
  });

Returns Promise<object> an object containing following fields

signTransaction

Sign a transaction with a given BIP-32 path.

Parameters

  • path string a path in BIP-32 format

Examples

const publicKey = await kadena.signTransaction(
  "44'/626'/0'/0/0",
  "<transaction contents>"
  );

Returns Promise<object> an object with text field containing a signature.

getVersion

Get the version of the application installed on the hardware device.

Examples

console.log(await kadena.getVersion());

for version 0.1.0, it produces something like

{
  major: 0
  minor: 1
  patch: 0
}

Returns Promise<{object}> an object with major, minor, and patch of the version.

signHash

Sign any arbitrary hash with a given BIP-32 path. This requires Kadena Ledger app v0.2.1 above, and hash signing must be enabled from the settings menu.

Parameters

  • path string a path in BIP-32 format

Examples

const publicKey = await kadena.signHash(
  "44'/626'/0'/0/0",
  "<hash, encoded as a hex string of length 64>"
  );

Returns Promise<object> an object with text field containing a signature.