Trust-minimized Bitcoin wallet

Overview

coldcore

Trust-minimized, airgapped Bitcoin management

build

This is experimental software. Wait for a formal release before use with real funds.

A trust-minimized Bitcoin wallet interface that relies only on Bitcoin Core.

  • Zero install process for most platforms
  • Designed for simplicity and auditability
  • No GUI, terminal only (curses and command-line)
  • Works in terms of script descriptors and PSBTs
  • Minimal dependencies: Bitcoin Core, Python 3 interpreter, nothing else
  • Supports only airgapped, opensource hardware wallets
  • Integrates with GPG and pass for secure xpub storage

In short, this is the easiest way to do air-gapped wallet management with Bitcoin Core, Coldcard, and not much else.



Requirements

  • Linux or MacOS
    • This has only been nominally tested on macOS so expect bugs
    • Support for Windows is planned, but I'll need someone with a Windows computer to help
  • Bitcoin Core 0.18+
  • Python 3.7+ (your system probably already has this)
  • Coldcard

home

Install process

  1. Buy a Coldcard
  2. Download, install, and sync Bitcoin Core
  3. Ensure Python 3.7+ is on your system: $ python3 --version and if not, install it.
  4. Clone this repo: git clone https://github.com/jamesob/coldcore
  5. Make coldcore executable and run it
    • cd coldcore; chmod +x coldcore; ./coldcore --help
  6. Optionally, install coldcore to your path
    • cp coldcore ~/.local/bin/coldcore # or somewhere on your PATH
  7. Boot 'er up
    • coldcore

Verifying the install (optional but recommended)

  1. Receive my keys in GPG:
    • gpg --keyserver keyserver.ubuntu.com --recv-keys 0x25F27A38A47AD566
    • You can verify this fingerprint on my Twitter: https://twitter.com/jamesob
  2. Get the sigs for the release:
    • Get the signature: curl -O http://img.jameso.be/sigs/coldcore-$(./coldcore --version).asc
    • Verify the signature: gpg coldcore-[version].asc
    • Ensure it matches: sha256sum coldcore

Experimenting with testnet

If you're going to use this wallet, probably best to familiarize yourself with it by doing a few test transactions in testnet.

  1. Run Bitcoin Core locally with -testnet.
  2. Set your Coldcard to work on testnet: Settings > Blockchain > Testnet: BTC
  3. Run through the Coldcore setup flow: coldcore setup
    • Coldcore will autodetect your testnet RPC connection, however you can manually set coldcard --rpc <url> if desired.

Design

Zero install process

As long as you have Bitcoin Core and a Python 3.7+ installation, you're ready to go. No dealing with package managers, no worrying about dependencies, no setting up an indexing server. This is just stdlib Python that likely shipped with your OS. We let Core and Coldcard do the heavy lifting.

Auditability

This project is designed to be auditable. It is a single executable script ~2000 LOC written in straightforward, stdlib Python 3. Most programmers should be able to read through in an hour.

Minimal dependencies

