Package: xchainpy-bitcoin
xchainpy/xchainpy_bitcoinBitcoin Module for XChainPy ClientsModulesclient- Custom client for communicating with bitcoinlibmodels- model wrapper for bitcoin required typesutil- Utitilies for using bitcoinlib and bitcoin chainFollowing dependencies have to be installed into your projectbip_utils, bitcoinlib , http3 , xchainpy_client , xchainpy_crypto , xchainpy_utilService ProvidersThis package uses the following service providers:FunctionServiceNotesBalancesSochainhttps://sochain.com/api#get-balanceTransaction historySochainhttps://sochain.com/api#get-display-data-address,https://sochain.com/api#get-txTransaction details by hashSochainhttps://sochain.com/api#get-txTransaction feesBitgohttps://app.bitgo.com/docs/#operation/v2.tx.getfeeestimateTransaction broadcastSochainhttps://sochain.com/api#send-transactionExplorerBlockstreamhttps://blockstream.infoSochain API rate limits:https://sochain.com/api#rate-limits(300 requests/minute)Installationpipinstallxchainpy_bitcoinBefore install the package on M1 Mac, execute these commands:brewinstallgmpopenblasopensslautoconfautomakelibffilibtoolpkg-configCFLAGS=-I/opt/homebrew/opt/gmp/includeLDFLAGS=-L/opt/homebrew/opt/gmp/libpip3installfastecdsaCFLAGS=-I$(brew--prefixopenssl)/includeLDFLAGS=-L$(brew--prefixopenssl)/libpip3installscryptexportOPENBLAS="$(brew--prefixopenblas)$OPENBLAS"Bitcoin Client moduleInitialize a clientfromxchainpy_client.models.typesimportNetworkfromxchainpy_bitcoin.clientimportClientfromxchainpy_bitcoin.models.client_typesimportBitcoinClientParams# Note: This phrase is created by https://iancoleman.io/bip39/ and will never been used in a real-worldphrase='atom green various power must another rent imitate gadget creek fat then'client=Client(BitcoinClientParams(phrase=phrase,network=Network.Testnet))# if you want to change phrase after initialize the clientclient.set_phrase('caution pear excite vicious exotic slow elite marble attend science strategy rude')# if you want to change network after initialize the clientclient.purge_client()client.set_network(Network.Mainnet)# when you are done with the client, call thisclient.purge_client()Address methodsfromxchainpy_client.models.typesimportNetworkfromxchainpy_bitcoin.clientimportClientfromxchainpy_bitcoin.models.client_typesimportBitcoinClientParamsphrase='atom green various power must another rent imitate gadget creek fat then'client=Client(BitcoinClientParams(phrase=phrase,network=Network.Testnet))address=client.get_address()is_valid=client.validate_address(client.network,address)# boolprint(address)print(is_valid)# change indexaddress=client.get_address(1)is_valid=client.validate_address(client.network,address)# boolprint(address)print(is_valid)Feesfromxchainpy_bitcoin.clientimportClientfromxchainpy_bitcoin.models.client_typesimportBitcoinClientParamsclient=Client(BitcoinClientParams())# Get feeRate estimationsfee_rates=awaitclient.get_fee_rates()# Get fee estimationsfees=awaitclient.get_fees()# Get fee estimations with memomemo='SWAP:THOR.RUNE'fees_with_memo=awaitclient.get_fees(memo)print(f'''fee rates:average:{fee_rates.average}fast:{fee_rates.fast}fastest:{fee_rates.fastest}\n''')print(f'''fees:average:{fees.average}fast:{fees.fast}fastest:{fees.fastest}\n''')print(f'''fees with memo:average:{fees_with_memo.average}fast:{fees_with_memo.fast}fastest:{fees_with_memo.fastest}\n''')Balancefromxchainpy_client.models.typesimportNetworkfromxchainpy_bitcoin.clientimportClientfromxchainpy_bitcoin.models.client_typesimportBitcoinClientParamsphrase='atom green various power must another rent imitate gadget creek fat then'client=Client(BitcoinClientParams(phrase=phrase,network=Network.Testnet))address=client.get_address()balance=awaitclient.get_balance(address=address)balance=balance[0]print(f'asset:{balance.asset}, amount:{balance.amount}')Transactions and Transaction_datafromxchainpy_client.models.tx_typesimportTxHistoryParamsfromxchainpy_client.models.typesimportNetworkfromxchainpy_bitcoin.clientimportClientfromxchainpy_bitcoin.models.client_typesimportBitcoinClientParamsphrase='atom green various power must another rent imitate gadget creek fat then'client=Client(BitcoinClientParams(phrase=phrase,network=Network.Testnet))address=client.get_address()params=TxHistoryParams(address=address,limit=1)transactions=awaitclient.get_transactions(params)# type of transactions is xchainpy_client.models.tx_types.TxPaget=transactions.txs[0]print(t.asset)print(t.tx_from[0].amount)print(t.tx_from[0].address)print(t.tx_to[0].amount)print(t.tx_to[0].address)print(t.tx_date)print(t.tx_type)print(t.tx_hash)transaction=awaitclient.get_transaction_data(t.tx_hash)# transaction object is equal by t objectTransferfromxchainpy_client.models.typesimportNetworkfromxchainpy_bitcoin.clientimportClientfromxchainpy_bitcoin.models.client_typesimportBitcoinClientParams,BitcoinTxParamsphrase='atom green various power must another rent imitate gadget creek fat then'client=Client(BitcoinClientParams(phrase=phrase,network=Network.Testnet))address=client.get_address()params=BitcoinTxParams(amount=0.0000001,recipient=address,memo='memo')tx_hash=awaitclient.transfer(params)print(tx_hash)Explorer urlfromxchainpy_client.models.typesimportNetworkfromxchainpy_bitcoin.clientimportClientfromxchainpy_bitcoin.models.client_typesimportBitcoinClientParamsclient=Client(BitcoinClientParams())print(client.get_explorer_url())print(client.get_explorer_address_url('testAddressHere'))print(client.get_explorer_tx_url('testTxHere'))client.purge_client()client.set_network(Network.Mainnet)print(client.get_explorer_url())print(client.get_explorer_address_url('testAddressHere'))print(client.get_explorer_tx_url('testTxHere'))TestsThese packages needed to run tests:pytestpip install pytestpytest-asynciopip install pytest-asyncioHow to run test ?$python-mpytestxchainpy/xchainpy_bitcoin/tests