Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@secux/app-btc

Package Overview
Dependencies
Maintainers
2
Versions
35
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@secux/app-btc

SecuX Hardware Wallet BTC API

  • 3.2.5
  • npm
  • Socket score

Version published
Weekly downloads
0
Maintainers
2
Weekly downloads
 
Created
Source

lerna view on npm npm module downloads

@secux/app-btc

SecuX Hardware Wallet BTC API

Usage

import { SecuxBTC, ScriptType } from "@secux/app-btc";

First, create instance of ITransport.


Examples

  1. Get address by purpose and script type.

    • tweaked key-spend only address (default script: P2TR)
      const path = "m/86'/0'/0'/0/0";
      const address = await device.getAddress(path);
      
      /*
      
      // transfer data to hardware wallet by custom transport layer.
      const data = SecuxBTC.prepareAddress(path);
      const response = await device.Exchange(data);
      const address = SecuxBTC.resolveAddress(response, path);
      
      */
      
    • native segwit address (default script: P2WPKH)
      const address = await device.getAddress("m/84'/0'/0'/0/0");
      
    • segwit address (default script: P2SH_P2WPKH)
      const address = await device.getAddress("m/49'/0'/0'/0/0");
      
    • legacy address (default script: P2PKH)
      const address = await device.getAddress("m/44'/0'/0'/0/0");
      
  2. For bitcoin ecosystem, you can use specific cointype by the coin.

    • native segwit address for dogecoin
      const address = await device.getAddress("m/84'/3'/0'/0/0");
      
    • segwit address for litecoin
      const address = await device.getAddress("m/49'/2'/0'/0/0");
      
    • legacy address for bitcoincash
      const address = await device.getAddress("m/44'/145'/0'/0/0");
      
    • you can refer to here for cointype.
  3. Sign transaction.

const inputs = [
    {
        hash: "0b062e71e165fba9634d9fb1b5ba703e774bf374815b1f5a617c8d1e7d43dc01",
        vout: 0,
        // optional, give raw transaction data for checking
        txHex: "0100000001b103a004f672080ceae8277e83c296b5ac090ae78157979211da3e2d41399d1b010000006b483045022100f19d88e6a17789dc399ff2a93b4516bb44af32928d4986138f1a4f7f37ab277b022046fc14c958bc8aa97fea1d2fbf80982534cf51634d46c4d5178e5ca6698bca07012102f8667cfb5b80c3695e3f0c9078589cb04e8d15e71bdae89ebf24b82f9d663d5cffffffff02bc020000000000001976a9145c592f40134c6179a1ce5b06b28d5c2ae443113188ac00040000000000001976a9146d65ced4ef49e23cdbb4be9d510b38e5be28e10688ac00000000",
        satoshis: 700,
        path: "m/44'/0'/0'/0/0",
        // for custom transport layer, each utxo need publickey.
        // publickey: "03aaeb52dd7494c361049de67cc680e83ebcbbbdbeb13637d92cd845f70308af5e"
    },
    {
        hash: "07ad0a13e501d292bc8b9e16a3a8b62f99f77ab9e37ea8d3b8453984a2899984",
        vout: 0,
        // optional, you can use specific script for each input
        // script: ScriptType.P2SH_P2PKH,
        satoshis: 6000,
        path: "m/49'/0'/0'/0/0",
        // for custom transport layer, each utxo need publickey.
        // publickey: "039b3b694b8fc5b5e07fb069c783cac754f5d38c3e08bed1960e31fdb1dda35c24"
    },
    {
        hash: "8686aee2b9dcf559798b9718ed26ca92e0c64bef11c433e576cae658678c497d",
        vout: 1,
        satoshis: 1083,
        path: "m/84'/0'/0'/1/0",
        // for custom transport layer, each utxo need publickey.
        // publickey: "03025324888e429ab8e3dbaf1f7802648b9cd01e9b418485c5fa4c1b9b5700e1a6"
    }
];

const to = {
    address: "bc1qs0k3ekx0z7a7yuq3lse7prw373s8cr8lhxvccd",
    satoshis: 1500
};

const utxo = {
    path: "m/44'/0'/0'/0/0",
    satoshis: 6100,
    // for custom transport layer, each utxo need publickey.
    // publickey: "03aaeb52dd7494c361049de67cc680e83ebcbbbdbeb13637d92cd845f70308af5e"
};

const obj = await device.sign(
    inputs, 
    { to, utxo },
    // given feeRate to estimate fee, and fee will be changed if greater than estimated value or less than minimal fee.
    // { feeRate: 1 } 
);

const rspList = [];
for (const cmd of obj.multi_command) {
    const rsp = await transport.Exchange(cmd);
    rspList.push(rsp);
}
const signed = SecuxBTC.resolveTransaction(rspList, obj);

