@thorchain/asgardex-bitcoin

Custom Bitcoin client and utilities used by ASGARDEX clients

Usage no npm install needed!

<script type="module">
  import thorchainAsgardexBitcoin from 'https://cdn.skypack.dev/@thorchain/asgardex-bitcoin';
</script>

README

@thorchain/asgardex-bitcoin

Implements the following:

interface BitcoinClient {
  generatePhrase(): string
  setPhrase(phrase?: string): void
  validatePhrase(phrase: string): boolean
  purgeClient(): void
  setNetwork(net: Network): void
  getNetwork(net: Network): Bitcoin.networks.Network
  setBaseUrl(endpoint: string): void
  getAddress(): string
  validateAddress(address: string): boolean
  scanUTXOs(): Promise<void>
  getBalance(): number
  getBalanceForAddress(address?: string): Promise<number>
  getTransactions(address: string): Promise<Txs>
  calcFees(memo?: string): Promise<object>
  vaultTx(addressVault: string, valueOut: number, memo: string, feeRate: number): Promise<string>
  normalTx(addressTo: string, valueOut: number, feeRate: number): Promise<string>
}

Modules

Installation

yarn add @thorchain/asgardex-bitcoin

Following dependencies will be installed into your project:

  • bitcoinjs-lib
  • bip39
  • wif
  • moment
  • axios

Testing

Uses a dotenv file to hold a USER_PHRASE and a VAULT_PHRASE

Usage

Initialize client and use class methods:

import { Client, Network } from '../src/client'

const btcClient = new Client(Network.TEST)

const newPhrase = btcClient.generatePhrase()

.generatePhrase()

Generate a 12 word BIP-39 seed phrase.

Return: string

.setPhrase(phrase)

Loads a 12 word BIP-39 seed phrase to use as a BTC send/receive address.

phrase: 12 word BIP-39 seed phrase as string

Return: void

.validatePhrase(phrase)

Validates if provided phrase is BIP-39.

phrase: 12 word BIP-39 seed phrase as string

Return: boolean

.purgeClient()

Clears UTXOs and seed phrase from client class properties.

Return: void

.setNetwork(net)

Set testnet or mainnet network using the Network interface.

net: Network.TEST or Network.MAIN

Return: void

.setBaseUrl(endpoint)

Set an electrs REST API endpoint to use for chain data.

endpoint: endpoint as string

Return: void

.getAddress()

Gets a P2WPKH address using the seed phrase set in .setPhrase() or initialization. If no phrase is set will error.

Return: string

.validateAddress(address)

Validates if provided address is p2wpkh and same network as the client.

address: string

Return: boolean

.scanUTXOs()

Async

Scans the UTXOs on the set seed phrase in .setPhrase() and stores them in class properties.

Return: void

.getBalance()

Get the balance of UTXOs from .scanUTXOs()

Return: number in sats

.getBalanceForAddress(address)

Async

Get the balance of UTXOs for an external address

address: string

Return: number in sats

.getTransactions(address)

Async

Get transactions for an address

address: string

Return: Array of objects

.calcFees(memo)

Async

Calculates the fee rate and the fee total estimate for fast, regular, and slow transactions. Add a memo for a vault TX

memo: string optional

Return: object of objects

.vaultTx(addressVault, valueOut, memo, feeRate)

Async

Generates a valid Vault TX hex to be broadcast

addressVault: string

valueOut: number in sats

memo: string

feeRate: number

.normalTx(addressTo, valueOut, feeRate)

Async

Generates a valid Vault TX hex to be broadcast

addressTo: string

valueOut: number in sats

feeRate: number