import axios from "axios" ; import BigNumber from "bignumber.js" ; import { BitcoinAPI , DEFAULT_TIMEOUT , fixUTXO , fixUTXOs , sortUTXOs , UTXO , } from "./API" ; export enum SoChainNetwork { BTC = "BTC" , LTC = "LTC" , ZEC = "ZEC" , DOGE = "DOGE" , DASH = "DASH" , BTCTEST = "BTCTEST" , LTCTEST = "LTCTEST" , ZECTEST = "ZECTEST" , DOGETEST = "DOGETEST" , DASHTEST = "DASHTEST" } export class SoChain implements BitcoinAPI { public network : string ; public constructor ( network = SoChainNetwork . BTC ) { this . network = network ; } public async fetchHeight ( ) { return ( await axios . get < { blocks : number ; } > ( `https://sochain.com/api/v2/get_info/${ this . network }` , { timeout : DEFAULT_TIMEOUT , } ) ) . data . blocks . toString ( ) ; } public async fetchUTXO ( txid , txindex ) { const url = `https://sochain.com/api/v2/get_tx/${ this . network }/${ txid }` ; const response = await axios . get < { readonly data : SoChainTX ; } > ( url , { timeout : DEFAULT_TIMEOUT } ) ; const tx = response . data . data ; const height = new BigNumber ( await this . fetchHeight ( ) ) ; return fixUTXO ( { txid : tx . txid , amount : tx . outputs [ parseInt ( txindex , 10 ) ] . value . toString ( ) , txindex : txindex , height : tx . confirmations && tx . confirmations > 0 ? height . minus ( tx . confirmations ) . plus ( 1 ) . toFixed ( ) : null , } , 8 ) ; } public async fetchUTXOs ( address ) { const url = `https://sochain.com/api/v2/get_tx_unspent/${ this . network }/${ address }/${ 0 }` ; const response = await axios . get < { data : { txs : SoChainUTXO [ ] ; } ; } > ( url , { timeout : DEFAULT_TIMEOUT } ) ; const height = new BigNumber ( await this . fetchHeight ( ) ) ; return fixUTXOs ( response . data . data . txs . map ( ( utxo ) => ( { txid : utxo . txid , txindex : utxo . output_no . toString ( ) , amount : utxo . value . toString ( ) , height : utxo . confirmations && utxo . confirmations > 0 ? height . minus ( utxo . confirmations ) . plus ( 1 ) . toFixed ( ) : null , } ) ) , 8 ) . sort ( sortUTXOs ) ; } public async fetchTXs ( address ) { const url = `https://sochain.com/api/v2/get_tx_received/${ this . network }/${ address }/${ 0 }` ; const response = await axios . get < { readonly data : { readonly txs : readonly SoChainUTXO [ ] ; } ; } > ( url , { timeout : DEFAULT_TIMEOUT } ) ; const height = new BigNumber ( await this . fetchHeight ( ) ) ; return fixUTXOs ( response . data . data . txs . map ( ( utxo ) => ( { txid : utxo . txid , amount : utxo . value . toString ( ) , txindex : utxo . output_no . toString ( ) , height : utxo . confirmations && utxo . confirmations > 0 ? height . minus ( utxo . confirmations ) . plus ( 1 ) . toFixed ( ) : null , } ) ) , 8 ) . sort ( sortUTXOs ) ; } public async broadcastTransaction ( txHex ) { const response = await axios . post < { status : "success" ; data : { network : string ; txid : string ; } ; } > ( `https://sochain.com/api/v2/send_tx/${ this . network }` , { tx_hex : txHex } , { timeout : DEFAULT_TIMEOUT } ) ; return response . data . data . txid ; } } export interface SoChainUTXO { txid : string ; value : number ; script_asm : string ; script_hex : string ; output_no : number ; confirmations : number ; time : number ; } export interface SoChainTX { network : string ; txid : string ; blockhash : string | null ; confirmations : number ; time : number ; inputs : Array < { input_no : number ; value : string ; address : string ; type : "pubkeyhash" ; script : string ; witness : null ; from_output : { txid : string ; output_no : number ; } ; } > ; outputs : Array < { output_no : 0 ; value : string ; address : string ; type : "pubkeyhash" ; script : string ; } > ; tx_hex : string ; size : number ; version : 1 ; locktime : 0 ; }