Other wallets require indexing services that can take hours to provision (after Core's initial block download), consume gigabytes of space, and are confusing to configure even for software engineers.

This is a single script that most people with basic programming knowledge can at least skim.

Other wallets require graphical runtimes (GUI toolkits, browsers) that not only entail much more code, but are more prone to exploits. Handling wallet operations through Chrome isn't appropriate beyond a certain point; browser authors could conceivably collect or manipulate data, and browsers are often loaded with third-party plugins. Who wants to audit Qt? Not me.

dashboard

This script uses only terminal interfaces, and one of the design goals is to make them approachable for people who haven't previously interacted with the command line much. So if you've been wanting to learn about the shell, this is a pretty good opportunity.

Air-gapped hardware wallet support

This library will only support air-gapped interaction with hardware wallets that are opensource. Right now, that means that Coldcard is the only key storage mechanism supported, but I'm happy to add others that fit the criteria of

  • being opensource, and
  • supporting air-gapped interaction.

Auditing

The final script, coldcore, is dumbly compiled from the contents of src/coldcore/ for convenience during development (per ./bin/compile).

If you want to read through, I recommend starting with the src/coldcore tree.

.
├── bin
│   ├── compile                    # generates final `coldcore` script
│   └── sign_release 
├── coldcore
├── sigs                           # signatures for verification
│   └── coldcore-0.1.0-alpha.asc
└── src
    ├── coldcore
    │   ├── crypto.py              # a few basic cryptographic utilities
    │   ├── __init__.py
    │   ├── main.py                # most logic is here; wallet ops, CLI, models
    │   ├── test_coldcard.py 
    │   ├── test_crypto.py
    │   ├── thirdparty
    │   │   ├── bitcoin_rpc.py     # taken from python-bitcoinlib
    │   │   ├── clii.py            # taken from jamesob/clii
    │   │   ├── __init__.py
    │   │   └── py.typed
    │   └── ui.py                  # presentation logic, curses
    ├── requirements-dev.txt
    └── setup.py                   # for development use only

Status

While this script is relatively simple, and I'm fairly sure there aren't any ways to lose funds using it (knock wood), it is young and in alpha. Some bugs are only shallow under time, so unless you're a highly technical user who can scrutinize the code pretty closely, hold off on using this for a few months.

I am using this code to manage my mainnet coins, but I don't recommend you do the same until a stable release.

Usage

Receiving

You can use newaddr to generate addresses to receive to:

 % ./coldcore newaddr --help
usage: coldcore newaddr [-h] [--num NUM]

optional arguments:
  -h, --help  show this help message and exit
  --num NUM   default: 1

or just generate addresses and copy/paste from the dashboard view.

Sending

To send, use a combination of prepare-send and broadcast:

% SEND_TO_ADDR=tb1qj2sjxuhxqyfgxkf6kqnthskqtum8hr2zr0l95j

% ./coldcore prepare-send $SEND_TO_ADDR 0.00001
 -- 1 inputs, 2 outputs
 -- fee: 0.00000141 BTC (14.10% of amount)
 ✔  wrote PSBT to unsigned-20201222-0920.psbt - sign with coldcard

% # I transfer the .psbt file to a microSD, sign with the coldcard, and plug
% # the microSD back in...

% ./coldcore broadcast /media/james/3264-6339/unsigned-20201222-0920-signed.psbt
 !  About to send a transaction:

     <- tb1qumfrma8gy08wcfq0ugwknh8cy0cdds5df8lfya  (0.00009859 BTC)

     -> tb1qj2sjxuhxqyfgxkf6kqnthskqtum8hr2zr0l95j  (0.00001000 BTC)  (your address)
     -> tb1qfs2yd54mmdzvrsnzdqk852crzclkn8cfx8cgzf  (0.00008718 BTC)  (your address)

 ?  look okay? [y/N]: y
 ✔  tx sent: d859cfe7a05e70e5d1e734244fb731c988bb29b236bd108529145cf987b8467f
d859cfe7a05e70e5d1e734244fb731c988bb29b236bd108529145cf987b8467f

Comparison to other wallets

Coldcore is very minimal in its feature set - it's basically just meant for sending and receiving to singlesig keys on airgapped hardware wallets. There are plans to add multisig support.

Other wallets do much more than coldcore, but they are orders of magnitude greater in terms of source code and therefore much harder to audit.

Coldcore weighs in at about 2100 lines of fairly readable code. And that's including at least a few lines of stupid ASCII art and airy presentation logic.

github.com/AlDanial/cloc v 1.86  T=0.04 s (27.3 files/s, 84781.1 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Python                           1            673            313           2123
-------------------------------------------------------------------------------

Electrum is about 54,000 lines of Python, and requires numerous dependencies and an indexing server.

% cloc electrum --exclude-dir=tests
     259 text files.
     258 unique files.
      27 files ignored.

github.com/AlDanial/cloc v 1.86  T=0.65 s (358.5 files/s, 124875.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Python                         210           9305           8436          54293
JSON                             6              0              0           6178
SVG                             11              2              6           2730
Java                             1             14              2             73
Markdown                         2             21              0             49
Protocol Buffers                 1              2              8             37
F#                               2              2              0             12
-------------------------------------------------------------------------------
SUM:                           233           9346           8452          63372
-------------------------------------------------------------------------------

Specter-desktop requires 5x the Python this library does as well as a bunch of JavaScript.

% cloc src/cryptoadvance/specter
     192 text files.
     191 unique files.
      76 files ignored.

github.com/AlDanial/cloc v 1.86  T=0.23 s (525.5 files/s, 229720.5 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
JavaScript                      10           2296           5683          29037
Python                          53           1359           1236           9588
CSS                              2             24             33           1074
HTML                             7             42             28            878
SVG                             47              2             27            715
-------------------------------------------------------------------------------
SUM:                           119           3723           7007          41292
-------------------------------------------------------------------------------

These are both good products and I don't mean to disparage them, but personally I think they are overkill for the kind of simple wallet operations I need to do.

Security assumptions

  • Your xpub data is stored in a watch-only wallet in Bitcoin Core.
  • This script doesn't touch your private keys.
  • This script doesn't do any cryptography aside from optionally generating and checking xpub fingerprints.
  • The configuration file for this script holds your xpub data. Your xpub data allows its holder to see all of your addresses. You can optionally encrypt this config file with GPG or pass.

Configuration

Environment variables

  • COLDCORE_CONFIG: a path to your configuration. If this is of the form pass:Some/Path, it will run pass show Some/Path to retrieve your config. If the path ends in .gpg, we will use GPG to decrypt the configuration.

  • COLDCORE_GPG_KEY: if you want to use GPG to encrypt your config file (without using pass), set this environment variable to the key to use for encryption. We will also read ~/.gnupg/gpg.conf for the default-key setting.

Global flags

coldcore --rpc <url>

Specify the Bitcoin Core RPC server. Useful if you're running Bitcoin Core on a separate host.

Note that RPC settings will be saved per wallet when running coldcore setup.

coldcore -w <wallet-name>

Denote the particular wallet to load if multiple exist in the config.

coldcore --debug

This generates a granular logfile of everything that happens, including stacktraces and RPC communication. Useful if something goes wrong.

Be sure to delete the logfile after use of this flag, as it contains xpub data. The tool will remind you to do so.

FAQ

Why is there no GUI?

The terminal is the simplest display layer with the least cumulative code underlying it. Browsers and GUI libraries are very complex.

For basic wallet operations, a terminal interface should be more than sufficient, especially when including curses.

Why do you only support Coldcard? Will you add others?

Coldcard is the only wallet supported at the moment because it is

  • opensource, and
  • supports air-gapped use via PSBT.

If there are other hardware wallets that meet these criteria, create an issue. Pull requests are certainly accepted.

Why did you use Python and not {Rust,Haskell,C++}?

Python simultaneously comes installed nearly universally and is a high-level, expressive language. Many people know it. This means that there are more potential auditors or contributors for this project.

The same code written in another language might be twice as long, and would require end users installing specialized compilers or dependencies.

There are advantages to shipping binaries to end-users, but because the emphasis here is on trust minimization, I have opted to deliver human readable code. You can bring your own Python implementation in whatever manner you like.

Why do you encrypt the config file by default with GPG?

[This may change; I will probably repurpose the Coldcard AES code to do config file encryption natively.]

I didn't want to have any serious crypto code in this library, and so I delegate encryption to GPG rather than requiring a Python dependency that the end user might have to install.

Donate

If you'd like to donate to this project, send Bitcoin to the address signed below (bc1qgyq7lxmk359c3vyxzz674pr8a9gnguxkgdw55p), or sponsor me on Github.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

bc1qgyq7lxmk359c3vyxzz674pr8a9gnguxkgdw55p
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEGNRVI1NPYuZCSIrGepNdrbLETwUFAl/gLmsACgkQepNdrbLE
TwX8vg/+OZkL1+RbBjV8KNkqp7rQY/O1XXEOYX8JSYM+GEwmeACSGSbV6d7OqmTx
oofjmu5CJ93a2QpE8qPMIr2knRbUrfouAVzPqiF3RNp+UdEqdoLJkAox9MhXm9aG
d/PGYYx3Vf0Lq0bo6eUc19XU0bc38RRV0cjAwpKvfyc0u6SW/t6K6zjrXhZhcuga
LT6DqUxDXD5xDLpjeICDQgazraOr7QG8r39Yw5WSC95ewysiFOp/JQ5Zik6ut9LS
rXEX6+SqwQZOm0xcynqrYjFuiCdHGU39Eiy0DBXOTjeWQyBAq9pTRMXLId2dqyy1
iAbot2YmtNHuRH519YAakh4C0r2oFN7B2qQ2twIvt/rWtkmv3FWvcdKw6H0Q+4oc
VaD9S8cMVoR+bJEtY3EjLkUyd0zmxLuIgKSpdzchru07O/DhvvLvsNwgmzJMoD9f
iH3RfqMEJY+iAQFfoCA/sPwz56xWMW33Ta57+xfNSCTOtOLIJ5c0eqoCHoQ0PlAb
kJIEZ/S7qbbF1DGSlMG/Zbw8OHP0dBuKYjIev0CpFplQAV4SIzzOpxmVMQpahZjH
1RdH9J75+N2l4QgAWR0cJSxW0E56r3J94lM6fgieWySDsxteoAMXqWgLMEpMXNfA
Ze9i1ZlGxIIes25pRiyXXmwys3u1u8VOMmfiLe9VzStIJOMerIo=
=Q7Sw
-----END PGP SIGNATURE-----

TODO

In rough order of priority:

  • guide for CLI newbies
  • allow manual coin selection when sending
  • address labeling
  • multisig workflow
  • timelock scripts
  • add wallet name to config
  • add version birthday to new config
  • implement scrolling in the curses balance panel

Code from other projects

Comments
  • coldcore config file setup

    coldcore config file setup

    I get this error below. I have gnuPG installed. I have created a key. I think it wants me to set default-key in gpg.conf but I don't know where gpg.conf is located on my system.

    ? do you want to use GPG to encrypt your coldcore config? [y/N] y

    ? where should I store your config? [/home/xxxx/.config/coldcore/config.ini.gpg]

    ? Are you sure you want to overwrite the existing file at /home/xxxx/.config/coldcore/config.ini.gpg? [y/N] y -- Creating blank configuration at /home/xxxx/.config/coldcore/config.ini.gpg -- No default-key present; encrypting to GPG using a passphrase -- (to use a default key, set envvar COLDCORE_GPG_KEY or default-key in gpg.conf) gpg: problem with the agent: Inappropriate ioctl for device gpg: error creating passphrase: Operation cancelled gpg: symmetric encryption of '[stdin]' failed: Operation cancelled Failed to write new configuration to /home/xxxx/.config/coldcore/config.ini.gpg ! Couldn't obtain config. Exiting.

    opened by GreenmanPGI 2
  • setup: Test transaction has same label as last transaction

    setup: Test transaction has same label as last transaction

    Steps to reproduce:

    • coldcore: Start setting up coldcore (generate config file, import public.txt)
    • coldcore: Get prompt "do you want to perform some test transactions?"
    • bitcoin core: Before saying yes, generate receiving address in Bitcoin Core with label
    • faucet: Send bitcoin to that address
    • coldcore: Press Y for "do you want to perform some test transactions?"
    • coldcore: Presents you with a test address - this is the same address that I generated in bitcoin core. It doesn't give you the option to label the UTXO
    • faucet: Send bitcoin to the test address
    • bitcoin core: Shows the incoming transaction with the same address/label as the first UTXO
    opened by billygarrison 2
  • Handle socket timeout due to rescan

    Handle socket timeout due to rescan

    When starting up after not having booted the node for a while, wallet rescans may be behind. In this case, RPC HTTP requests may time out while the rescan is running. Figure out how to handle this gracefully.

    image

    opened by jamesob 1
  • coldcore config file setup gpg error

    coldcore config file setup gpg error

    I get this error:

    ? do you want to use GPG to encrypt your coldcore config? [y/N] y

    ? where should I store your config? [/home/xxxx/.config/coldcore/config.ini.gpg]

    ? Are you sure you want to overwrite the existing file at /home/xxxx/.config/coldcore/config.ini.gpg? [y/N] y -- Creating blank configuration at /home/xxxx/.config/coldcore/config.ini.gpg -- No default-key present; encrypting to GPG using a passphrase -- (to use a default key, set envvar COLDCORE_GPG_KEY or default-key in gpg.conf) gpg: problem with the agent: Inappropriate ioctl for device gpg: error creating passphrase: Operation cancelled gpg: symmetric encryption of '[stdin]' failed: Operation cancelled Failed to write new configuration to /home/xxxx/.config/coldcore/config.ini.gpg ! Couldn't obtain config. Exiting.

    opened by GreenmanPGI 1
  • Connect to a remote or local node

    Connect to a remote or local node

    Is there documentation on how to connect Coldcore to an external node running on the same network? Something like a Nodl or a RassberryPi4 running MyNode or Umbrell.

    opened by pedromvpg 1
  • setup: include

    setup: include "number of confirmations required for test transaction" in info message

    As mentioned in https://github.com/jamesob/coldcore/issues/8, the display message waiting for transaction doesn't give a lot of information.

    OP @matthiasdebernardini suggested:

    perhaps change 'waiting for transaction' to 'waiting for your transaction to be confirmed by the blockchain (minutes or hours depending on available blockspace)'

    How many confirmations does coldcore require for the transaction? I suggest including that number in the info message - my test transaction has been stuck at waiting for transaction for over 30 minutes and it has two confirmations.

    opened by billygarrison 1
  • Rescan only when there are UTXOs

    Rescan only when there are UTXOs

    This PR fixes a bug where if there are no UTXOs, an empty string is passed to min, which causes a ValueError. I've added a check to ensure unspents has a value before attempting to rescan.

    opened by bitstein 1
  • AttributeError: module 'curses' has no attribute 'A_ITALIC'`

    AttributeError: module 'curses' has no attribute 'A_ITALIC'`

    On macOS 11.1 python 3.9.1 Bitcoin Core version v0.20.99.0-be11f94e9 public.txt file from coldcard simulator

    I had to restart the wallet because it seemed like it had hung up during setup while waiting for transaction

    image

    Traceback (most recent call last):
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 3130, in <module>
        main()
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 3121, in main
        cli.run()
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 318, in run
        return fnc(*func_args, **func_kwargs)
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 2072, in cli_main
        ui()
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 282, in wrapper
        return fnc(*args, **kwargs)
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 2061, in ui
        start_ui(config, walls, WizardController())
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 1813, in start_ui
        curses.wrapper(draw_menu, config, wallet_configs, controller, action)
      File "/usr/local/Cellar/[email protected]/3.9.1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/curses/__init__.py", line 94, in wrapper
        return func(stdscr, *args, **kwds)
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 1788, in draw_menu
        config, wallet = run_setup(config, controller)
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 1248, in run_setup
        time.sleep(1)
    KeyboardInterrupt
    

    Since I couldn't get that to work I tried restarting the wallet -> dashboard and the program exited with this error message

    Traceback (most recent call last):
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 3130, in <module>
        main()
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 3121, in main
        cli.run()
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 318, in run
        return fnc(*func_args, **func_kwargs)
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 2072, in cli_main
        ui()
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 282, in wrapper
        return fnc(*args, **kwargs)
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 2061, in ui
        start_ui(config, walls, WizardController())
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 1813, in start_ui
        curses.wrapper(draw_menu, config, wallet_configs, controller, action)
      File "/usr/local/Cellar/[email protected]/3.9.1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/curses/__init__.py", line 94, in wrapper
        return func(stdscr, *args, **kwds)
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 1796, in draw_menu
        (k, action) = dashboard.draw(k)
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 1520, in draw
        return self._draw(k)
      File "/Users/matthiasdebernardini/gits/coldcore/./coldcore", line 1614, in _draw
        _s(self.address_win, 2, 2, "press 'n' to get new address", curses.A_ITALIC)
    AttributeError: module 'curses' has no attribute 'A_ITALIC'
    
    opened by matthiasdebernardini 1
  • Handle wallet rescans on load

    Handle wallet rescans on load

    When booting coldcore for the first time in a while, a wallet rescan may automatically trigger. Instead of crashing without helpful output, handle this and wait for the rescan to complete. At the very least, print and log more.

    opened by jamesob 0
  • 0.3.0 release

    0.3.0 release

    • Allow reinitialization of wallets in fresh bitcoind backends
    • Fix createwallet code to account for descriptors=true (https://github.com/bitcoin/bitcoin/pull/23002)
      • Descriptor wallets do not permit use of importmulti
    opened by jamesob 0
  • Remove compilation step

    Remove compilation step

    This change simplifies the source tree and development process by moving everything into one file. We now no longer need clunky bridge machinery like WizardController and weird import restrictions.

    Also fixes the build.

    opened by jamesob 0
  • Error in setup when fee estimation is not ready

    Error in setup when fee estimation is not ready

    The setup ended since the fee estimation was not ready.

    Error! Hit unexpected exception msg: 'Fee estimation faild. Fallbackfee is disabled. Wait a few blocks or enable -fallbackfee' code:-4

    opened by GreenmanPGI 2
  • Uncaught exception: insufficient funds

    Uncaught exception: insufficient funds

    Core v0.21.0 Coldcore v0.3.0 Windows 10

    During the wallet setup test transaction steps, I sent 0.00001 tBTC from my Bitcoin Core testnet wallet to my coldcore testnet wallet (which exists as a watch-only wallet on Bitcoin Core).

    Once the 0.00001 tBTC was received in the coldcore wallet, it moved on to the next step of sending 90% of the value to a new address... I am assuming the error is because the transaction was sending 900 sats to the new address, and 100 sats to a change address, causing the change amount to be below the dust limit.

    There are two issues that need to be addressed here:

    1. The uncaught exception 'Insufficient funds' code: -4
    2. The coldcore setup process specifically says to send a tiny amount "like ~0.000001 BTC", but this seems to be too low. If the dust limit is 546 sats, then the minimum UTXO size that should be selected is ~10,000 sats (9,000 sats to make up the 90%, 141 sats for fee, leaves us with 859 sats change output. This minimum UTXO size is specific to this setup process since it explicitly splits the value 90/10. But I suspect the insufficient funds error could pop up in other cases when trying to spend from coldcore. We should also handle the case where the dust limit is raised above 859 sats.
    #  test transactions
        -----------------
    
     □  send a tiny amount (we're talking like ~0.000001 BTC) to
    
          tb1qs00ld7dmtjcjc9u9tcdmracf77qx2lv33gjqva
    
        (obviously, this is an address you own)
    
     ◱  waiting for transaction
     ✔  received amount of 0.00001000 (txid e72cceda)
    
     -- great - now let's test your ability to send
     -- we're going to send 90% of the value of the last UTXO over to a new address:
    
          tb1qxr9edahl7lak8te2vgw4g2zlfs8us50e8ker4w
    
    Traceback (most recent call last):
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 3274, in <module>
        main()
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 3265, in main
        cli.run()
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 298, in run
        return fnc(*func_args, **func_kwargs)
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 2173, in cli_main
        ui()
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 262, in wrapper
        return fnc(*args, **kwargs)
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 2073, in ui
        start_ui(config, walls)
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 1819, in start_ui
        curses.wrapper(draw_menu, config, wallet_configs, action)
      File "C:\Users\billy\AppData\Local\Programs\Python\Python39\lib\curses\__init__.py", line 94, in wrapper
        return func(stdscr, *args, **kwds)
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 1781, in draw_menu
        config, wallet = run_setup(config)
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 1059, in run_setup
        prepared_tx = _prepare_send(
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 2787, in _prepare_send
        result = rpcw.walletcreatefundedpsbt(
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 590, in _call_wrapper
        return self._call(name, *args, **kwargs)
      File "C:\Hub\Dev\coldcore-new\coldcore\coldcore", line 540, in _call
        raise JSONRPCError(
    __main__.JSONRPCError: msg: 'Insufficient funds'  code: -4
    
    bug 
    opened by billygarrison 0
  • Rephrase text to make it clear setup process is trust-minimized

    Rephrase text to make it clear setup process is trust-minimized

    https://github.com/jamesob/coldcore/blob/3a8395cb185ae36c4195a506a4df5cdfdbf045ac/coldcore#L2141

    The use of the word us here could be misunderstood to mean the chain rescan is happening on some "official" coldcore servers.

    enhancement good first issue 
    opened by billygarrison 0
  • Send fails during sync

    Send fails during sync

    Traceback (most recent call last):
      File "/usr/local/bin/coldcore", line 3268, in <module>
        main()
      File "/usr/local/bin/coldcore", line 3259, in main
        cli.run()
      File "/usr/local/bin/coldcore", line 318, in run
        return fnc(*func_args, **func_kwargs)
      File "/usr/local/bin/coldcore", line 2163, in prepare_send
        return _prepare_send(config, rpcw, to_address, amount, spend_from_list)
      File "/usr/local/bin/coldcore", line 2837, in _prepare_send
        result = rpcw.walletcreatefundedpsbt(
      File "/usr/local/bin/coldcore", line 625, in _call_wrapper
        return self._call(name, *args)
      File "/usr/local/bin/coldcore", line 575, in _call
        raise JSONRPCError(
    __main__.JSONRPCError: msg: 'Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable -fallbackfee.'  code: -4
    
    bug 
    opened by jamesob 0
Owner
James O'Beirne
James O'Beirne
Create a Neo4J graph of users and roles trust policies within an AWS Organization.

AWS_ORG_MAPPER This tool uses sso-oidc to authenticate to the AWS organization. Once authenticated the tool will attempt to enumerate all users and ro

Ruse 24 Jul 28, 2022
AWSXenos will list all the trust relationships in all the IAM roles and S3 buckets

AWS External Account Scanner Xenos, is Greek for stranger. AWSXenos will list all the trust relationships in all the IAM roles, and S3 buckets, in an

AirWalk 57 Nov 7, 2022
Announces when a web3 wallet receives a token

excitare_cito v2.0 by Bogdan Vaida ([email protected]) Announces when a web3 wallet receives a token. You can create an account on Pushsafer.com

null 1 Nov 30, 2021
Set of classes and tools to communicate with a Noso wallet using NosoP

NosoPy Set of classes and tools to communicate with a Noso wallet using NosoP(Noso Protocol). The data that can be retrieved consist of: Node informat

Noso Project 1 Jan 10, 2022
Ethereum transactions and wallet information for people you follow on Twitter.

ethFollowing Ethereum transactions and wallet information for people you follow on Twitter. Set up Setup python environment (requires python 3.8): vir

Brian Donohue 2 Dec 28, 2021
DeFi wallet on Chia Network.

DeFi wallet on Chia Network.

GobyWallet 21 Aug 12, 2022
CryptoApp - Python code to pull wallet balances from a variety of different chains through nothing other than your public key.

CryptoApp - Python code to pull wallet balances from a variety of different chains through nothing other than your public key.

Zach Frank 4 Dec 13, 2022
LavaAPI - A simple library for accepting payments and using the LAVA Wallet

This library was created to simplify the LAVA api provided on the official websi

Vlad Baccara 8 Dec 18, 2022
Use an air-gapped Raspberry Pi Zero to sign for Bitcoin transactions! (and do other cool stuff)

Hello World! Build your own offline, airgapped Bitcoin transaction signing device for less than $35! Also generate seed word 24 or generate a seed phr

null 371 Dec 31, 2022
Crypto trading bot that detects surges in the bitcoin price and executes trades.

The bot will be trading Bitcoin automatically if the price has increased by more than 3% in the last 10 minutes. We will have a stop loss of 5% and t

null 164 Oct 20, 2022
Python Library for Secp256k1 Bitcoin curve to do fast ECC calculation

secp256k1 Python Library for Secp256k1 Bitcoin curve to do fast ECC calculation Example Usage import secp256k1 as ice print('[C]',privatekey_to_addres

iceland 49 Jan 1, 2023
This is simply code for bitcoin fair value.

About The Project This is a code for bitcoin fair value, its simply exclude bubble data using RANSAC method, and then plot the results. Check youtube

BitcoinRaven 4 Mar 26, 2022
Bitcoin tracker hecho con python.

Bitcoin Tracker Precio del Bitcoin en tiempo real. Script simple hecho con python. Rollercoin RollerCoin es un juego en el que puedes ganar bitcoin (y

biyivi 3 Jan 4, 2022
Bitcoin-chance-wheel - Try your luck at getting bitcoins

Program Features - ✍️ Why did we name this tool the Lucky Wheel? - ✍️ This tool

hack4lx 20 Dec 22, 2022
null 471 Dec 24, 2022
This is a simple Bitcoin non-deterministic wallet address generator coded in Python 3.

This is a simple Bitcoin non-deterministic wallet address generator coded in Python 3. It generates a Private Key in different formats (hex, wif and compressed wif) and corresponding Public Addresses, raw, P2WPKH addresses starting with prefix 1, P2SH addresses starting with prefix 3 as part of Segwit soft fork and Bech32 addresses with prefix bc1 P2WPKH and P2WSH.

null 7 Dec 22, 2022
Bitcoin Wallet Address Generator

Bitcoin Wallet Address Generator This is a simple Bitcoin non-deterministic wallet address generator coded in Python 3. It generates a Private Key in different formats (hex, wif and compressed wif) and corresponding Public Addresses, raw, P2WPKH addresses starting with prefix 1, P2SH addresses starting with prefix 3 as part of Segwit soft fork and Bech32 addresses with prefix bc1 P2WPKH and P2WSH.

null 11 Dec 29, 2022
SimpleWallet - Simple wallet for Bitcoin

Simple Wallet This is a basic python starter package to be used as a template fo

Mystic 1 Jan 8, 2022
Create and finder all address wallet bitcoin and check balance , transaction

BTCCrackWallet Create and finder all address wallet bitcoin and check balance , transaction bitcoin wallet generator generated address wallet , public

MMDRZA 11 Nov 26, 2022
bitcoin-ticker is a E-ink ticker that shows usefull information about bitcoin

bitcoin-ticker bitcoin-ticker is a E-ink ticker that shows usefull information about bitcoin. Due to the limited refresh lifetime, new information is

null 32 Nov 9, 2022