def create_parser(): codes = network_codes() parser = argparse.ArgumentParser( description=( 'Cache look-up information into a Keychain for use with tx. ' 'Useful for hiearchical keys with many children.'), epilog=('Known networks codes:\n ' + ', '.join( ['%s (%s)' % (i, full_network_name_for_netcode(i)) for i in codes]))) parser.add_argument('-n', "--netcode", help='specify network by netcode', choices=codes, default="BTC") parser.add_argument( '-m', "--multisig", metavar="sigcount", type=int, help='multisig, with this many signatures need to unencumber the funds' ) parser.add_argument('keychain', help='the keychain file (SQLite3 formatted)') parser.add_argument('subkey_paths', help='subkey paths (example: 0H/2/15-20)') parser.add_argument( 'key', nargs="+", help='a hierarchical wallet key string (public suffices)') return parser
def create_parser(): codes = network_codes() parser = argparse.ArgumentParser( description='Create or verify a text signature using bitcoin standards', epilog=('Known networks codes:\n ' + ', '.join([ '%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes ]))) parser.add_argument('-n', "--network", help='specify network (default: BTC = Bitcoin)', default='BTC', choices=codes) subparsers = parser.add_subparsers(dest="command") sign = subparsers.add_parser('sign', help='sign a message with a private key') sign.add_argument('WIF', help='the WIF to sign the message with') add_read_msg_arguments(sign, "signed") verify = subparsers.add_parser('verify') verify.add_argument('signature', help='the signature to verify') verify.add_argument('address', nargs="?", help='the address to verify against') add_read_msg_arguments(verify, "verified") return parser
def test_is_wif_valid(self): WIFS = [ "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf", "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU74NMTptX4", "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAvUcVfH" ] for wif in WIFS: self.assertEqual(is_wif_valid(wif), "BTC") a = wif[:-1] + chr(ord(wif[-1]) + 1) self.assertEqual(is_wif_valid(a), None) from pycoin.networks.registry import network_for_netcode NETWORK_NAMES = network_codes() for netcode in NETWORK_NAMES: network = network_for_netcode(netcode) if not getattr(network, "key", None): continue for se in range(1, 10): key = network.key(secret_exponent=se, generator=secp256k1_generator) for tv in [True, False]: wif = key.wif(use_uncompressed=tv) self.assertEqual( is_wif_valid(wif, allowable_netcodes=[netcode]), netcode) a = wif[:-1] + chr(ord(wif[-1]) + 1) self.assertEqual( is_wif_valid(a, allowable_netcodes=[netcode]), None)
def test_is_wif_valid(self): WIFS = [ "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf", "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU74NMTptX4", "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAvUcVfH" ] for wif in WIFS: self.assertEqual(BTC.parse.wif(wif).wif(), wif) a = wif[:-1] + chr(ord(wif[-1]) + 1) self.assertIsNone(BTC.parse.wif(a)) NETWORK_NAMES = network_codes() for netcode in NETWORK_NAMES: network = network_for_netcode(netcode) if not getattr(network, "Key", None): continue for se in range(1, 10): key = network.Key(secret_exponent=se) for tv in [True, False]: wif = key.wif(is_compressed=tv) self.assertEqual(network.parse.wif(wif).wif(), wif) a = wif[:-1] + chr(ord(wif[-1]) + 1) self.assertIsNone(network.parse.wif(a))
def ku(args, parser): fallback_network = network_for_netcode(args.network or get_current_netcode()) parse_networks = [fallback_network] + [ network_for_netcode(netcode) for netcode in network_codes() ] if args.network: parse_networks = [network_for_netcode(args.network)] override_network = None if args.override_network: # Override the network value, so we can take the same xpubkey and view what # the values would be on each other network type. override_network = network_for_netcode(args.override_network) def parse_stdin(): return [ item for item in sys.stdin.readline().strip().split(' ') if len(item) > 0 ] output_key_set = set(args.brief or []) if args.wallet: output_key_set.add("wallet_key") elif args.wif: output_key_set.add("wif_uncompressed" if args.uncompressed else "wif") elif args.address: output_key_set.add("address" + ("_uncompressed" if args.uncompressed else "")) items = args.item if len(args.item) > 0 else parse_stdin() for item in items: key = parse_key(item, parse_networks) if key is None: print("can't parse %s" % item, file=sys.stderr) continue if override_network: key = key.override_network(override_network) display_network = override_network or key._network or fallback_network if hasattr(key, "subkeys"): key_iter = key.subkeys(args.subkey) else: key_iter = [key] for key in key_iter: if args.public: key = key.public_copy() output_dict, output_order = create_output(item, key, output_key_set) generate_output(args, output_dict, output_order)
def create_parser(): codes = network_codes() EPILOG = ('Known networks codes:\n ' + ', '.join(['%s (%s)' % (i, full_network_name_for_netcode(i)) for i in codes])) parser = argparse.ArgumentParser( description="Compile or disassemble scripts.", epilog=EPILOG) parser.add_argument('-n', "--network", default=get_current_netcode(), choices=codes, help=('Network code (environment variable PYCOIN_DEFAULT_NETCODE ' 'or "BTC"=Bitcoin mainnet if unset')) parser.add_argument("argument", nargs="+", help='script to compile. To dump hex, prefix with 0x') return parser
def create_parser(): codes = network_codes() parser = argparse.ArgumentParser( description=( 'Cache look-up information into a Keychain for use with tx. ' 'Useful for hiearchical keys with many children.'), epilog=('Known networks codes:\n ' + ', '.join(['%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes])) ) parser.add_argument('-n', "--netcode", help='specify network by netcode', choices=codes, default="BTC") parser.add_argument('-m', "--multisig", metavar="sigcount", type=int, help='multisig, with this many signatures need to unencumber the funds') parser.add_argument('keychain', help='the keychain file (SQLite3 formatted)') parser.add_argument('subkey_paths', help='subkey paths (example: 0H/2/15-20)') parser.add_argument('key', nargs="+", help='a hierarchical wallet key string (public suffices)') return parser
def test_is_public_private_bip32_valid(self): from pycoin.networks.registry import network_for_netcode NETWORK_NAMES = network_codes() WALLET_KEYS = ["foo", "1", "2", "3", "4", "5"] # not all networks support BIP32 yet for netcode in "BTC XTN DOGE".split(): network = network_for_netcode(netcode) BIP32Node = network.ui._bip32node_class for wk in WALLET_KEYS: wallet = BIP32Node.from_master_secret(secp256k1_generator, wk.encode("utf8")) text = wallet.wallet_key(as_private=True) self.assertEqual( is_private_bip32_valid(text, allowable_netcodes=NETWORK_NAMES), netcode) self.assertEqual( is_public_bip32_valid(text, allowable_netcodes=NETWORK_NAMES), None) a = text[:-1] + chr(ord(text[-1]) + 1) self.assertEqual( is_private_bip32_valid(a, allowable_netcodes=NETWORK_NAMES), None) self.assertEqual( is_public_bip32_valid(a, allowable_netcodes=NETWORK_NAMES), None) text = wallet.wallet_key(as_private=False) self.assertEqual( is_private_bip32_valid(text, allowable_netcodes=NETWORK_NAMES), None) self.assertEqual( is_public_bip32_valid(text, allowable_netcodes=NETWORK_NAMES), netcode) a = text[:-1] + chr(ord(text[-1]) + 1) self.assertEqual( is_private_bip32_valid(a, allowable_netcodes=NETWORK_NAMES), None) self.assertEqual( is_public_bip32_valid(a, allowable_netcodes=NETWORK_NAMES), None)
def ku(args, parser): generator = secp256k1_generator fallback_network = network_for_netcode(args.network or get_current_netcode()) parse_networks = [ network_for_netcode(netcode) for netcode in network_codes() ] if args.network: parse_networks = [network_for_netcode(args.network)] override_network = None if args.override_network: # Override the network value, so we can take the same xpubkey and view what # the values would be on each other network type. override_network = network_for_netcode(args.override_network) def parse_stdin(): return [ item for item in sys.stdin.readline().strip().split(' ') if len(item) > 0 ] items = args.item if len(args.item) > 0 else parse_stdin() for item in items: key_network, key = parse_key(item, parse_networks, generator) if key is None: print("can't parse %s" % item, file=sys.stderr) continue display_network = override_network or key_network or fallback_network for key in key.subkeys(args.subkey or ""): if args.public: key = key.public_copy() output_dict, output_order = create_output(item, key, display_network) generate_output(args, output_dict, output_order)
def create_parser(): codes = network_codes() parser = argparse.ArgumentParser( description='Create or verify a text signature using bitcoin standards', epilog=('Known networks codes:\n ' + ', '.join(['%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes])) ) parser.add_argument('-n', "--network", help='specify network (default: BTC = Bitcoin)', default='BTC', choices=codes) subparsers = parser.add_subparsers(dest="command") sign = subparsers.add_parser('sign', help='sign a message with a private key') sign.add_argument('WIF', help='the WIF to sign the message with') add_read_msg_arguments(sign, "signed") verify = subparsers.add_parser('verify') verify.add_argument('signature', help='the signature to verify') verify.add_argument('address', nargs="?", help='the address to verify against') add_read_msg_arguments(verify, "verified") return parser
def create_parser(): codes = network_codes() parser = argparse.ArgumentParser( description='Crypto coin utility ku ("key utility") to show' ' information about Bitcoin or other cryptocoin data structures.', epilog=('Known networks codes:\n ' + ', '.join(['%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes])) ) parser.add_argument('-w', "--wallet", help='show just Bitcoin wallet key', action='store_true') parser.add_argument('-W', "--wif", help='show just Bitcoin WIF', action='store_true') parser.add_argument('-a', "--address", help='show just Bitcoin address', action='store_true') parser.add_argument( '-u', "--uncompressed", help='show output in uncompressed form', action='store_true') parser.add_argument( '-P', "--public", help='only show public version of wallet keys', action='store_true') parser.add_argument('-j', "--json", help='output as JSON', action='store_true') parser.add_argument('-b', "--brief", nargs="*", help='brief output; display a single field') parser.add_argument('-s', "--subkey", help='subkey path (example: 0H/2/15-20)', default="") parser.add_argument('-n', "--network", help='specify network', choices=codes) parser.add_argument( "--override-network", help='override detected network type', default=None, choices=codes) parser.add_argument( 'item', nargs="*", help='a BIP0032 wallet key string;' ' a WIF;' ' a bitcoin address;' ' an SEC (ie. a 66 hex chars starting with 02, 03 or a 130 hex chars starting with 04);' ' the literal string "create" to create a new wallet key using strong entropy sources;' ' P:wallet passphrase (NOT RECOMMENDED);' ' H:wallet passphrase in hex (NOT RECOMMENDED);' ' E:electrum value (either a master public, master private, or initial data);' ' secret_exponent (in decimal or hex);' ' x,y where x,y form a public pair (y is a number or one of the strings "even" or "odd");' ' hash160 (as 40 hex characters).' ' If this argument is missing, input data will be read from stdin.') return parser
def test_is_wif_valid(self): WIFS = ["KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf", "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU74NMTptX4", "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAvUcVfH"] for wif in WIFS: self.assertEqual(BTC.parse.wif(wif).wif(), wif) a = wif[:-1] + chr(ord(wif[-1])+1) self.assertIsNone(BTC.parse.wif(a)) NETWORK_NAMES = network_codes() for netcode in NETWORK_NAMES: network = network_for_netcode(netcode) if not getattr(network, "Key", None): continue for se in range(1, 10): key = network.Key(secret_exponent=se) for tv in [True, False]: wif = key.wif(is_compressed=tv) self.assertEqual(network.parse.wif(wif).wif(), wif) a = wif[:-1] + chr(ord(wif[-1])+1) self.assertIsNone(network.parse.wif(a))
def test_is_wif_valid(self): WIFS = ["KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf", "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU74NMTptX4", "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAvUcVfH"] for wif in WIFS: self.assertEqual(is_wif_valid(wif, allowable_netcodes=NETCODES), "BTC") a = wif[:-1] + chr(ord(wif[-1])+1) self.assertEqual(is_wif_valid(a), None) from pycoin.networks.registry import network_for_netcode NETWORK_NAMES = network_codes() for netcode in NETWORK_NAMES: network = network_for_netcode(netcode) if not getattr(network, "key", None): continue for se in range(1, 10): key = network.key(secret_exponent=se) for tv in [True, False]: wif = key.wif(use_uncompressed=tv) self.assertEqual(is_wif_valid(wif, allowable_netcodes=[netcode]), netcode) a = wif[:-1] + chr(ord(wif[-1])+1) self.assertEqual(is_wif_valid(a, allowable_netcodes=[netcode]), None)
def create_parser(): codes = network_codes() parser = argparse.ArgumentParser( description='Crypto coin utility ku ("key utility") to show' ' information about Bitcoin or other cryptocoin data structures.', epilog=('Known networks codes:\n ' + ', '.join([ '%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes ]))) parser.add_argument('-w', "--wallet", help='show just Bitcoin wallet key', action='store_true') parser.add_argument('-W', "--wif", help='show just Bitcoin WIF', action='store_true') parser.add_argument('-a', "--address", help='show just Bitcoin address', action='store_true') parser.add_argument('-u', "--uncompressed", help='show output in uncompressed form', action='store_true') parser.add_argument('-P', "--public", help='only show public version of wallet keys', action='store_true') parser.add_argument('-j', "--json", help='output as JSON', action='store_true') parser.add_argument('-b', "--brief", nargs="*", help='brief output; display a single field') parser.add_argument('-s', "--subkey", help='subkey path (example: 0H/2/15-20)') parser.add_argument('-n', "--network", help='specify network', choices=codes) parser.add_argument("--override-network", help='override detected network type', default=None, choices=codes) parser.add_argument( 'item', nargs="*", help='a BIP0032 wallet key string;' ' a WIF;' ' a bitcoin address;' ' an SEC (ie. a 66 hex chars starting with 02, 03 or a 130 hex chars starting with 04);' ' the literal string "create" to create a new wallet key using strong entropy sources;' ' P:wallet passphrase (NOT RECOMMENDED);' ' H:wallet passphrase in hex (NOT RECOMMENDED);' ' E:electrum value (either a master public, master private, or initial data);' ' secret_exponent (in decimal or hex);' ' x,y where x,y form a public pair (y is a number or one of the strings "even" or "odd");' ' hash160 (as 40 hex characters).' ' If this argument is missing, input data will be read from stdin.') return parser
def create_parser(): codes = network_codes() EPILOG = ('Files are binary by default unless they end with the suffix ".hex". ' + 'Known networks codes:\n ' + ', '.join(['%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes])) parser = argparse.ArgumentParser( description="Manipulate bitcoin (or alt coin) transactions.", epilog=EPILOG) parser.add_argument('-t', "--transaction-version", type=range_int(0, 255, "version"), help='Transaction version, either 1 (default) or 3 (not yet supported).') parser.add_argument('-l', "--lock-time", type=parse_locktime, help='Lock time; either a block' 'index, or a date/time (example: "2014-01-01T15:00:00"') parser.add_argument('-n', "--network", default=get_current_netcode(), choices=codes, help=('Default network code (environment variable PYCOIN_DEFAULT_NETCODE ' 'or "BTC"=Bitcoin mainnet if unset')) parser.add_argument('-a', "--augment", action='store_true', help='augment tx by adding any missing spendable metadata by fetching' ' inputs from cache and/or web services') parser.add_argument('-s', "--verbose-signature", action='store_true', help='Display technical signature details.') parser.add_argument("-i", "--fetch-spendables", metavar="address", action="append", help='Add all unspent spendables for the given bitcoin address. This information' ' is fetched from web services. With no outputs, incoming spendables will be printed.') parser.add_argument("-I", "--dump-inputs", action='store_true', help='Dump inputs to this transaction.') parser.add_argument( "-k", "--keychain", default=":memory:", help="path to keychain file for hierarchical key hints (SQLite3 file created with keychain tool)") parser.add_argument( "-K", "--key-paths", default="", help="Key path hints to search hiearachical private keys (example: 0/0H/0-20)") parser.add_argument('-f', "--private-key-file", metavar="path-to-private-keys", action="append", default=[], help='file containing WIF or BIP0032 private keys. If file name ends with .gpg, ' '"gpg -d" will be invoked automatically. File is read one line at a time, and if ' 'the file contains only one WIF per line, it will also be scanned for a bitcoin ' 'address, and any addresses found will be assumed to be public keys for the given' ' private key.', type=argparse.FileType('r')) parser.add_argument('-g', "--gpg-argument", help='argument to pass to gpg (besides -d).', default='') parser.add_argument("--remove-tx-in", metavar="tx_in_index_to_delete", action="append", type=int, help='remove a tx_in') parser.add_argument("--remove-tx-out", metavar="tx_out_index_to_delete", action="append", type=int, help='remove a tx_out') parser.add_argument("--replace-input-script", metavar="tx_in_script_slash_hex", action="append", default=[], type=parse_script_index_hex, help='replace an input script: arg looks like "1/796a"') parser.add_argument('-F', "--fee", help='fee, in satoshis, to pay on transaction, or ' '"standard" to auto-calculate. This is only useful if the "split pool" ' 'is used; otherwise, the fee is automatically set to the unclaimed funds.', default="standard", metavar="transaction-fee", type=parse_fee) parser.add_argument('-C', "--cache", help='force the resultant transaction into the transaction cache.' ' Mostly for testing.', action='store_true'), parser.add_argument("--db", help='force the transaction expressed by the given hex ' 'into a RAM-based transaction cache. Mostly for testing.', action="append"), parser.add_argument('-u', "--show-unspents", action='store_true', help='show TxOut items for this transaction in Spendable form.') parser.add_argument('-b', "--bitcoind-url", help='URL to bitcoind instance to validate against (http://user:pass@host:port).') parser.add_argument('-o', "--output-file", metavar="path-to-output-file", type=argparse.FileType('wb'), help='file to write transaction to. This supresses most other output.') parser.add_argument('-d', "--disassemble", action='store_true', help='Disassemble scripts.') parser.add_argument("--pdb", action="store_true", help='Enter PDB debugger on each script instruction.') parser.add_argument("--trace", action='store_true', help='Trace scripts.') parser.add_argument('-p', "--pay-to-script", metavar="pay-to-script", action="append", help='a hex version of a script required for a pay-to-script' 'input (a bitcoin address that starts with 3)') parser.add_argument("--signature", metavar="known-good-signature", action="append", help='a hex version of a signature that will be used if useful') parser.add_argument("--sec", metavar="known-sec", action="append", help='a hex version of an SEC that will be used if useful') parser.add_argument('-P', "--pay-to-script-file", metavar="pay-to-script-file", nargs=1, type=argparse.FileType('r'), help='a file containing hex scripts ' '(one per line) corresponding to pay-to-script inputs') parser.add_argument("--dump-signatures", action="store_true", help="print signatures (for use with --signature)") parser.add_argument("--dump-secs", action="store_true", help="print secs (for use with --sec)") parser.add_argument("--coinbase", type=str, help="add an input as a coinbase from the given address") parser.add_argument("argument", nargs="*", help='generic argument: can be a hex transaction id ' '(exactly 64 characters) to be fetched from cache or a web service;' ' a transaction as a hex string; a path name to a transaction to be loaded;' ' a spendable 4-tuple of the form tx_id/tx_out_idx/script_hex/satoshi_count ' 'to be added to TxIn list; an address/satoshi_count to be added to the TxOut ' 'list; an address or script to be added to the TxOut list and placed in the ' '"split pool".') return parser
def ku(args, parser): fallback_network = network_for_netcode(args.network or get_current_netcode()) parse_networks = [fallback_network] + [network_for_netcode(netcode) for netcode in network_codes()] if args.network: parse_networks = [network_for_netcode(args.network)] override_network = None if args.override_network: # Override the network value, so we can take the same xpubkey and view what # the values would be on each other network type. override_network = network_for_netcode(args.override_network) def parse_stdin(): return [item for item in sys.stdin.readline().strip().split(' ') if len(item) > 0] output_key_set = set(args.brief or []) if args.wallet: output_key_set.add("wallet_key") elif args.wif: output_key_set.add("wif_uncompressed" if args.uncompressed else "wif") elif args.address: output_key_set.add("address" + ("_uncompressed" if args.uncompressed else "")) items = args.item if len(args.item) > 0 else parse_stdin() for item in items: key_network, key = parse_key(item, parse_networks) if key is None: print("can't parse %s" % item, file=sys.stderr) continue display_network = override_network or key_network or fallback_network if hasattr(key, "subkeys"): key_iter = key.subkeys(args.subkey) else: key_iter = [key] for key in key_iter: if args.public: key = key.public_copy() output_dict, output_order = create_output(item, key, display_network, output_key_set) generate_output(args, output_dict, output_order)
def create_parser(): codes = network_codes() EPILOG = ( 'Files are binary by default unless they end with the suffix ".hex". ' + 'Known networks codes:\n ' + ', '.join([ '%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes ])) parser = argparse.ArgumentParser( description="Manipulate bitcoin (or alt coin) transactions.", epilog=EPILOG) parser.add_argument( '-t', "--transaction-version", type=range_int(0, 255, "version"), help='Transaction version, either 1 (default) or 3 (not yet supported).' ) parser.add_argument( '-l', "--lock-time", type=parse_locktime, help='Lock time; either a block' 'index, or a date/time (example: "2014-01-01T15:00:00"') parser.add_argument( '-n', "--network", default=get_current_netcode(), choices=codes, help=( 'Default network code (environment variable PYCOIN_DEFAULT_NETCODE ' 'or "BTC"=Bitcoin mainnet if unset')) parser.add_argument( '-a', "--augment", action='store_true', help='augment tx by adding any missing spendable metadata by fetching' ' inputs from cache and/or web services') parser.add_argument('-s', "--verbose-signature", action='store_true', help='Display technical signature details.') parser.add_argument( "-i", "--fetch-spendables", metavar="address", action="append", help= 'Add all unspent spendables for the given bitcoin address. This information' ' is fetched from web services. With no outputs, incoming spendables will be printed.' ) parser.add_argument("-I", "--dump-inputs", action='store_true', help='Dump inputs to this transaction.') parser.add_argument( "-k", "--keychain", default=":memory:", help= "path to keychain file for hierarchical key hints (SQLite3 file created with keychain tool)" ) parser.add_argument( "-K", "--key-paths", default="", help= "Key path hints to search hiearachical private keys (example: 0/0H/0-20)" ) parser.add_argument( '-f', "--private-key-file", metavar="path-to-private-keys", action="append", default=[], help= 'file containing WIF or BIP0032 private keys. If file name ends with .gpg, ' '"gpg -d" will be invoked automatically. File is read one line at a time, and if ' 'the file contains only one WIF per line, it will also be scanned for a bitcoin ' 'address, and any addresses found will be assumed to be public keys for the given' ' private key.', type=argparse.FileType('r')) parser.add_argument('-g', "--gpg-argument", help='argument to pass to gpg (besides -d).', default='') parser.add_argument("--remove-tx-in", metavar="tx_in_index_to_delete", action="append", type=int, help='remove a tx_in') parser.add_argument("--remove-tx-out", metavar="tx_out_index_to_delete", action="append", type=int, help='remove a tx_out') parser.add_argument( "--replace-input-script", metavar="tx_in_script_slash_hex", action="append", default=[], type=parse_script_index_hex, help='replace an input script: arg looks like "1/796a"') parser.add_argument( '-F', "--fee", help='fee, in satoshis, to pay on transaction, or ' '"standard" to auto-calculate. This is only useful if the "split pool" ' 'is used; otherwise, the fee is automatically set to the unclaimed funds.', default="standard", metavar="transaction-fee", type=parse_fee) parser.add_argument( '-C', "--cache", help='force the resultant transaction into the transaction cache.' ' Mostly for testing.', action='store_true'), parser.add_argument( "--db", help='force the transaction expressed by the given hex ' 'into a RAM-based transaction cache. Mostly for testing.', action="append"), parser.add_argument( '-u', "--show-unspents", action='store_true', help='show TxOut items for this transaction in Spendable form.') parser.add_argument( '-b', "--bitcoind-url", help= 'URL to bitcoind instance to validate against (http://user:pass@host:port).' ) parser.add_argument( '-o', "--output-file", metavar="path-to-output-file", type=argparse.FileType('wb'), help='file to write transaction to. This supresses most other output.') parser.add_argument('-d', "--disassemble", action='store_true', help='Disassemble scripts.') parser.add_argument("--pdb", action="store_true", help='Enter PDB debugger on each script instruction.') parser.add_argument("--trace", action='store_true', help='Trace scripts.') parser.add_argument( '-p', "--pay-to-script", metavar="pay-to-script", action="append", help='a hex version of a script required for a pay-to-script' 'input (a bitcoin address that starts with 3)') parser.add_argument( "--signature", metavar="known-good-signature", action="append", help='a hex version of a signature that will be used if useful') parser.add_argument( "--sec", metavar="known-sec", action="append", help='a hex version of an SEC that will be used if useful') parser.add_argument('-P', "--pay-to-script-file", metavar="pay-to-script-file", nargs=1, type=argparse.FileType('r'), help='a file containing hex scripts ' '(one per line) corresponding to pay-to-script inputs') parser.add_argument("--dump-signatures", action="store_true", help="print signatures (for use with --signature)") parser.add_argument("--dump-secs", action="store_true", help="print secs (for use with --sec)") parser.add_argument( "--coinbase", type=str, help="add an input as a coinbase from the given address") parser.add_argument( "argument", nargs="*", help='generic argument: can be a hex transaction id ' '(exactly 64 characters) to be fetched from cache or a web service;' ' a transaction as a hex string; a path name to a transaction to be loaded;' ' a spendable 4-tuple of the form tx_id/tx_out_idx/script_hex/satoshi_count ' 'to be added to TxIn list; an address/satoshi_count to be added to the TxOut ' 'list; an address or script to be added to the TxOut list and placed in the ' '"split pool".') return parser