{"id":14539554,"url":"https://github.com/grondilu/bitcoin-bash-tools","last_synced_at":"2025-05-16T10:05:36.384Z","repository":{"id":1291310,"uuid":"1232235","full_name":"grondilu/bitcoin-bash-tools","owner":"grondilu","description":"Set of bitcoin-related bash functions","archived":false,"fork":false,"pushed_at":"2025-01-24T17:02:17.000Z","size":1313,"stargazers_count":250,"open_issues_count":1,"forks_count":80,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-05-16T10:03:46.305Z","etag":null,"topics":["bash-scripting","bip32","bip39","bip44","bip49","bip84","bip85","bitcoin"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grondilu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null}},"created_at":"2011-01-08T05:07:00.000Z","updated_at":"2025-03-05T14:36:35.000Z","dependencies_parsed_at":"2023-07-09T12:16:18.325Z","dependency_job_id":"f0e7937b-8cfc-4d5b-9ada-8edf3191ac08","html_url":"https://github.com/grondilu/bitcoin-bash-tools","commit_stats":{"total_commits":567,"total_committers":12,"mean_commits":47.25,"dds":"0.13051146384479717","last_synced_commit":"d58eedf4a7740ea9000b75fb53c2c34fff43a1e4"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grondilu%2Fbitcoin-bash-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grondilu%2Fbitcoin-bash-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grondilu%2Fbitcoin-bash-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grondilu%2Fbitcoin-bash-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grondilu","download_url":"https://codeload.github.com/grondilu/bitcoin-bash-tools/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254509476,"owners_count":22082891,"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","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":["bash-scripting","bip32","bip39","bip44","bip49","bip84","bip85","bitcoin"],"created_at":"2024-09-05T15:01:30.156Z","updated_at":"2025-05-16T10:05:36.312Z","avatar_url":"https://github.com/grondilu.png","language":"Shell","funding_links":[],"categories":["Shell"],"sub_categories":[],"readme":"Bitcoin bash tools\n==================\n\n[Bitcoin](http://bitcoin.org)-related functions in [Bash](https://www.gnu.org/software/bash/).\n\n## Table of contents\n* [Synopsis](#synopsis)\n* [Description](#description)\n  * [Base-58](#base58)\n  * [bech32](#bech32)\n  * [Wallet Import Format](#wif)\n  * [Extended keys](#extended)\n  * [Mnemonics](#mnemonics)\n    * [BIP-39](#bip39)\n    * [Memory Techniques](#memtechniques)\n  * [Addresses](#addresses)\n  * [BIP-85](#bip85)\n* [Requirements](#requirements)\n* [TODO](#todo)\n* [Feedback](#feedback)\n* [Related projects](#related)\n* [License](#license)\n\n\n\u003ca name=\"synopsis\"/\u003e\n\n## Synopsis\n\n```console\n$ git clone https://github.com/grondilu/bitcoin-bash-tools.git\n$ . bitcoin-bash-tools/bitcoin.sh\n\n$ openssl rand 32 |wif\n\n$ mnemonic=($(create-mnemonic 128))\n$ echo \"${mnemonic[@]}\"\n\n$ mnemonic-to-seed \"${mnemonic[@]}\" \u003e seed\n\n$ xkey -s /N \u003c seed\n$ ykey -s /N \u003c seed\n$ zkey -s /N \u003c seed\n\n$ bitcoinAddress \"$(xkey -s /44h/0h/0h/0/0/N \u003c seed |base58 -c)\"\n$ bitcoinAddress \"$(ykey -s /49h/0h/0h/0/0/N \u003c seed |base58 -c)\"\n$ bitcoinAddress \"$(zkey -s /84h/0h/0h/0/0/N \u003c seed |base58 -c)\"\n\n$ bip85 wif\n$ bip85 mnemo\n$ bip85 xprv\n\n$ (cd bitcoin-bash-tools; prove;)\n```\n\n\u003ca name=description /\u003e\n\n## Description\n\nThis repository contains bitcoin-related bash functions, allowing bitcoin\nprivate keys generation and processing from and to various formats.\n\nTo discourage the handling of keys in plain text, most of these functions\nmainly read and print keys in *binary*.  The base58check version is only read\nor printed when reading from or writing to a terminal.\n\n\u003ca name=base58 /\u003e\n\n### Base-58 encoding\n\n`base58` is a simple [filter](https://en.wikipedia.org/wiki/Filter_\\(software\\))\nimplementing [Satoshi Nakamoto's binary-to-text encoding](https://en.bitcoin.it/wiki/Base58Check_encoding).\nIts interface is inspired from [coreutils' base64](https://www.gnu.org/software/coreutils/base64).\n\n    $ openssl rand 20 |base58\n    2xkZS9xy8ViTSrJejTjgd2RpkZRn\n\nWith the `-c` option, the checksum is added.\n\n    $ echo foo |base58 -c\n    J8kY46kF5y6\n\nWith the `-v` option, the checksum is verified.\n\n    $ echo foo |base58   |base58 -v || echo wrong checksum\n    wrong checksum\n    $ echo foo |base58 -c|base58 -v \u0026\u0026 echo good checksum\n    good checksum\n\nDecoding is done with the `-d` option.\n\n    $ base58 -d \u003c\u003c\u003cJ8kY46kF5y6\n    foo\n    M-MDjM-^E\n\nAs seen above, when writing to a terminal, `base58` will escape non-printable characters.\n\nInput can be coming from a file when giving the filename\n(or say a [process substitution](https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html))\nas positional parameter :\n\n    $ base58 \u003c(echo foo)\n    3csAed\n\nA large file will take a very long time to process though, as this encoding is absolutely not\noptimized to deal with large data.\n\n\u003ca name=bech32 /\u003e\n\n### Bech32\n\n[Bech32](https://en.bitcoin.it/wiki/Bech32) is a string format used to encode\n[segwit](https://en.bitcoin.it/wiki/Segregated_Witness) addresses, but by\nitself it is not a binary-to-text encoding, as it needs additional conventions\nfor padding.\n\nTherefore, the `bech32` function in this library does not read binary data, but\nmerely creates a Bech32 string from a human readable part and a non checked data\npart :\n\n    $ bech32 this-part-is-readable-by-a-human qpzry\n    this-part-is-readable-by-a-human1qpzrylhvwcq\n\nThe `-m` option creates a\n[bech32m](https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki)\nstring :\n\n    $ bech32 -m this-part-is-readable-by-a-human qpzry\n    this-part-is-readable-by-a-human1qpzry2tuzaz\n\nThe `-v` option can be used to verify the checksum :\n\n    $ bech32 -v this-part-is-readable-by-a-human1qpzrylhvwcq \u0026\u0026 echo good checksum\n    good checksum\n\n    $ bech32 -m -v this-part-is-readable-by-a-human1qpzry2tuzaz \u0026\u0026 echo good checksum\n    good checksum\n\n\u003ca name=wif /\u003e\n\n### Wallet Import Format\n\nThe function `wif` reads 32 bytes from stdin,\ninterprets them as a [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) exponent\nand displays the corresponding private key in [Wallet Import\nFormat](https://en.bitcoin.it/wiki/Wallet_import_format).\n\n    $ openssl rand 32 |wif\n    L1zAdArjAUgbDKj8LYxs5NsFk5JB7dTKGLCNMNQXyzE4tWZBGqs9\n\nWith the `-u` option, the uncompressed version is returned.\n\nWith the `-t` option, the [testnet](https://en.bitcoin.it/wiki/Testnet)\nversion is returned.\n\nWith the `-d` option, the reverse operation is performed : reading a\nkey in WIF from stdin and printing 32 bytes to non-terminal standard output.\nWhen writing to a terminal, the output is in a format used by\n[openssl ec](https://www.openssl.org/docs/man1.0.2/man1/ec.html).\n\n\n\u003ca name=extended /\u003e\n\n### Extended keys\n\nGeneration and derivation of *eXtended keys*, as described in\n[BIP-0032](https://en.bitcoin.it/wiki/BIP_0032) and its successors BIP-0044,\nBIP-0049 and BIP-0084, are supported by three filters, namely `bip32`, `bip49` and `bip84`,\nalong with three respective aliases `xkey`, `ykey` and `zkey`.\nThe aliases exist for the sole reason that they are arguably easier to type.\n\nUnless the option `-p`, `-s` or `-t` is used, these functions read 78 bytes\nfrom stdin and interpret these as a serialized extended key.   Then the\nextended key derived according to a derivation path provided as a positional\nparameter is computed and printed on stdout.\n\nA base58check-encoded key can be passed as input if it is pasted\nin the terminal, but to pass it through a pipe, it must first be decoded with\n`base58 -d`:\n\n    $ myxprvkey=xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U\n    $ base58 -d \u003c\u003c\u003c\"$myxprvkey\" |xkey /0\n    xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt\n\nTo capture the base58check-encoded result, encoding must be performed explicitely with `base58 -c`.\n\n    $ myXkey=\"$(base58 -d \u003c\u003c\u003c\"$myxprvkey\"| xkey /0 |base58 -c)\"\n\nWhen the `-s` option is used, stdin is used as a binary seed instead\nof an extended key.  This option is thus required to generate a master key :\n\n    $ openssl rand 64 |tee myseed |xkey -s\n    xprv9s21ZrQHREDACTEDtahEqxcVoeTTAS5dMAqREDACTEDDZd7Av8eHm6cWFRLz5P5C6YporfPgTxC6rREDACTEDn5kJBuQY1v4ZVejoHFQxUg\n\nAny key in the key tree can be generated from a seed, though:\n\n    $ xkey -s m/0h/0/0 \u003c myseed\n\nWhen the `-t` option is used, stdin is used as a binary seed and the generated\nkey will be a testnet key.\n\n    $ xkey -t \u003c myseed\n    tprv8ZgxMBicQKsPen8dPzk2REDACTEDiRWqeNcdvrrxLsJ7UZCB3wH5tQsUbCBEPDREDACTEDfTh3skpif3GFENREDACTEDgemFAhG914qE5EC\n\n`N` is the derivation operator used to get the so-called *neutered* key, a.k.a the public extended key.\n\n    $ base58 -d \u003c\u003c\u003c\"$myxprvkey\" |xkey /N\n    xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB\n\n`ykey` and `zkey` differ from `xkey` mostly by their serialization format, as described in bip-0049 and bip-0084.\n\n    $ openssl rand 64 \u003e myseed\n    $ ykey -s \u003c myseed\n    yprvABrGsX5C9jantX14t9AjGYHoPw5LV3wdRD9JH3UxsEkMsxv3BcdzSFnqNidrmQ82nnLCmu3w6PWMZjPTmLKSAdBFBnXhqoE3VgBQLN6xJzg\n    $ zkey -s \u003c myseed\n    zprvAWgYBBk7JR8GjieqUJjUQTqxVwy22Z7ZMPTUXJf2tsHG5Wa83ez3TQFqWWNCTVfyEc3tk7PxY2KTytxCMvW4p7obDWvymgbk2AmoQq1qL8Q\n\nYou can feed any file to these functions, and such file doesn't have to be 64 bytes long.\nIt should, however, contain at least that much entropy.\n\nIf the derivation path begins with `m` or `M`, and unless the option `-p`, `-s` or\n`-t` is used, additional checks are performed to ensure that the input is a\nmaster private key or a master public key respectively.\n\nWhen reading a binary seed, under the hood the seed feeds the following openssl command :\n\n```bash\nopenssl dgst -sha512 -hmac \"Bitcoin seed\" -binary\n```\n\nThe output of this command is then split in two to produce a *chain code* and a private exponent,\nas described in bip-0032.\n\n\u003ca name=mnemonics /\u003e\n\n### Mnemonics\n\nIt is possible to store the keys of a hierarchical deterministic wallet in biological\nmemory using mnemonics.  There are at least two ways to do so : the first one\nis to follow the dedicated BIP, and the other is to use known memory techniques.\n\n\u003ca name=bip39 /\u003e\n\n#### Bip-39\n\nA seed can be produced from a *mnemonic*, a.k.a a *secret phrase*, as described\nin [BIP-0039](https://en.bitcoin.it/wiki/BIP_0039).\n\nTo create a mnemonic, a function `create-mnemonic` takes as argument an amount of entropy in bits\neither 128, 160, 192, 224 or 256.  Default is 160.\n\n    $ create-mnemonic 128\n    invest hedgehog slogan unfold liar thunder cream leaf kiss combine minor document\n\nThe function will attempt to read the [locale](https://man7.org/linux/man-pages/man1/locale.1.html)\nsettings to figure out which language to use.  If it fails, or if the local language is not\nsupported, it will use English.\n\n\u003c!-- NYI\nBIP-0039 discourages the use of non-English words, so by default the library\nwill use English word.  To override this and use the locale settings, set \nthe `BIP39_USE_LANG` environment variable to `yes`.  The library will\nthen use the `LANG` environment variable if possible.\n\nThis must be done before loading the library.\n\n    $ BIP39_USE_LANG=yes LANG=zh_CN\n    $ . bitcoin.sh\n    $ create-mnemonic\n    凍濾槍斷覆捉斷山未飛沿始瓦曰撐\n\nAs you can see, Chinese output does not use spaces.\n--\u003e\n\nAlternatively, the function can take as argument some noise in hexadecimal (the\ncorresponding number of bits must be a multiple of 32).\n\n    $ create-mnemonic \"$(openssl rand -hex 20)\"\n    poem season process confirm meadow hidden will direct seed void height shadow live visual sauce\n\nTo create a seed from a mnemonic, there is a function `mnemonic-to-seed`.\n\n    $ mnemonic=($(create-mnemonic))\n    $ mnemonic-to-seed \"${mnemonic[@]}\"\n\nThis function expects several words as arguments, not a long string of space-separated words, so mind\nthe parameter expansion (`@` or `*` in arrays for instance).\n\n`mnemonic-to-seed` output is in binary, but when writing to a terminal, it will escape non-printable charaters.\nOtherwise, output is pure binary so it can be fed to a bip-0032-style function directly :\n\n    $ mnemonic-to-seed \"${mnemonic[@]}\" |xkey -s /N\n\nWith the `-p` option, `mnemonic-to-seed` will prompt a passphrase.  With the `-P` option, it\nwill prompt it twice and will not echo the input.\n\nThe passphrase can also be given with the `BIP39_PASSPHRASE` environment variable :\n\n    $ BIP39_PASSPHRASE=sesame mnemonic-to-seed \"${mnemonic[@]}\" |xkey -s /N\n\n\u003ca name=memtechniques /\u003e\n\n#### Memory Techniques\n\nAn alternative to bip-39 is to use [memory techniques](https://artofmemory.com/).\n\nOnce you've become familiar with these techniques, you can memorize a seed in\nseveral ways, you just have to make sure you also remember your choice of encoding.\nFor instance, if you've memorized a long number in decimal, you could either\nuse its representation in ASCII or a byte stream generated from it with dc's\n`P` command.\n\n\u003ca name=addresses /\u003e\n\n### Address generation\n\nA function called `bitcoinAddress` takes a bitcoin key, either vanilla or\nextended, and displays the corresponding bitcoin address. Unlike functions\ndescribed above, `bitcoinAddress` currently takes input as positional parameters,\nand not from stdin.  This might change in future versions, as it is probably\nnot a good idea to write bitcoin private keys in plain text on the command line.\n\nFor a vanilla private key in WIF,\nthe [P2PKH invoice address](https://en.bitcoin.it/wiki/Invoice_address)\nis produced :\n\n    $ bitcoinAddress KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn\n    1BgGZ9tcN4rmREDACTEDprQz87SZ26SAMH\n\nRight now, for extended keys, only neutered keys are processed.  So if you want\nthe bitcoin address of an extended private key, you must neuter it first.\n\n    $ openssl rand 64 \u003e seed\n    $ bitcoinAddress \"$(xkey -s /N \u003c seed |base58 -c)\"\n    18kuHbLe1BheREDACTEDgzHtnKh1Fm3LCQ\n\n*xpub*, *ypub* and *zpub* keys produce addresses of different formats, as\nspecified in their respective BIPs :\n\n    $ bitcoinAddress \"$(ykey -s /N \u003c seed |base58 -c)\"\n    3JASVbGLpb4W9oREDACTEDB6dSWRGQ9gJm\n    $ bitcoinAddress \"$(zkey -s /N \u003c seed |base58 -c)\"\n    bc1q4r9k3p9t8cwhedREDACTED5v775f55at9jcqqe\n\n\n\u003ca name=bip85 /\u003e\n\n### BIP85\n\nThe `bip85` function implements [BIP-0085](https://en.bitcoin.it/wiki/BIP_0085),\na method of normalizing generation and format of entropy from a given master extended private key.\n\nThe function reads a master extended private key from standard input, as `xkey` would.  When reading from a terminal,\nthe function will expect the base58-checked encoding.  Otherwise it will expect the binary version.\n\nFor illustration purpose, we'll use the same key used for the test vectors in BIP-0085.\n\n    $ root=xprv9s21ZrQH143K2LBWUUQRFXhucrQqBpKdRRxNVq2zBqsx8HVqFk2uYo8kmbaLLHRdqtQpUm98uKfu3vca1LqdGhUtyoFnCNkfmXRyPXLjbKb\n\nThe general syntax is `bip85 APP [PARAMETERS...]`, where *APP* is a word designating the desired application,\nas described below.\n\n#### Mnemonic\n\nTo create a bip-39 mnemonic, use `mnemo` as *APP*.  The optional parameters are\nthe number of words (default is 12) and the index (default is zero).\n\n    $ base58 -d \u003c\u003c\u003c\"$root\" | bip85 mnemo\n    girl mad pet galaxy egg matter matrix prison refuse sense ordinary nose\n\n#### HD-Seed WIF\n\nTo create a hd-seed, use `wif` as *APP*.  The WIF will only be printed on a terminal.\n\n    $ base58 -d \u003c\u003c\u003c\"$root\" | bip85 wif\n    Kzyv4uF39d4Jrw2W7UryTHwZr1zQVNk4dAFyqE6BuMrMh1Za7uhp\n\nYou can specify an optional index :\n\n    $ base58 -d \u003c\u003c\u003c\"$root\" | bip85 wif 1\n    L45nghBsnmqaGj9VyREDACTEDJNi6K4LUFP4REDACTEDLEyXUkYP\n\n#### Extended master key\n\nTo derive an other extended master key, use `xprv` as *APP*.\n\n    $ base58 -d \u003c\u003c\u003c\"$root\" | bip85 xprv\n    xprv9s21ZrQH143K2srSbCSg4m4kLvPMzcWydgmKEnMmoZUurYuBuYG46c6P71UGXMzmriLzCCBvKQWBUv3vPB3m1SATMhp3uEjXHJ42jFg7myX\n\nYou can specify an optional index :\n\n    $ base58 -d \u003c\u003c\u003c\"$root\" | bip85 xprv 1\n    xprv9s21ZrQH143K38mDZkjREDACTEDWyjWiejciPyREDACTED9Vg3WCWnhkPW3rKsPT6u3MREDACTEDxjBjFES1xCzEtxTSAfQTapE7CXcbQ4b\n\n\u003ca name=requirements /\u003e\n\n## Requirements\n\n- [bash](https://www.gnu.org/software/bash/) version 4 or above;\n- [GNU's Coreutils](https://www.gnu.org/software/coreutils/);\n- [dc](https://en.wikipedia.org/wiki/Dc_\\(computer_program\\)), the Unix desktop calculator;\n- openssl, the [OpenSSL](https://en.wikipedia.org/wiki/OpenSSL) command line tool.\n- Perl and Test::Harness for [TAP](http://testanything.org)\n\n\u003ca name=todo /\u003e\n\n## TODO\n\n* [x] [BIP 0032](https://en.bitcoin.it/wiki/BIP_0032)\n* [x] [BIP 0039](https://en.bitcoin.it/wiki/BIP_0039)\n* [ ] [BIP 0085](https://github.com/bitcoin/bips/blob/master/bip-0085.mediawiki)\n* [x] [BIP 0173](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki)\n* [x] [BIP 0350](https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki)\n* [x] [TAP](http://testanything.org/) support\n* [ ] offline transactions\n* [ ] ~~copy the [Bitcoin eXplorer](https://github.com/libbitcoin/libbitcoin-explorer.git) interface as much as possible~~\n* [ ] put everything in a single file\n* [x] use [Jacobian coordinates](https://en.wikibooks.org/wiki/Cryptography/Prime_Curve/Jacobian_Coordinates)\n* [ ] use a better exponentiation method, for instance using precomputations\n* [ ] always output public keys in ASCII, and private keys in binary\n* [ ] get `bitcoinAddress` to generate various addresses from extended keys, picking an appropriate derivation path.\n* [ ] ensure idempotence\n* [x] get rid of `coproc`\n\n\u003ca name=related /\u003e\n\n## Related projects\n\n- [bx](https://github.com/libbitcoin/libbitcoin-explorer), a much more complete command-line utility written in C++.\n- [learnmeabitcoin.com](https://learnmeabitcoin.com/), a very nice website explaining how bitcoin works.\n\n\u003ca name=feedback /\u003e\n\n## Feedback\n\nTo discuss this project without necessarily opening an issue, feel free to use the\n[discussions](https://github.com/grondilu/bitcoin-bash-tools/discussions) tab.\n\n\u003ca name=license /\u003e\n\n## License\n\nCopyright (C) 2013 Lucien Grondin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrondilu%2Fbitcoin-bash-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrondilu%2Fbitcoin-bash-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrondilu%2Fbitcoin-bash-tools/lists"}