How to use

Installation

yarn add @xchainjs/xchain-bitcoin

Bitcoin Client Testing

yarn install
yarn test

Basic Usage Examples

Connect wallet to new Client and access class methods

Decrypt keystore returns phrase
Create a new client instance
Use the client to getAddress() & getBalance() of address
Network default is Mainnet

//Imports
import { Client } from "@xchainjs/xchain-bitcoin"

// Connect wallet to new btc client 
const connectWallet = async () => {
    let phrase = "phrase"
    const btcClient = new Client({ phrase})
    let address = btcClient.getAddress()     
    console.log(`Asset Address is: ${address}`)

    let balances = await btcClient.getBalance(address)
    try { 
        let assetAmount = (baseToAsset(balances[0].amount)).amount()
        console.log(`Asset address balance: ${assetAmount}`)
    } catch (error) {
        console.log('Address has no balance')
    }
}

Transfer btc using btcClient

Default feeRate is fast
Import helper functions from @xchainjs/xchain-util
Decrypt keystore to retrieve phrase
Use utils to convert to BaseAmount for tx params
Build tx using parameters
Client.transfer() > returns Promise<string> - The transaction hash

//Imports
import { assetToBase, baseToAsset, assetAmount, AssetBTC } from "@xchainjs/xchain-util"

let amountToTransfer = 0.0001
let recipient = 'Recipent_address'

const transfer = async () => {
    let phrase = "phrase"
    let btcClient = new Client({phrase })
    let amount = assetToBase(assetAmount(amountToTransfer, 8))
    try {
        const txid = await btcClient.transfer({
            'asset': AssetBTC,
            'recipient': recipient,
            'amount': amount,
            'memo': "payment"
        })
        console.log(`Amount: ${amount.amount().toString()} ${AssetBTC.symbol} Transaction id: ${txid}`)
    } catch (error){
        console.log(`Transfer failed ${error}`)
    }
}

Transfer & set feeRate

Build transaction using parameters
Set feeRate in transaction parameters
Or use getFeeRates()

//Returns FeeRates > this allows for dynamic feeRate adjustment on selection
const { fast, fastest, average } = await btcClient.getFeeRates()

try {
        const txid = await btcClient.transfer({
            'asset': AssetBTC,
            'recipient': recipient,
            'amount': amount,
            'memo': "test transfer",
            feeRate: fast
        })
        console.log(`Amount ${baseToAsset(amount).amount()} ${AssetBTC.symbol} Transaction id ${txid}`)
    } catch (error){
        console.log(`Transfer failed ${error}`)
    }

Get Fees & FeeRates estimations

Client function getFees() returns object
Fast: {"type":"BASE","decimal":8}

//Get Fees - returns FeeOption & fee in BaseAmount 
` Fees Fast: 0.00001 Fastest: 0.0000468 Average: 0.00001 `
    try{
        const { fast, fastest, average } = await btcClient.getFees()
        console.log(`Fees Fast: ${baseToAsset(fast).amount()} Fastest: ${baseToAsset(fastest).amount()} Average: ${baseToAsset(average).amount()}`)

    }catch (error){
        console.log(error)
    }

//Get FeeRates - returns FeeOption & rate  
` Fast: 12, Fastest 60, Average: 6 `

    try{
        const { fast, fastest, average } = await btcClient.getFeeRates()
        console.log(`Fast: ${fast}, Fastest ${fastest}, Average: ${average}`)

    }catch (error){
        console.log(error)
    }

Get transaction data

Create new btcClient instance
Call getTransaction(hash) returns JSON object

const transactionData = async () => {
    let phrase = "phrase"
    let btcClient = new Client({network: Network.Mainnet, phrase })
    let hash = "txhash string" 
    try{
        const txData = await btcClient.getTransactionData(hash)
        console.log(`From ${JSON.stringify(txData)}`)

    }catch (error) {
        console.log(`Error: ${error}`)
    }
}

Get Transaction History

Search the client for transaction history
Create new client instance
Call function with variable address
Results can be filtered with extra parameters { offset, limit, startTime, asset?}

const transactionHistory = async () => {
    let phrase = "phrase"
    let btcClient = new Client({phrase })
    let Address = keystore1Address

    try {
        const txHistory = await btcClient.getTransactions({ address: Address, limit: 4 })
        console.log(`Found ${txHistory.total.toString()}`)
        txHistory.txs.forEach(tx => console.log(tx.hash))

    } catch (error) {
            console.log(`Error: ${error}`)
    }
}