{"id":15201947,"url":"https://github.com/mrtnetwork/bitcoin","last_synced_at":"2025-08-31T08:39:18.759Z","repository":{"id":219104460,"uuid":"695439040","full_name":"mrtnetwork/bitcoin","owner":"mrtnetwork","description":"a comprehensive and versatile Go library for all your Bitcoin transaction needs. offers robust support for various Bitcoin transaction types, including spending transactions, Bitcoin address management, Bitcoin Schnorr signatures, BIP-39 mnemonic phrase generation, hierarchical deterministic (HD) wallet derivation, and Secret Storage Definition","archived":false,"fork":false,"pushed_at":"2024-08-20T04:06:59.000Z","size":4163,"stargazers_count":31,"open_issues_count":1,"forks_count":8,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-08T23:32:10.399Z","etag":null,"topics":["bip39","bitcoin","bitcoin-transaction","bitcoin-wallet","go","p2pk","p2pkh","p2sh","p2sh-p2wsh","p2tr","p2wpkh","schnorr-signatures"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mrtnetwork.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-23T07:21:58.000Z","updated_at":"2024-12-15T22:57:29.000Z","dependencies_parsed_at":"2024-08-20T06:56:22.019Z","dependency_job_id":"56d1a12c-1ffc-419d-aa2a-907004224f8c","html_url":"https://github.com/mrtnetwork/bitcoin","commit_stats":{"total_commits":45,"total_committers":5,"mean_commits":9.0,"dds":0.5333333333333333,"last_synced_commit":"27052aec6337cee7fbf825cde6b6f488ef91440a"},"previous_names":["mrtnetwork/bitcoin"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/mrtnetwork/bitcoin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrtnetwork%2Fbitcoin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrtnetwork%2Fbitcoin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrtnetwork%2Fbitcoin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrtnetwork%2Fbitcoin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mrtnetwork","download_url":"https://codeload.github.com/mrtnetwork/bitcoin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrtnetwork%2Fbitcoin/sbom","scorecard":{"id":664898,"data":{"date":"2025-08-11","repo":{"name":"github.com/mrtnetwork/bitcoin","commit":"27052aec6337cee7fbf825cde6b6f488ef91440a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 2/27 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/generator-generic-ossf-slsa3-publish.yml:60","Info: jobLevel 'actions' permission set to 'read': .github/workflows/go-ossf-slsa3-publish.yml:31","Warn: no topLevel permission defined: .github/workflows/generator-generic-ossf-slsa3-publish.yml:1","Info: topLevel permissions set to 'read-all': .github/workflows/go-ossf-slsa3-publish.yml:20","Warn: no topLevel permission defined: .github/workflows/go.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generator-generic-ossf-slsa3-publish.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/mrtnetwork/bitcoin/generator-generic-ossf-slsa3-publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/generator-generic-ossf-slsa3-publish.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/mrtnetwork/bitcoin/generator-generic-ossf-slsa3-publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go-ossf-slsa3-publish.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/mrtnetwork/bitcoin/go-ossf-slsa3-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/mrtnetwork/bitcoin/go.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/mrtnetwork/bitcoin/go.yml/main?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 5 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T17:40:00.182Z","repository_id":219104460,"created_at":"2025-08-21T17:40:00.182Z","updated_at":"2025-08-21T17:40:00.182Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272959403,"owners_count":25022056,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-31T02:00:09.071Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bip39","bitcoin","bitcoin-transaction","bitcoin-wallet","go","p2pk","p2pkh","p2sh","p2sh-p2wsh","p2tr","p2wpkh","schnorr-signatures"],"created_at":"2024-09-28T03:43:47.367Z","updated_at":"2025-08-31T08:39:18.732Z","avatar_url":"https://github.com/mrtnetwork.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BITCOIN GO Package\n\na comprehensive and versatile Go library for all your Bitcoin transaction needs. offers robust support for various Bitcoin transaction types, including spending transactions, Bitcoin address management, Bitcoin Schnorr signatures, BIP-39 mnemonic phrase generation, hierarchical deterministic (HD) wallet derivation, and Web3 Secret Storage Definition.\n\nThis package was inspired by the [python-bitcoin-utils](https://github.com/karask/python-bitcoin-utils) package and turned into GO\n\n## Features\n\n### Transaction Types\n\nThis comprehensive package provides robust support for a wide array of Bitcoin transaction types, encompassing the full spectrum of Bitcoin transaction capabilities. Whether you need to execute standard payments, facilitate complex multi-signature wallets, leverage Segregated Witness (SegWit) transactions for lower fees and enhanced scalability, or embrace the privacy and flexibility of Pay-to-Taproot (P2TR) transactions, this package has you covered. Additionally, it empowers users to engage in legacy transactions, create time-locked transactions, and harness the security of multisignature (multisig) transactions. With this package, you can seamlessly navigate the diverse landscape of Bitcoin transactions, ensuring your interactions with the Bitcoin network are secure, efficient, and tailored to your specific needs.\n\n- P2PKH (Pay-to-Public-Key-Hash): The most common transaction type, it sends funds to a recipient's public key hash. Provides security and anonymity.\n\n- P2SH (Pay-to-Script-Hash): Allows more complex scripts to be used, enhancing Bitcoin's capabilities by enabling features like multisignature wallets.\n\n- P2WPKH (Pay-to-Witness-Public-Key-Hash): A Segregated Witness (SegWit) transaction type, it offers reduced fees and improved scalability while maintaining compatibility.\n\n- P2WSH (Pay-to-Witness-Script-Hash): Another SegWit transaction, it extends the benefits of SegWit to more complex script scenarios, reducing transaction size and fees.\n\n- P2TR (Pay-to-Taproot): An upgrade aiming to improve privacy and flexibility, allowing users to choose between various scripts and enhance transaction efficiency.\n\n- Legacy Transactions: Refers to older transaction types used before SegWit, with higher fees and less scalability.\n\n- Multisignature (Multisig) Transactions: Involves multiple signatures to authorize a Bitcoin transaction, commonly used for security purposes in shared wallets.\n\n- SegWit Transactions: A collective term for P2WPKH and P2WSH transactions, leveraging segregated witness data to reduce transaction size and fees.\n\n- Time-Locked Transactions: These transactions have a predetermined time or block height before they can be spent, adding security and functionality to Bitcoin smart contracts.\n\n- Coinbase Transactions: The first transaction in each block, generating new Bitcoins as a block reward for miners. It includes the miner's payout address.\n\n### Create Transaction\n\nUsing this package, you can create a Bitcoin transaction in two ways: either through the `BtcTransaction` struct or the `BitcoinTransactionBuilder` struct\n\n- BtcTransaction: To use the `BtcTransaction` struct, you should have a general understanding of how Bitcoin transactions work, including knowledge of UTXOs, scripts, various types of scripts, Bitcoin addresses, signatures, and more. We created examples and tests to enhance your understanding. An example of this transaction type is explained below, and you can also find numerous examples in the [`test`](https://github.com/mrtnetwork/bitcoin/tree/main/test) folder.\n\n- BitcoinTransactionBuilder: Even with limited prior knowledge, you can utilize this class to send various types of transactions. Below, I've provided an example in which a transaction features 8 distinct input addresses with different types and private keys, as well as 10 different output addresses. Furthermore, additional examples have been prepared, which you can find in the [`example`](https://github.com/mrtnetwork/bitcoin/tree/main/example) folder.\n\n### Addresses\n\n- P2PKH A P2PKH (Pay-to-Public-Key-Hash) address in Bitcoin represents ownership of a cryptocurrency wallet by encoding a hashed public key\n  \n- P2WPKH: A P2WPKH (Pay-to-Witness-Public-Key-Hash) address in Bitcoin is a Segregated Witness (SegWit) address that enables more efficient and secure transactions by segregating witness data, enhancing network scalability and security.\n  \n- P2WSH: A P2WSH (Pay-to-Witness-Script-Hash) address in Bitcoin is a Segregated Witness (SegWit) address that allows users to spend bitcoins based on the conditions specified in a witness script, offering improved security and flexibility for complex transaction types.\n  \n- P2TR: A P2TR (Pay-to-Taproot) address in Bitcoin is a type of address that allows users to send and receive bitcoins using the Taproot smart contract, offering enhanced privacy and scalability features.\n  \n- P2SH: A P2SH (Pay-to-Script-Hash) address in Bitcoin is an address type that enables the use of more complex scripting, often associated with multi-signature transactions or other advanced smart contract functionality, enhancing flexibility and security.\n  \n- P2SH(SEGWIT): A P2SH (Pay-to-Script-Hash) Segregated Witness (SegWit) address in Bitcoin combines the benefits of P2SH and SegWit technologies, allowing for enhanced transaction security, reduced fees, and improved scalability.\n\n### Sign\n\n- Sign message: ECDSA Signature Algorithm\n  \n- Sign Segwit(v0) and legacy transaction: ECDSA Signature Algorithm\n  \n- Sign Taproot transaction\n  \n  - Script Path and TapTweak: Taproot allows for multiple script paths (smart contract conditions) to be included in a single transaction. The \"taptweak\" ensures that the correct\n    script path is used when spending. This enhances privacy by making it difficult to determine the spending conditions from the transaction.\n\n  - Schnorr Signatures: While ECDSA is still used for Taproot, it also provides support for Schnorr signatures. Schnorr signatures offer benefits such as smaller signature sizes and\n    signature aggregation, contributing to improved scalability and privacy.\n\n  - Schnorr-Musig: Taproot can leverage Schnorr-Musig, a technique for securely aggregating multiple signatures into a single signature. This feature enables collaborative spending and\n    enhances privacy.\n\n### BIP-39\n\n- Generate BIP39 mnemonics, providing a secure and standardized way to manage keys and seed phrases\n\n### HD Wallet\n\n- Implement hierarchical deterministic (HD) wallet derivation\n\n### Web3 Secret Storage Definition\n\n- JSON Format: Private keys are stored in a JSON (JavaScript Object Notation) format, making it easy to work with in various programming languages.\n  \n- Encryption: The private key is encrypted using the user's chosen password. This ensures that even if the JSON file is compromised, an attacker cannot access the private key without the password.\n  \n- Key Derivation: The user's password is typically used to derive an encryption key using a key derivation function (KDF). This derived key is then used to encrypt the private key.\n  \n- Scrypt Algorithm: The Scrypt algorithm is commonly used for key derivation, as it is computationally intensive and resistant to brute-force attacks.\n  \n- Checksum: A checksum is often included in the JSON file to help detect errors in the password.\n  \n- Initialization Vector (IV): An IV is typically used to add an extra layer of security to the encryption process.\n  \n- Versioning: The JSON file may include a version field to indicate which version of the encryption and storage format is being used.\n  \n- Metadata: Additional metadata, such as the address associated with the private key, may be included in the JSON file.\n\n### Node Provider\n\nWe have added two APIs (Mempool and BlockCypher) to the plugin for network access. You can easily use these two APIs to obtain information such as unspent transactions (UTXO), network fees, sending transactions, receiving transaction information, and retrieving account transactions.\n\n## EXAMPLES\n\n### Key and addresses\n\n- Private key\n\n    ```go\n    // Create an EC private key instance from a WIF (Wallet Import Format) encoded string.\n    privateKey, _ := keypair.NewECPrivateFromWIF(\"cT33CWKwcV8afBs5NYzeSzeSoGETtAB8izjDjMEuGqyqPoF7fbQR\")\n\n    // Retrieve the corresponding public key from the private key.\n    publicKey := privateKey.GetPublic()\n\n    // Sign an input using the private key.\n    signSegwitV0OrLagacy := privateKey.SignInput()\n\n    // Sign a Taproot transaction using the private key.\n    signSegwitV1TapprotTransaction := privateKey.SignTaprootTransaction()\n\n    // Convert the private key to a WIF (Wallet Import Format) encoded string.\n    // The boolean argument specifies whether to use the compressed format.\n    toWif := privateKey.ToWIF(true, \u0026address.MainnetNetwork)\n\n    // Convert the private key to its hexadecimal representation.\n    toHex := privateKey.ToHex()\n    ```\n\n- Public key\n\n```go\n\n // Create an instance of an EC public key from a hexadecimal representation.\n publicKey, _ := keypair.NewECPPublicFromHex()\n\n // Generate a Pay-to-Public-Key-Hash (P2PKH) address from the public key.\n p2pkh := publicKey.ToAddress()\n\n // Generate a Pay-to-Witness-Public-Key-Hash (P2WPKH) Segregated Witness (SegWit) address from the public key.\n p2wpkh := publicKey.ToSegwitAddress()\n\n // Generate a Pay-to-Witness-Script-Hash (P2WSH) Segregated Witness (SegWit) address from the public key.\n p2wsh := publicKey.ToP2WSHAddress()\n\n // Generate a Taproot address from the public key.\n p2tr := publicKey.ToTaprootAddress()\n\n // Generate a Pay-to-Public-Key-Hash (P2PKH) inside Pay-to-Script-Hash (P2SH) address from the public key.\n p2pkhInP2sh := publicKey.ToP2PKHInP2SH()\n\n // Generate a Pay-to-Witness-Public-Key-Hash (P2WPKH) inside Pay-to-Script-Hash (P2SH) address from the public key.\n p2wpkhInP2sh := publicKey.ToP2WPKHInP2SH()\n\n // Generate a Pay-to-Witness-Script-Hash (P2WSH) inside Pay-to-Script-Hash (P2SH) address from the public key.\n p2wshInP2sh := publicKey.ToP2WSHInP2SH()\n\n // Generate a Pay-to-Public-Key (P2PK) inside Pay-to-Script-Hash (P2SH) address from the public key.\n p2pkInP2sh := publicKey.ToP2PKInP2SH()\n\n // Get the compressed bytes representation of the public key.\n compressedBytes := publicKey.ToCompressedBytes()\n\n // Get the uncompressed bytes representation of the public key.\n unCompressedBytes := publicKey.ToUnCompressedBytes(true)\n\n // extracts and returns the x-coordinate (first 32 bytes) of the ECPublic key\n // as a hexadecimal string.\n onlyX := publicKey.ToXOnlyHex()\n\n // CalculateTweak computes and returns the TapTweak value based on the ECPublic key\n // and an optional script. It uses the key's x-coordinate and the Merkle root of the script\n // (if provided) to calculate the tweak.\n tweak, _ := publicKey.CalculateTweak(scripts.Script{})\n \n // computes and returns the Taproot commitment point's x-coordinate\n // derived from the ECPublic key and an optional script, represented as a hexadecimal string.\n taproot, _ := publicKey.ToTapRotHex([]interface{}{})\n\n // Verify verifies a signature against a message\n verify := publicKey.Verify()\n\n  ```\n\n- Addresses\n\n  ```go\n  // The `...FromAddress` methods only check the address and return an error if it does not belong to Bitcoin.\n  // If you also want to verify that the address belongs to a specific network,\n  // please select the desired network using the parameters.\n\n  // Generate a Pay-to-Public-Key-Hash (P2PKH) address from the public key.\n  p2pkh, _ := address.P2PKHAddressFromAddress(\"1Q5odQtVCc4PDmP5ncrp7DSuVbh2ML4Gnb\", network)\n\n  // Generate a Pay-to-Witness-Public-Key-Hash (P2WPKH) Segregated Witness (SegWit) address from the public key.\n  p2wpkh, _ := address.P2WPKHAddresssFromAddress(\"bc1ql5eh45als8sgdkt2drsl344q55g03sj2u9enzz\")\n\n  // Generate a Pay-to-Witness-Script-Hash (P2WSH) Segregated Witness (SegWit) address from the public key.\n  p2wsh, _ := address.P2WSHAddresssFromAddress(\"bc1qf90kcg2ktg0wm983cyvhy0jsrj2fmqz26ugf5jz3uw68mtnr8ljsnf8pqe\")\n\n  // Generate a Taproot address from the public key.\n  p2tr, _ := address.P2TRAddressFromAddress(\"bc1pmelvn3xz2n3dmcsvk2k99na7kc55ry77zmhg4z39upry05myjthq37f6jk\")\n\n  // Generate a Pay-to-Public-Key-Hash (P2PKH) inside Pay-to-Script-Hash (P2SH) address from the public key.\n  p2pkhInP2sh, _ := address.P2SHAddressFromAddress(\"3HDtvvRMu3yKGFXYFSubTspbhbLagpdKJ7\")\n\n  // Generate a Pay-to-Witness-Public-Key-Hash (P2WPKH) inside Pay-to-Script-Hash (P2SH) address from the public key.\n  p2wpkhInP2sh, _ := address.P2SHAddressFromAddress(\"36Dq32LRMW8EJyD3T2usHaxeMBmUpsXhq2\")\n\n  // Generate a Pay-to-Witness-Script-Hash (P2WSH) inside Pay-to-Script-Hash (P2SH) address from the public key.\n  p2wshInP2sh, _ := address.P2SHAddressFromAddress(\"3PPL49fMytbEKJsjjPnkfWh3iWzrZxQZAg\")\n\n  // Generate a Pay-to-Public-Key (P2PK) inside Pay-to-Script-Hash (P2SH) address from the public key.\n  p2pkInP2sh, _ := address.P2SHAddressFromAddress(\"3NCe6AGzjz2jSyRKCc8o3Bg5MG6pUM92bg\")\n\n  // You can create any type of Bitcoin address with scripts.\n  // Create an address with scripts for P2WSH multisig 3-of-5.\n  newScript := scripts.NewScript(\"OP_3\", publicKey.ToHex(true), publicKey.ToHex(true), publicKey.ToHex(true), publicKey.ToHex(true), publicKey.ToHex(true), \"OP_5\", \"OP_CHECKMULTISIG\")\n\n  // Generate a P2WSH 3-of-5 address.\n  p2wsh3of5Address, _ := address.P2WSHAddresssFromScript(newScript)\n\n  // Generate a P2SH 3-of-5 address from the P2WSH address.\n  p2sh3Of5, _ := address.P2SHAddressFromScript(p2wsh3of5Address.ToScriptPubKey(), address.P2WPKHInP2SH)\n\n  // The method calculates the address checksum and returns the Base58-encoded\n  // Bitcoin legacy address or the Bech32 format for SegWit addresses.\n  p2sh3Of5.Show(network)\n\n  // Return the scriptPubKey that corresponds to this address.\n  p2sh3Of5.ToScriptPubKey()\n\n  // Access the legacy or SegWit program of the address.\n  p2sh3Of5.Program()\n  ```\n  \n### Transaction\n\n- With TransactionBuilder\n\n  ```go\n  // spending from 3 private key with 8 different address to 10 address\n  // network\n  network := address.TestnetNetwork\n  // create node provider\n  api := provider.SelectApi(provider.MempoolApi, \u0026network)\n\n  mnemonic := \"spy often critic spawn produce volcano depart fire theory fog turn retire\"\n\n  // accsess to private and public keys\n  masterWallet, _ := hdwallet.FromMnemonic(mnemonic, \"\")\n\n  // wallet with path\n  // i generate 4 HD wallet for this test and now i have access to private and pulic key of each wallet\n  sp1, _ := hdwallet.DrivePath(masterWallet, \"m/44'/0'/0'/0/0/1\")\n  sp2, _ := hdwallet.DrivePath(masterWallet, \"m/44'/0'/0'/0/0/2\")\n  sp3, _ := hdwallet.DrivePath(masterWallet, \"m/44'/0'/0'/0/0/3\")\n  sp4, _ := hdwallet.DrivePath(masterWallet, \"m/44'/0'/0'/0/0/4\")\n\n  // access to private key `ECPrivate`\n  private1, _ := sp1.GetPrivate()\n  private2, _ := sp2.GetPrivate()\n  private3, _ := sp3.GetPrivate()\n  private4, _ := sp4.GetPrivate()\n  // access to public key `ECPublic`\n  public1 := sp1.GetPublic()\n  public2 := sp2.GetPublic()\n  public3 := sp3.GetPublic()\n  public4 := sp4.GetPublic()\n\n  // now we need some address for spending or receive let doint\n  // For our test, I use public key to create addresses\n\n  // P2PKH ADDRESS\n  exampleAddr1 := public1.ToAddress()\n\n  // P2TR ADDRESS\n  exampleAddr2 := public2.ToTaprootAddress()\n\n  // P2SH(P2PKH) ADDRESS\n  exampleAddr3 := public2.ToP2PKHInP2SH()\n\n  // P2PKH ADDRESS\n  exampleAddr4 := public3.ToAddress()\n\n  // P2SH(P2PKH) ADDRESS\n  exampleAddr5 := public3.ToP2PKHInP2SH()\n\n  // P2SH(P2WSH) ADDRESS\n  exampleAddr6 := public3.ToP2WSHInP2SH()\n\n  // P2SH(P2WPKH) ADDRESS\n  exampleAddr7 := public3.ToP2WPKHInP2SH()\n\n  // P2SH(P2PK) ADDRESS\n  exampleAddr8 := public4.ToP2PKInP2SH()\n\n  // P2WPKH ADDRESS\n  exampleAddr9 := public3.ToSegwitAddress()\n\n  // P2WSH ADDRESS\n  exampleAddr10 := public3.ToP2WSHAddress()\n\n  // now we chose some address for spending from multiple address\n  // i use some different address type for this\n  spenders := []provider.UtxoOwnerDetails{\n   {PublicKey: public1.ToHex(), Address: exampleAddr1}, // p2pkh address from public1\n   {PublicKey: public2.ToHex(), Address: exampleAddr2}, // P2TRAddress address from public2\n   {PublicKey: public3.ToHex(), Address: exampleAddr7}, // P2SH(P2WPKH) address from public3\n   {PublicKey: public3.ToHex(), Address: exampleAddr9},\n   {PublicKey: public3.ToHex(), Address: exampleAddr10},\n   {PublicKey: public2.ToHex(), Address: exampleAddr3}, // P2SH(P2PKH) address public2\n   {PublicKey: public4.ToHex(), Address: exampleAddr8}, // P2SH(P2PKH) address public2\n   {PublicKey: public3.ToHex(), Address: exampleAddr4}, // p2pkh address from public1\n\n\n  \n  utxos := provider.UtxoWithOwnerList{}\n\n  // i add some method for provider to read utxos from mempol or blockCypher\n  // looping address to read Utxos\n  for _, spender := range spenders {\n  // read ech address utxo from mempol\n  spenderUtxos, err := api.GetAccountUtxo(spender)\n\n  // oh this address does not have any satoshi for spending\n  if !spenderUtxos.CanSpending() {\n   continue\n  }\n  // oh something bad happen when reading Utxos\n  if err != nil {\n   return\n  }\n  // we append address utxos to utxos list\n  utxos = append(utxos, spenderUtxos...)\n\n  // Well, now we calculate how much we can spend\n  sumOfUtxo := utxos.SumOfUtxosValue()\n\n  hasSatoshi := sumOfUtxo.Cmp(big.NewInt(0)) != 0\n\n  if !hasSatoshi {\n  // Are you kidding? We don't have btc to spend\n   return\n  }\n\n  // 1817320 sum of all utxos\n\n  // We consider 50,000 satoshi for the cost\n  // in next example i show you how to calculate fee\n  FEE := big.NewInt(50000)\n\n  // now we have 1,767,320 for spending let do it\n  // we create 8 different output with  different address type like (pt2r,p2sh(p2wpkh),p2sh(p2wsh),p2sh(p2pkh),p2sh(p2pk),p2pkh,p2wph,p2wsh and etc..)\n  // We consider the spendable amount for 10 outputs and divide by 10, each output 176,732\n  output1 := provider.BitcoinOutputDetails{\n   Address: exampleAddr4,\n   Value:   big.NewInt(176732),\n  }\n  output2 := provider.BitcoinOutputDetails{\n   Address: exampleAddr9,\n   Value:   big.NewInt(176732),\n  }\n  output3 := provider.BitcoinOutputDetails{\n   Address: exampleAddr10,\n   Value:   big.NewInt(176732),\n  }\n  output4 := provider.BitcoinOutputDetails{\n   Address: exampleAddr1,\n   Value:   big.NewInt(176732),\n  }\n  output5 := provider.BitcoinOutputDetails{\n   Address: exampleAddr3,\n   Value:   big.NewInt(176732),\n  }\n  output6 := provider.BitcoinOutputDetails{\n   Address: exampleAddr2,\n   Value:   big.NewInt(176732),\n  }\n  output7 := provider.BitcoinOutputDetails{\n   Address: exampleAddr7,\n   Value:   big.NewInt(176732),\n  }\n  output8 := provider.BitcoinOutputDetails{\n   Address: exampleAddr8,\n   Value:   big.NewInt(176732),\n  }\n  output9 := provider.BitcoinOutputDetails{\n   Address: exampleAddr5,\n   Value:   big.NewInt(176732),\n  }\n  output10 := provider.BitcoinOutputDetails{\n   Address: exampleAddr6,\n   Value:   big.NewInt(176732),\n  }\n\n  // Well, now it is clear to whom we are going to pay the amount\n  // Now let's create the transaction\n  transactionBuilder := provider.NewBitcoinTransactionBuilder(\n   // Now, we provide the UTXOs we want to spend.\n   utxos,\n\n   // We select transaction outputs\n   []provider.BitcoinOutputDetails{output1, output2, output3, output4, output5, output6, output7, output8, output9, output10},\n\n   // Transaction fee\n   // Ensure that you have accurately calculated the amounts.\n   // If the sum of the outputs, including the transaction fee,\n   // does not match the total amount of UTXOs,\n   // it will result in an error. Please double-check your calculations.\n\n   FEE,\n   // network (address.BitcoinNetwork ,ddress.TestnetNetwork)\n   \u0026network,\n\n   // If you like the note write something else and leave it blank\n   // I will put my GitHub address here\n   \"https://github.com/mrtnetwork\",\n  \n   // RBF, or Replace-By-Fee, is a feature in Bitcoin that allows you to increase the fee of an unconfirmed\n   // transaction that you've broadcasted to the network.\n   // This feature is useful when you want to speed up a\n   // transaction that is taking longer than expected to get confirmed due to low transaction fees.\n   true,\n  )\n\n  // now we use BuildTransaction to complete them\n  // I considered a method parameter for this, to sign the transaction\n\n  // utxo Utxo infos with owner details\n  // trDigest transaction digest of current UTXO (must be sign with correct privateKey)\n\n  // tweak: cheack is script path spending or tweaking the script.\n  // If tweak is set to false, it implies that you are not using the script path spending feature of Taproot,\n  // and you intend to sign the transaction using the actual script conditions.\n\n  // sighash\n  // Each input in a Bitcoin transaction can include a \"sighash type.\"\n  // This type is a flag that determines which parts of the transaction are covered by the digital signature.\n  // Common sighash types include SIGHASH_ALL, SIGHASH_SINGLE, SIGHASH_ANYONECANPAY, etc.\n  // This TransactionBuilder only works with SIGHASH_ALL and TAPROOT_SIGHASH_ALL for taproot input\n  // If you want to use another sighash, you should create another TransactionBuilder\n  transaction, err := transactionBuilder.BuildTransaction(func(trDigest []byte, utxo provider.UtxoWithOwner, multiSigPublicKey string) (string, error) {\n   var key keypair.ECPrivate\n\n   currentPublicKey := utxo.OwnerDetails.PublicKey\n   if utxo.IsMultiSig() {\n   currentPublicKey = multiSigPublicKey\n   }\n   // ok we have the public key of the current UTXO and we use some conditions to find private  key and sign transaction\n   switch currentPublicKey {\n   case public3.ToHex():\n    {\n     key = *private3\n    }\n   case public2.ToHex():\n    {\n     key = *private2\n    }\n\n   case public1.ToHex():\n    {\n     key = *private1\n    }\n   case public4.ToHex():\n    {\n     key = *private4\n    }\n   default:\n    {\n    return \"\", fmt.Errorf(\"cannot find private key\")\n    }\n   }\n   // Ok, now we have the private key, we need to check which method to use for signing\n   // We check whether the UTX corresponds to the P2TR address or not.\n   if utxo.Utxo.IsP2tr() {\n    // yes is p2tr utxo and now we use SignTaprootTransaction(Schnorr sign)\n    // for now this transaction builder support only tweak transaction\n    return key.SignTaprootTransaction(\n     trDigest, constant.TAPROOT_SIGHASH_ALL, []interface{}{}, true,\n    ), nil\n   }\n    // is seqwit(v0) or lagacy address we use  SingInput (ECDSA)\n    return key.SingInput(trDigest, constant.SIGHASH_ALL), nil\n  })\n\n  if err != nil {\n   return\n  }\n  // ok everything is fine and we need a transaction output for broadcasting\n  // We use the Serialize method to receive the transaction output\n  digest := transaction.Serialize()\n  \n  // we check if transaction is segwit or not\n  // When one of the input UTXO addresses is SegWit, the transaction is considered SegWit.\n  isSegwitTr := transactionBuilder.HasSegwit()\n\n  // transaction id\n  transactionId := transaction.TxId()\n  \n  // transaction size\n  var transactionSize int\n\n  if isSegwitTr {\n   transactionSize = transaction.GetVSize()\n  } else {\n   transactionSize = transaction.GetSize()\n  }\n    \n  // now we send transaction to network\n  trId, err := api.SendRawTransaction(digest)\n\n  if err != nil {\n   return\n  }\n  // Yes, we did :)  5015a7748d8d6df47358902b6cdc6d77ef839945c479924f4592fd89315ac0e0\n  // Now we check Mempol for what happened https://mempool.space/testnet/tx/5015a7748d8d6df47358902b6cdc6d77ef839945c479924f4592fd89315ac0e0\n\n  ```\n\n- With BtcTransaction\n  - Spend P2TR UTXO\n\n    ```go\n    // Private key of the UTXO owner\n    privateKey, _ := keypair.NewECPrivateFromWIF(\"cRvyLwCPLU88jsyj94L7iJjQX5C2f8koG4G2gevN4BeSGcEvfKe9\")\n\n    // Address we want to spend from\n    fromAddr := privateKey.GetPublic().ToTaprootAddress()\n\n    // Create an input\n    // Insert transaction ID and index of UTXO\n    sigTxin1 := scripts.NewTxInput(\"3d4c9d73c4c65772e645ff26493590ae4913d9c37125b72398222a553b73fa66\", 0)\n\n    // Address we want to send funds to\n    addr, _ := address.P2PKHAddressFromAddress(\"n4bkvTyU1dVdzsrhWBqBw8fEMbHjJvtmJR\")\n\n    // Create an output: Send 3000 to `n4bkvTyU1dVdzsrhWBqBw8fEMbHjJvtmJR`\n    txout := scripts.NewTxOutput(\n    big.NewInt(3000),\n    addr.ToScriptPubKey(),\n    )\n\n    // Create a transaction\n    tx := scripts.NewBtcTransaction(\n    []*scripts.TxInput{sigTxin1},\n    []*scripts.TxOutput{txout},\n    true, // The transaction contains one or more segwit UTXOs\n    )\n\n    // Get the transaction digest for signing input at index 0\n    // Arguments:\n    // - Index 0\n    // - The scriptPubkeys that correspond to all the inputs/UTXOs\n    // - The amounts that correspond to all the inputs/UTXOs\n    // - Ext_flag: Extension mechanism, default is 0; 1 is for tap leaf script version\n    // - tap leaf script: The script that we are spending when ext_flag is 1\n    digest := tx.GetTransactionTaprootDigest(0, []*scripts.Script{fromAddr.ToScriptPubKey()}, []*big.Int{big.NewInt(3500)}, 0, scripts.NewScript(), constant.TAPROOT_SIGHASH_ALL)\n\n    // Sign the transaction\n    // Arguments:\n    // - Transaction digest related to the index\n    // - Signature Hash Type (TAPROOT_SIGHASH_ALL)\n    // - Script path (tapleafs)\n    // - Tweak: Note that we don't use leaf version of tap-script in this transaction, so the tweak should be set to true\n    sig := privateKey.SignTaprootTransaction(digest, constant.TAPROOT_SIGHASH_ALL, []interface{}{}, true)\n\n    // Create a witness signature and set it to the transaction at the current index\n    witness := scripts.NewTxWitnessInput(sig)\n    tx.Witnesses = append(tx.Witnesses, witness)\n\n    // Transaction ID\n    tx.TxId()\n\n    // In this case, the transaction is segwit, and we must use GetVSize for transaction size\n    tx.GetVSize()\n\n    // Transaction digest ready for broadcast\n    tx.Serialize()\n\n    ```\n\n  - Spend P2PKH UTXO\n\n    ```go\n\n    // private key of UTXO owner\n    privateKey, _ := keypair.NewECPrivateFromWIF(\"...\")\n    // address we want to spend\n    fromAddr := privateKey.GetPublic().ToP2PKAddress()\n\n    // create input\n    // insert transaction ID and index of UTXO\n    sigTxin1 := scripts.NewTxInput(\"3d4c9d73c4c65772e645ff26493590ae4913d9c37125b72398222a553b73fa66\", 0)\n\n    // address we want to send\n    addr, _ := address.P2PKHAddressFromAddress(\"n4bkvTyU1dVdzsrhWBqBw8fEMbHjJvtmJR\")\n\n    // outputs 1 send 10000000 to `n4bkvTyU1dVdzsrhWBqBw8fEMbHjJvtmJR`\n    txout := scripts.NewTxOutput(\n    big.NewInt(3000),\n    addr.ToScriptPubKey())\n\n    // We will return the spent transaction balance to the account holder\n    changeTxout := scripts.NewTxOutput(\n    big.NewInt(29000000),\n    fromAddr.ToScriptPubKey(),\n     )\n\n    // create transaction\n    tx := scripts.NewBtcTransaction(\n    []*scripts.TxInput{sigTxin1},\n    []*scripts.TxOutput{txout, changeTxout},\n    false)\n\n    // get transaction digest for signing input at index 0\n    digest := tx.GetTransactionDigest(0, fromAddr.Program().ToScriptPubKey())\n\n    // sign the transaction\n    sig := privateKey.SingInput(digest)\n\n    // set unlock script to transaction\n    tx.SetScriptSig(0, scripts.NewScript(sig, privateKey.GetPublic().ToHex()))\n    // transaction id\n    tx.TxId()\n    // transaction size\n    tx.GetSize()\n    // transaction digest ready for broadcast\n    tx.Serialize()\n    ```\n  \n### BIP39\n\n```go\n\n// Create a new Bip39 instance with the desired language.\n// The default language is English. You can choose from various supported languages.\n// Language options include: English, Spanish, Portuguese, Korean, Japanese, Italian, French, Czech, ChineseTraditional, and ChineseSimplified.\nbip := bip39.Bip39{\n Language: bip39.Japanese, // Set the language to Japanese\n}\n\n// Generate a mnemonic phrase with the specified number of words.\n// You can choose from 12, 15, 18, 21, or 24 words (e.g., bip39.Words24).\nmnemonic, err := bip.GenerateMnemonic(bip39.Words24)\n\n// Derive a seed from the generated mnemonic phrase.\n// You can optionally provide a passphrase, which can be an empty string.\ntoSeed := bip39.ToSeed(mnemonic, \"PASSPHRASE\")\n\n// Convert the mnemonic phrase back to entropy.\ntoEntropy, err := bip.MnemonicToEntropy(mnemonic)\n\n// Convert the entropy back to a mnemonic phrase.\ntoMnemonicFromEntropy, err := bip.EntropyToMnemonic(toEntropy)\n\n// Change the language of the Bip39 instance to Italian.\n// You can use the `bip.ChangeLanguage()` method to switch between supported languages.\nbip.ChangeLanguage(bip39.Italian)\n\n```\n\n### HD-Wallet\n\n```go\n// Create a pointer to the Mainnet network\nnetwork := \u0026address.MainnetNetwork\n\n// Initialize a Bip39 instance with the Japanese language\nbip39Instance := bip39.Bip39{\n Language: bip39.Japanese,\n}\n\n// Generate a 24-word mnemonic using the Bip39 instance\nmn, _ := bip39Instance.GenerateMnemonic(bip39.Words24)\n\n// Create a master wallet from the generated mnemonic and a passphrase\nmasterWallet, _ := hdwallet.FromMnemonic(mn, \"MYPASSPHRASE\")\n\n// Derive an extended private key (xPrive) for the specified address type and network\nxPrive := masterWallet.ToXPrivateKey(address.P2PKH, network)\n\n// Derive an extended public key (xPub) for the specified address type and network\nxPub := masterWallet.ToXPublicKey(address.P2PKH, network)\n\n// Create a master public wallet from the derived xPub, specifying SegWit support and the network\nmasterPublicWallet, _ := hdwallet.FromXPublicKey(xPub, true, network)\n\n// Derive a child wallet (driveFromPublicWallet) from the master public wallet using a specific derivation path\ndriveFromPublicWallet, _ := hdwallet.DrivePath(masterPublicWallet, \"m/0/1\")\n\n// Get the public key of the child wallet (driveFromPublicWallet)\npublicKeyOfMasterPublicWallet := driveFromPublicWallet.GetPublic()\n\n// Derive a child wallet (drivePrivateWallet) from the master public wallet using a different derivation path\ndrivePrivateWallet, _ := hdwallet.DrivePath(masterPublicWallet, \"m/44'/0'/0'/1\")\n\n// Derive an extended private key from the child wallet (drivePrivateWallet) for the specified address type and network\n_ = drivePrivateWallet.ToXPrivateKey(address.P2PKH, network)\n\n// Derive an extended public key from the child wallet (drivePrivateWallet) for the specified address type and network\n_ = drivePrivateWallet.ToXPublicKey(address.P2PKH, network)\n\n// Get the public key of the child wallet (drivePrivateWallet)\npublicKey := drivePrivateWallet.GetPublic()\n\n// Get the private key of the child wallet (drivePrivateWallet)\nprivateKey, _ := drivePrivateWallet.GetPrivate()\n\n```\n\n### Web3 Secret Storage Definition(KeyStore)\n\n```go\n// Create a pointer to the Mainnet network\nnetwork := \u0026address.MainnetNetwork\n\n// Initialize a Bip39 instance with the Japanese language\nbip39Instance := bip39.Bip39{\n Language: bip39.Japanese,\n}\n\n// Generate a 24-word mnemonic using the Bip39 instance\nmn, _ := bip39Instance.GenerateMnemonic(bip39.Words24)\n\n// Define your password\nmyPassword := \"myPassword\"\n\n// Create a master wallet from the generated mnemonic and a passphrase\nmaterWallet, _ := hdwallet.FromMnemonic(mn, \"MYPASSPHRASE\")\n\n// Derive an extended private key (xPrive) for the specified address type and network\nxPrive := materWallet.ToXPrivateKey(address.P2PKH, network)\n\n// Define Scrypt parameters (N and p)\nscryptN := 8192\np := 1\n\n// Create an encrypted wallet using the xPrive key, password, Scrypt parameters, and p\nencryptWallet, _ := secretwallet.NewSecretWallet(xPrive, myPassword, scryptN, p)\n\n// Convert the encrypted wallet to a JSON representation\nencrypted, _ := encryptWallet.ToJSON()\n\n// Decode the encrypted wallet using the password\ndecodedWallet, _ := secretwallet.DecodeSecretWallet(encrypted, myPassword)\n\n// Create a new wallet from the decoded credentials, specifying SegWit support and the network\nnewWallet, _ := hdwallet.FromXPrivateKey(decodedWallet.Credentials, true, network)\n\n```\n\n### Node provider\n\n```go\n// select network testnet or mainnet\nnetwork := address.TestnetNetwork\n\n// create api (BlockCyperApi or MempoolApi)\n// Currently, only a few critical methods have been implemented to retrieve unspent transactions,\n// obtain network fees, receive transactions, and send transactions to the network.\napi := provider.SelectApi(provider.MempoolApi, \u0026network)\n\n// Read Transaction id(hash)\ntr, e := api.GetTransaction(\"d4bad8e07d30ca4389ec8a203318aa523cc3e36c9730d0a6852a3801d086c5fe\")\n\n// Read accounts UTXOS\naddr, _ := address.P2WPKHAddresssFromAddress(\"tb1q92nmnvhj04sqd4x7wjaewlt5jn8n3ngmplcymy\")\nutxos, e := api.GetAccountUtxo(provider.UtxoOwnerDetails{\n PublicKey: \"\",\n Address:   addr,\n})\n\n// Network fee\nfee, e := api.GetNetworkFee()\n\n//  Send transaction\n_, _ = api.SendRawTransaction(\"TRANSACTION DIGEST\")\n\n// Read account transactions\ntransaction, _ := api.GetAccountTransactions(addr.Show(network), func(url string) string {\n return url\n})\n\n```\n\n## Contributing\n\nContributions are welcome! Please follow these guidelines:\n\n- Fork the repository and create a new branch.\n- Make your changes and ensure tests pass.\n- Submit a pull request with a detailed description of your changes.\n\n## Feature requests and bugs\n\nPlease file feature requests and bugs in the issue tracker.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrtnetwork%2Fbitcoin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrtnetwork%2Fbitcoin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrtnetwork%2Fbitcoin/lists"}