def market (give_asset, get_asset): # Your Pending Orders Matches. addresses = [] for bunch in bitcoin.get_wallet(): addresses.append(bunch[:2][0]) filters = [ ('tx0_address', 'IN', addresses), ('tx1_address', 'IN', addresses) ] awaiting_btcs = util.api('get_order_matches', {'filters': filters, 'filterop': 'OR', 'status': 'pending'}) table = PrettyTable(['Matched Order ID', 'Time Left']) for order_match in awaiting_btcs: order_match = format_order_match(db, order_match) table.add_row(order_match) print('Your Pending Order Matches') print(table) print('\n') # Open orders. orders = util.api('get_orders', {'status': 'open'}) table = PrettyTable(['Give Quantity', 'Give Asset', 'Price', 'Price Assets', 'Required BTC Fee', 'Provided BTC Fee', 'Time Left', 'Tx Hash']) for order in orders: if give_asset and order['give_asset'] != give_asset: continue if get_asset and order['get_asset'] != get_asset: continue order = format_order(order) table.add_row(order) print('Open Orders') table = table.get_string(sortby='Price') print(table) print('\n') # Open bets. bets = util.api('get_bets', {'status': 'open'}) table = PrettyTable(['Bet Type', 'Feed Address', 'Deadline', 'Target Value', 'Leverage', 'Wager', 'Odds', 'Time Left', 'Tx Hash']) for bet in bets: bet = format_bet(bet) table.add_row(bet) print('Open Bets') print(table) print('\n') # Feeds broadcasts = util.api('get_broadcasts', {'status': 'valid'}) table = PrettyTable(['Feed Address', 'Timestamp', 'Text', 'Value', 'Fee Fraction']) seen_addresses = [] for broadcast in broadcasts: # Only show feeds with broadcasts in the last two weeks. last_block_time = util.last_block(db)['block_time'] if broadcast['timestamp'] + config.TWO_WEEKS < last_block_time: continue # Always show only the latest broadcast from a feed address. if broadcast['source'] not in seen_addresses: feed = format_feed(broadcast) table.add_row(feed) seen_addresses.append(broadcast['source']) else: continue print('Feeds') print(table)
def cli(method, params, unsigned): # Get unsigned transaction serialisation. if bitcoin.is_valid(params['source']): if bitcoin.is_mine(params['source']): bitcoin.wallet_unlock() else: print('Source not in Bitcoind wallet.') answer = input('Public key (hexadecimal) or Private key (Wallet Import Format): ') # Public key or private key? try: binascii.unhexlify(answer) # Check if hex. params['pubkey'] = answer # If hex, assume public key. private_key_wif = None except binascii.Error: private_key_wif = answer # Else, assume private key. params['pubkey'] = bitcoin.private_key_to_public_key(private_key_wif) else: raise exceptions.AddressError('Invalid address.') unsigned_tx_hex = util.api(method, params) print('Transaction (unsigned):', unsigned_tx_hex) # Ask to sign and broadcast. if not unsigned and input('Sign and broadcast? (y/N) ') == 'y': if bitcoin.is_mine(params['source']): private_key_wif = None elif not private_key_wif: # If private key was not given earlier. private_key_wif = input('Private key (Wallet Import Format): ') # Sign and broadcast. signed_tx_hex = bitcoin.sign_tx(unsigned_tx_hex, private_key_wif=private_key_wif) print('Transaction (signed):', signed_tx_hex) print('Hash of transaction (broadcasted):', bitcoin.broadcast_tx(signed_tx_hex))
def cli(method, params, unsigned): # Get unsigned transaction serialisation. is_multisig = script.is_multisig(params['source']) params['source'] = script.make_canonical(params['source']) pubkey = None if not is_multisig: # Get public key for source. source = params['source'] if not backend.is_valid(proxy, source): raise script.AddressError('Invalid address.') if backend.is_mine(proxy, source): backend.wallet_unlock(proxy) else: # TODO: Do this only if the encoding method needs it. print('Source not in backend wallet.') answer = input('Public key (hexadecimal) or Private key (Wallet Import Format): ') # Public key or private key? try: binascii.unhexlify(answer) # Check if hex. pubkey = answer # If hex, assume public key. private_key_wif = None except binascii.Error: private_key_wif = answer # Else, assume private key. pubkey = script.private_key_to_public_key(private_key_wif) params['pubkey'] = pubkey """ # NOTE: For debugging, e.g. with `Invalid Params` error. tx_info = sys.modules['lib.send'].compose(db, params['source'], params['destination'], params['asset'], params['quantity']) print(transaction.construct(db, proxy, tx_info, encoding=params['encoding'], fee_per_kb=params['fee_per_kb'], regular_dust_size=params['regular_dust_size'], multisig_dust_size=params['multisig_dust_size'], op_return_value=params['op_return_value'], self_public_key_hex=pubkey, allow_unconfirmed_inputs=params['allow_unconfirmed_inputs'])) exit(0) """ # Construct transaction. unsigned_tx_hex = util.api(method, params) print('Transaction (unsigned):', unsigned_tx_hex) # Ask to sign and broadcast (if not multi‐sig). if is_multisig: print('Multi‐signature transactions are signed and broadcasted manually.') elif not unsigned and input('Sign and broadcast? (y/N) ') == 'y': if backend.is_mine(proxy, source): private_key_wif = None elif not private_key_wif: # If private key was not given earlier. private_key_wif = input('Private key (Wallet Import Format): ') # Sign and broadcast. signed_tx_hex = transaction.sign_tx(proxy, unsigned_tx_hex, private_key_wif=private_key_wif) print('Transaction (signed):', signed_tx_hex) print('Hash of transaction (broadcasted):', transaction.broadcast_tx(proxy, signed_tx_hex))
def cli(method, params, unsigned): # Unlock wallet, as necessary. bitcoin.wallet_unlock() # Get unsigned transaction serialisation. unsigned_tx_hex = util.api(method, params) print('Transaction (unsigned):', unsigned_tx_hex) # Ask to sign and broadcast. if not unsigned: if config.TESTNET: print('Attention: TESTNET!') if config.TESTCOIN: print('Attention: TESTCOIN!\n') if config.NO_INTERACTION or input('Sign and broadcast? (y/N) ') == 'y': print(bitcoin.transmit(unsigned_tx_hex)) else: print('Transaction aborted.', file=sys.stderr) sys.exit(1)
def cli(method, params, unsigned): # Unlock wallet, as necessary. bitcoin.wallet_unlock() # Get unsigned transaction serialisation. unsigned_tx_hex = util.api(method, params) print('Transaction (unsigned):', unsigned_tx_hex) # Ask to sign and broadcast. if not unsigned: if config.TESTNET: print('Attention: TESTNET!') if config.TESTCOIN: print('Attention: TESTCOIN!\n') if input('Sign and broadcast? (y/N) ') == 'y': print(bitcoin.transmit(unsigned_tx_hex)) else: print('Transaction aborted.', file=sys.stderr) sys.exit(1)
cli('create_callback', [args.source, util.devise(db, args.fraction, 'fraction', 'input'), args.asset], args.unsigned) # VIEWING (temporary) elif args.action == 'balances': try: bitcoin.base58_decode(args.address, config.ADDRESSVERSION) except Exception: raise exceptions.InvalidAddressError('Invalid Bitcoin address:', args.address) balances(args.address) elif args.action == 'asset': results = util.api('get_asset_info', ([args.asset],))[0] # HACK asset_id = util.get_asset_id(args.asset) divisible = results['divisible'] total_issued = util.devise(db, results['total_issued'], args.asset, dest='output') call_date = util.isodt(results['call_date']) if results['call_date'] else results['call_date'] call_price = str(results['call_price']) + ' XCP' if results['call_price'] else results['call_price'] print('Asset Name:', args.asset) print('Asset ID:', asset_id) print('Divisible:', divisible) print('Total Issued:', total_issued) print('Issuer:', results['issuer']) print('Callable:', results['callable']) print('Call Date:', call_date) print('Call Price:', call_price) print('Description:', '‘' + results['description'] + '’')
cli('create_callback', [ args.source, util.devise(db, args.fraction, 'fraction', 'input'), args.asset ], args.unsigned) # VIEWING (temporary) elif args.action == 'balances': try: bitcoin.base58_decode(args.address, config.ADDRESSVERSION) except Exception: raise exceptions.InvalidAddressError('Invalid Bitcoin address:', args.address) balances(args.address) elif args.action == 'asset': results = util.api('get_asset_info', [args.asset]) asset_id = util.get_asset_id(args.asset) divisible = results['divisible'] total_issued = util.devise(db, results['total_issued'], args.asset, dest='output') call_date = util.isodt( results['call_date'] ) if results['call_date'] else results['call_date'] call_price = str(results['call_price']) + ' XCP' if results[ 'call_price'] else results['call_price'] print('Asset Name:', args.asset) print('Asset ID:', asset_id) print('Divisible:', divisible)
def get_address (db, address): address_dict = {} address_dict['balances'] = util.api('get_balances', {'filters': [('address', '==', address),]}) address_dict['debits'] = util.api('get_debits', {'filters': [('address', '==', address),]}) address_dict['credits'] = util.api('get_credits', {'filters': [('address', '==', address),]}) address_dict['burns'] = util.api('get_burns', {'filters': [('source', '==', address),]}) address_dict['sends'] = util.api('get_sends', {'filters': [('source', '==', address), ('destination', '==', address)], 'filterop': 'or'}) address_dict['orders'] = util.api('get_orders', {'filters': [('source', '==', address),]}) address_dict['order_matches'] = util.api('get_order_matches', {'filters': [('tx0_address', '==', address), ('tx1_address', '==', address)], 'filterop': 'or'}) address_dict['btcpays'] = util.api('get_btcpays', {'filters': [('source', '==', address), ('destination', '==', address)], 'filterop': 'or'}) address_dict['issuances'] = util.api('get_issuances', {'filters': [('source', '==', address),]}) address_dict['broadcasts'] = util.api('get_broadcasts', {'filters': [('source', '==', address),]}) address_dict['bets'] = util.api('get_bets', {'filters': [('source', '==', address),]}) address_dict['bet_matches'] = util.api('get_bet_matches', {'filters': [('tx0_address', '==', address), ('tx1_address', '==', address)], 'filterop': 'or'}) address_dict['dividends'] = util.api('get_dividends', {'filters': [('source', '==', address),]}) address_dict['cancels'] = util.api('get_cancels', {'filters': [('source', '==', address),]}) address_dict['callbacks'] = util.api('get_callbacks', {'filters': [('source', '==', address),]}) address_dict['bet_expirations'] = util.api('get_bet_expirations', {'filters': [('source', '==', address),]}) address_dict['order_expirations'] = util.api('get_order_expirations', {'filters': [('source', '==', address),]}) address_dict['bet_match_expirations'] = util.api('get_bet_match_expirations', {'filters': [('tx0_address', '==', address), ('tx1_address', '==', address)], 'filterop': 'or'}) address_dict['order_match_expirations'] = util.api('get_order_match_expirations', {'filters': [('tx0_address', '==', address), ('tx1_address', '==', address)], 'filterop': 'or'}) return address_dict
cli('create_callback', {'source': args.source, 'fraction': util.devise(db, args.fraction, 'fraction', 'input'), 'asset': args.asset, 'fee': args.fee, 'allow_unconfirmed_inputs': args.unconfirmed}, args.unsigned) # VIEWING (temporary) elif args.action == 'balances': try: bitcoin.base58_decode(args.address, config.ADDRESSVERSION) except Exception: raise exceptions.AddressError('Invalid Bitcoin address:', args.address) balances(args.address) elif args.action == 'asset': results = util.api('get_asset_info', ([args.asset],)) if results: results = results[0] # HACK else: print('Asset ‘{}’ not found.'.format(args.asset)) exit(0) asset_id = util.asset_id(args.asset) divisible = results['divisible'] supply = util.devise(db, results['supply'], args.asset, dest='output') call_date = util.isodt(results['call_date']) if results['call_date'] else results['call_date'] call_price = str(results['call_price']) + ' XCP' if results['call_price'] else results['call_price'] print('Asset Name:', args.asset) print('Asset ID:', asset_id) print('Divisible:', divisible)
cli('create_callback', [args.source, util.devise(db, args.fraction, 'fraction', 'input'), args.asset], args.unsigned) # VIEWING (temporary) elif args.action == 'balances': try: bitcoin.base58_decode(args.address, config.ADDRESSVERSION) except Exception: raise exceptions.InvalidAddressError('Invalid Bitcoin address:', args.address) balances(args.address) elif args.action == 'asset': results = util.api('get_asset_info', [args.asset]) asset_id = util.get_asset_id(args.asset) divisible = results['divisible'] total_issued = util.devise(db, results['total_issued'], args.asset, dest='output') call_date = util.isodt(results['call_date']) if results['call_date'] else results['call_date'] call_price = str(results['call_price']) + ' XCP' if results['call_price'] else results['call_price'] print('Asset Name:', args.asset) print('Asset ID:', asset_id) print('Divisible:', divisible) print('Total Issued:', total_issued) print('Issuer:', results['issuer']) print('Callable:', results['callable']) print('Call Date:', call_date) print('Call Price:', call_price) print('Description:', '‘' + results['description'] + '’')