/*

// transfer data to hardware wallet by custom transport layer.
const { commands, rawTx } = SecuxBTC.prepareSign(inputs, { to, utxo });
const rspList = [];
for (const cmd of commands) {
    const rsp = await transport.Exchange(cmd);
    rspList.push(rsp);
}
const signed = SecuxBTC.resloveTransaction(rspList, {
    rawTx, 
    publickeys: inputs.map(x => x.publickey),
});

*/
  1. Derive address from xpub, ypub, or zpub.

    • tweaked key-spend only address (default script: P2TR)
      // m/86'/0'/0'
      const xpub = "xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ";
      // m/86'/0'/0'/0/0
      const address = SecuxBTC.deriveAddress(xpub, 0, 0,
      {
          // you can use specific coin
          // coin: CoinType.BITCOIN,
          script: ScriptType.P2TR
      });
      
    • native segwit address (default script: P2WPKH)
      // m/84'/0'/0'
      const zpub = "zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs";
      // m/84'/0'/0'/0/0
      const address = SecuxBTC.deriveAddress(zpub, 0, 0,
      {
          // you can use specific coin and script
          // coin: CoinType.DOGECOIN,
          // script: ScriptType.P2WPKH
      });
      
    • segwit address (default script: P2SH_P2WPKH)
      // m/49'/0'/1'
      const ypub = "ypub6Ww3ibxVfGzLtJR4F9SRBicspAfvmvw54yern9Q6qZWFC9T6FYA34K57La5Sgs8pXuyvpDfEHX5KNZRiZRukUWaVPyL4NxA69sEAqdoV8ve";
      // m/49'/0'/1'/0/1
      const address = SecuxBTC.deriveAddress(ypub, 0, 1);
      
    • legacy address (default script: P2PKH)
      // m/44'/0'/0'
      const xpub = "xpub6BosfCnifzxcFwrSzQiqu2DBVTshkCXacvNsWGYJVVhhawA7d4R5WSWGFNbi8Aw6ZRc1brxMyWMzG3DSSSSoekkudhUd9yLb6qx39T9nMdj";
      // m/44'/0'/0'/1/0
      const address = SecuxBTC.deriveAddress(xpub, 1, 0);
      
  2. Estimate transaction size

const size = SecuxBTC.getVirtualSize(
    // your inputs
    [
        ScriptType.P2PKH,
        ScriptType.P2SH_P2WPKH,
        ScriptType.P2SH_P2WPKH,
        ScriptType.P2WPKH,
        ...
    ],
    // your outputs
    [
        ScriptType.P2PKH,
        ScriptType.P2PKH,
        ScriptType.P2WPKH,
        ...
    ]
);

API Reference

ERROR, Cannot find class.

ScriptType : enum

Properties

NameTypeDescription
P2PKHnumber0
P2WPKHnumber1
P2SH_P2PKHnumber2
P2SH_P2WPKHnumber3
P2TRnumber4

CoinType : enum

Properties

NameTypeDescription
BITCOINnumber0
TESTNETnumber1
REGTESTnumber2
LITECOINnumber3
BITCOINCASHnumber4
GROESTLnumber5
DIGIBYTEnumber6
DASHnumber7
DOGECOINnumber8

PathObject : object

Properties

NameTypeDescription
coinCoinTypeenum
scriptScriptTypeenum

AddressOption : object

Properties

NameTypeDescription
[coin]CoinTypeenum
[script]ScriptTypeenum

txInput : object

Properties

NameTypeDescription
pathstringBIP32 path refer to utxo
publickeystring | Bufferscep256k1 publickey from path
hashstringreferenced transaction hash
voutnumberreferenced transaction output index
satoshisnumber | stringreferenced transaction output amount
[script]ScriptTypescript type related to path
[txHex]stringreferenced raw transaction for validation

txOutput : object

Properties

NameTypeDescription
totxOutputAddress | txOutputScriptExtenedreceiving address information
[utxo]txOutputScriptExtenedchanges

txOutputAddress : object

Properties

NameTypeDescription
addressstringreceiving address
satoshisnumber | stringreceiving amount

txOutputScriptExtened : object

Properties

NameTypeDescription
pathstringBIP32 path
publickeystring | Bufferscep256k1 publickey from path
satoshisnumber | stringamount
[script]ScriptTypescript type related to path

SignOption : object

Properties

NameTypeDescription
[coin]CoinTypecheck cointype for each input
[feeRate]numbercalculate optimal transaction fee and replace it
[isRBF]booleanmake Replace-by-Fee transaction

prepared : object

Properties

NameTypeDescription
commandDatacommunicationDatadata for sending to device
rawTxstringunsigned raw transaction

TransactionObject : object

Properties

NameTypeDescription
rawTxstringunsigned raw transaction
publickeysArray.<(string|Buffer)>publickey correspond to each input
[coin]CoinType


© 2018-21 SecuX Technology Inc.

authors:
andersonwu@secuxtech.com

Keywords

FAQs

Package last updated on 27 May 2022

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc