def wallet(): wallet = {'addresses': {}} totals = {} for group in bitcoin.rpc('listaddressgroupings', []): for bunch in group: address, btc_balance = bunch[:2] get_address = util.get_address(db, address=address) balances = get_address['balances'] assets = {} empty = True if btc_balance: assets['BTC'] = btc_balance if 'BTC' in totals.keys(): totals['BTC'] += btc_balance else: totals['BTC'] = btc_balance empty = False for balance in balances: asset = balance['asset'] balance = D( util.devise(db, balance['amount'], balance['asset'], 'output')) if balance: if asset in totals.keys(): totals[asset] += balance else: totals[asset] = balance assets[asset] = balance empty = False if not empty: wallet['addresses'][address] = assets wallet['totals'] = totals response.content_type = 'application/json' return json.dumps(wallet, cls=DecimalEncoder)
def wallet(): wallet = {'addresses': {}} totals = {} for group in bitcoin.rpc('listaddressgroupings', []): for bunch in group: address, btc_balance = bunch[:2] get_address = util.get_address(db, address=address) balances = get_address['balances'] assets = {} empty = True if btc_balance: assets['BTC'] = btc_balance if 'BTC' in totals.keys(): totals['BTC'] += btc_balance else: totals['BTC'] = btc_balance empty = False for balance in balances: asset = balance['asset'] balance = D(util.devise(db, balance['amount'], balance['asset'], 'output')) if balance: if asset in totals.keys(): totals[asset] += balance else: totals[asset] = balance assets[asset] = balance empty = False if not empty: wallet['addresses'][address] = assets wallet['totals'] = totals response.content_type = 'application/json' return json.dumps(wallet, cls=DecimalEncoder)
def counterparty_action(): unsigned = True if getp('unsigned') != None and getp( 'unsigned') == "1" else False try: passphrase = getp('passphrase', None) unlock = wallet_unlock(passphrase) if unlock['success'] == False: raise Exception(unlock['message']) action = getp('action') if action == 'send': source = getp('source') destination = getp('destination') asset = getp('asset') quantity = util.devise(db, getp('quantity'), asset, 'input') tx_info = send.compose(db, source, destination, asset, quantity) unsigned_tx_hex = bitcoin.transaction(tx_info, config.MULTISIG) result = {'success': True, 'message': str(unsigned_tx_hex)} elif action == 'order': source = getp('source') give_asset = getp('give_asset') get_asset = getp('get_asset') fee_fraction_required = getp('fee_fraction_required', '0') fee_fraction_provided = getp('fee_fraction_provided', '0') give_quantity = getp('give_quantity', '0') get_quantity = getp('get_quantity', '0') try: expiration = int(getp('expiration')) except: raise Exception('Invalid expiration') # Fee argument is either fee_required or fee_provided, as necessary. if give_asset == 'BTC': fee_required = 0 fee_fraction_provided = util.devise(db, fee_fraction_provided, 'fraction', 'input') fee_provided = round( D(fee_fraction_provided) * D(give_quantity) * D(config.UNIT)) if fee_provided < config.MIN_FEE: raise Exception( 'Fee provided less than minimum necessary for acceptance in a block.' ) elif get_asset == 'BTC': fee_provided = config.MIN_FEE fee_fraction_required = util.devise(db, fee_fraction_required, 'fraction', 'input') fee_required = round( D(fee_fraction_required) * D(get_quantity) * D(config.UNIT)) else: fee_required = 0 fee_provided = config.MIN_FEE give_quantity = util.devise(db, D(give_quantity), give_asset, 'input') get_quantity = util.devise(db, D(get_quantity), get_asset, 'input') tx_info = order.compose(db, source, give_asset, give_quantity, get_asset, get_quantity, expiration, fee_required, fee_provided) unsigned_tx_hex = bitcoin.transaction(tx_info, config.MULTISIG) result = {'success': True, 'message': str(unsigned_tx_hex)} elif action == 'btcpay': order_match_id = getp('order_match_id') tx_info = btcpay.compose(db, order_match_id) unsigned_tx_hex = bitcoin.transaction(tx_info, config.MULTISIG) result = {'success': True, 'message': str(unsigned_tx_hex)} elif action == 'cancel': offer_hash = getp('offer_hash') tx_info = cancel.compose(db, offer_hash) unsigned_tx_hex = bitcoin.transaction(tx_info, config.MULTISIG) result = {'success': True, 'message': str(unsigned_tx_hex)} elif action == 'issuance': source = getp('source') transfer_destination = getp('transfer_destination') asset_name = getp('asset_name') divisible = True if getp('divisible') == "1" else False quantity = util.devise(db, getp('quantity'), None, 'input', divisible=divisible) callable_ = True if getp('callable') == "1" else False call_date = getp('call_date') call_price = getp('call_price') description = getp('description') if callable_: if call_date == '': raise Exception('must specify call date of callable asset') if call_price == '': raise Exception( 'must specify call price of callable asset') call_date = calendar.timegm( dateutil.parser.parse(args.call_date).utctimetuple()) call_price = float(args.call_price) else: call_date, call_price = 0, 0 try: quantity = int(quantity) except ValueError: raise Exception("Invalid quantity") tx_info = issuance.compose(db, source, transfer_destination, asset_name, quantity, divisible, callable_, call_date, call_price, description) unsigned_tx_hex = bitcoin.transaction(tx_info, config.MULTISIG) result = {'success': True, 'message': str(unsigned_tx_hex)} elif action == 'dividend': source = getp('source') asset = getp('asset') quantity_per_share = util.devise(db, getp('quantity_per_share'), 'XCP', 'input') tx_info = dividend.compose(db, source, quantity_per_unit, asset) unsigned_tx_hex = bitcoin.transaction(tx_info, config.MULTISIG) result = {'success': True, 'message': str(unsigned_tx_hex)} elif action == 'callback': source = getp('source') asset = getp('asset') fraction_per_share = util.devise(db, getp('fraction_per_share'), 'fraction', 'input') tx_info = callback.compose(db, source, fraction_per_share, asset) unsigned_tx_hex = bitcoin.transaction(tx_info, config.MULTISIG) result = {'success': True, 'message': str(unsigned_tx_hex)} elif action == 'broadcast': source = getp('source') text = getp('text') value = util.devise(db, getp('value'), 'value', 'input') fee_fraction = util.devise(db, getp('fee_fraction'), 'fraction', 'input') tx_info = broadcast.compose(db, source, int(time.time()), value, fee_fraction, text) unsigned_tx_hex = bitcoin.transaction(tx_info, config.MULTISIG) result = {'success': True, 'message': str(unsigned_tx_hex)} elif action == 'bet': source = getp('source') feed_address = getp('feed_address') bet_type = int(getp('bet_type')) deadline = calendar.timegm( dateutil.parser.parse(getp('deadline')).utctimetuple()) wager = util.devise(db, getp('wager'), 'XCP', 'input') counterwager = util.devise(db, getp('counterwager'), 'XCP', 'input') target_value = util.devise(db, getp('target_value'), 'value', 'input') leverage = util.devise(db, getp('leverage'), 'leverage', 'input') expiration = getp('expiration') tx_info = bet.compose(db, source, feed_address, bet_type, deadline, wager, counterwager, target_value, leverage, expiration) unsigned_tx_hex = bitcoin.transaction(tx_info, config.MULTISIG) result = {'success': True, 'message': str(unsigned_tx_hex)} else: result = {'success': False, 'message': 'Unknown action.'} if result['success'] == True and unsigned == False: tx_hash = bitcoin.transmit(unsigned_tx_hex) result['message'] = "Transaction transmited: " + tx_hash except Exception as e: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_tb(exc_traceback, limit=5) message = str(e) print(message) result = {'success': False, 'message': message} response.content_type = 'application/json' return json.dumps(result, cls=DecimalEncoder)
def counterparty_action(): unsigned = True if getp('unsigned')!=None and getp('unsigned')=="1" else False try: if config.MODE=="gui": passphrase = getp('passphrase', None) unlock = wallet_unlock(passphrase) if unlock['success']==False: raise Exception(unlock['message']) action = getp('action') if config.LIGHT: data = {'action': action} for param in counterpartyd_params[action]: data[param] = getp(param) if action in ["btcpay", "cancel"]: path = "/"+action+"/" if action=="btcpay": path = path+data['order_match_id'] else: path = path+data['offer_hash'] path = path+"/source" pubkey_result = composer_request(path) if pubkey_result['success']==False: raise Exception("Invalid source address") source = pubkey_result['message'] else: source = data['source'] data['pubkey'] = bitcoin.rpc("dumppubkey", [source]) result = composer_request('/action', 'POST', data) else: if action=='send': source = getp('source') destination = getp('destination') asset = getp('asset') quantity = util.devise(db, getp('quantity'), asset, 'input') tx_info = send.compose(db, source, destination, asset, quantity) result = generate_unsigned_hex(tx_info) elif action=='order': source = getp('source') give_asset = getp('give_asset') get_asset = getp('get_asset') fee_fraction_required = getp('fee_fraction_required', '0') fee_fraction_provided = getp('fee_fraction_provided', '0') give_quantity = getp('give_quantity', '0') get_quantity = getp('get_quantity', '0') try: expiration = int(getp('expiration')) except: raise Exception('Invalid expiration') # Fee argument is either fee_required or fee_provided, as necessary. if give_asset == 'BTC': fee_required = 0 fee_fraction_provided = util.devise(db, fee_fraction_provided, 'fraction', 'input') fee_provided = round(D(fee_fraction_provided) * D(give_quantity) * D(config.UNIT)) if fee_provided < config.MIN_FEE: raise Exception('Fee provided less than minimum necessary for acceptance in a block.') elif get_asset == 'BTC': fee_provided = config.MIN_FEE fee_fraction_required = util.devise(db, fee_fraction_required, 'fraction', 'input') fee_required = round(D(fee_fraction_required) * D(get_quantity) * D(config.UNIT)) else: fee_required = 0 fee_provided = config.MIN_FEE give_quantity = util.devise(db, D(give_quantity), give_asset, 'input') get_quantity = util.devise(db, D(get_quantity), get_asset, 'input') tx_info = order.compose(db, source, give_asset, give_quantity, get_asset, get_quantity, expiration, fee_required, fee_provided) result = generate_unsigned_hex(tx_info) elif action=='btcpay': order_match_id = getp('order_match_id') tx_info = btcpay.compose(db, order_match_id) result = generate_unsigned_hex(tx_info) elif action=='cancel': offer_hash = getp('offer_hash') tx_info = cancel.compose(db, offer_hash) result = generate_unsigned_hex(tx_info) elif action=='issuance': source = getp('source') transfer_destination = getp('transfer_destination') asset_name = getp('asset_name') divisible = True if getp('divisible')=="1" else False quantity = util.devise(db, getp('quantity'), None, 'input', divisible=divisible) callable_ = True if getp('callable')=="1" else False call_date = getp('call_date') call_price = getp('call_price') description = getp('description') if callable_: if call_date=='': raise Exception('must specify call date of callable asset') if call_price=='': raise Exception('must specify call price of callable asset') call_date = calendar.timegm(dateutil.parser.parse(args.call_date).utctimetuple()) call_price = float(args.call_price) else: call_date, call_price = 0, 0 try: quantity = int(quantity) except ValueError: raise Exception("Invalid quantity") tx_info = issuance.compose(db, source, transfer_destination, asset_name, quantity, divisible, callable_, call_date, call_price, description) result = generate_unsigned_hex(tx_info) elif action=='dividend': source = getp('source') asset = getp('asset') dividend_asset = getp('dividend_asset') quantity_per_share = util.devise(db, getp('quantity_per_share'), dividend_asset, 'input') tx_info = dividend.compose(db, source, quantity_per_share, asset) result = generate_unsigned_hex(tx_info) elif action=='callback': source = getp('source') asset = getp('asset') fraction_per_share = util.devise(db, getp('fraction_per_share'), 'fraction', 'input') tx_info = callback.compose(db, source, fraction_per_share, asset) result = generate_unsigned_hex(tx_info) elif action=='broadcast': source = getp('source') text = getp('text') value = util.devise(db, getp('value'), 'value', 'input') fee_fraction = util.devise(db, getp('fee_fraction'), 'fraction', 'input') tx_info = broadcast.compose(db, source, int(time.time()), value, fee_fraction, text) result = generate_unsigned_hex(tx_info) elif action=='bet': source = getp('source') feed_address = getp('feed_address') bet_type = int(getp('bet_type')) deadline = calendar.timegm(dateutil.parser.parse(getp('deadline')).utctimetuple()) wager = util.devise(db, getp('wager'), 'XCP', 'input') counterwager = util.devise(db, getp('counterwager'), 'XCP', 'input') target_value = util.devise(db, getp('target_value'), 'value', 'input') leverage = util.devise(db, getp('leverage'), 'leverage', 'input') expiration = getp('expiration') tx_info = bet.compose(db, source, feed_address, bet_type, deadline, wager, counterwager, target_value, leverage, expiration) result = generate_unsigned_hex(tx_info) else: result = {'success':False, 'message':'Unknown action.'} if config.MODE=="gui" and result['success']==True and unsigned==False: unsigned_tx_hex = result['message'] tx_hash = bitcoin.transmit(unsigned_tx_hex); result['message'] = "Transaction transmited: "+tx_hash except Exception as e: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_tb(exc_traceback, limit=5) message = str(e) result = {'success':False, 'message':message} response.content_type = 'application/json' return json.dumps(result, cls=DecimalEncoder)
def counterparty_action(): unsigned = True if request.forms.get('unsigned')!=None and request.forms.get('unsigned')=="1" else False try: action = request.forms.get('action') if action=='send': source = request.forms.get('source') destination = request.forms.get('destination') asset = request.forms.get('asset') quantity = util.devise(db, request.forms.get('quantity'), asset, 'input') unsigned_tx_hex = send.create(db, source, destination, quantity, asset, unsigned=unsigned) result = {'success':True, 'message':str(unsigned_tx_hex)} elif action=='order': source = request.forms.get('source') give_asset = request.forms.get('give_asset') get_asset = request.forms.get('get_asset') give_quantity = util.devise(db, request.forms.get('give_quantity'), give_asset, 'input') get_quantity = util.devise(db, request.forms.get('get_quantity'), get_asset, 'input') expiration = int(request.forms.get('expiration')) fee_required = 0 fee_provided = config.MIN_FEE if give_asset == 'BTC': fee_required = 0 fee_provided = util.devise(db, request.forms.get('fee_provided'), 'BTC', 'input') elif get_asset == 'BTC': fee_required = util.devise(db, request.forms.get('fee_required'), 'BTC', 'input') fee_provided = config.MIN_FEE unsigned_tx_hex = order.create(db, source, give_asset, give_quantity, get_asset, get_quantity, expiration, fee_required, fee_provided, unsigned=unsigned) result = {'success':True, 'message':str(unsigned_tx_hex)} elif action=='btcpay': order_match_id = request.forms.get('order_match_id') unsigned_tx_hex = btcpay.create(db, order_match_id, unsigned=unsigned) result = {'success':True, 'message':str(unsigned_tx_hex)} elif action=='cancel': offer_hash = request.forms.get('offer_hash') unsigned_tx_hex = cancel.create(db, offer_hash, unsigned=unsigned) result = {'success':True, 'message':str(unsigned_tx_hex)} elif action=='issuance': source = request.forms.get('source') destination = request.forms.get('destination') asset_name = request.forms.get('asset_name') divisible = True if request.forms.get('divisible')=="1" else False quantity = util.devise(db, request.forms.get('quantity'), None, 'input', divisible=divisible) callable_ = True if request.forms.get('callable')=="1" else False call_date = request.forms.get('call_date') call_price = request.forms.get('call_price') description = request.forms.get('description') if callable_: call_date = round(datetime.timestamp(dateutil.parser.parse(call_date))) call_price = float(call_price) else: call_date, call_price = 0, 0 issuance.create(db, source, destination, asset_name, quantity, divisible, callable_, call_date, call_price, description, unsigned=unsigned) result = {'success':True, 'message':str(unsigned_tx_hex)} elif action=='dividend': source = request.forms.get('source') asset = request.forms.get('asset') quantity_per_share = util.devise(db, request.forms.get('quantity_per_share'), 'XCP', 'input') unsigned_tx_hex = dividend.create(db, source, quantity_per_share, asset, unsigned=unsigned) result = {'success':True, 'message':str(unsigned_tx_hex)} elif action=='callback': source = request.forms.get('source') asset = request.forms.get('asset') fraction_per_share = float(request.forms.get('fraction_per_share')) unsigned_tx_hex = callback.create(db, source, fraction_per_share, asset, unsigned=unsigned) result = {'success':True, 'message':str(unsigned_tx_hex)} elif action=='broadcast': source = request.forms.get('source') text = request.forms.get('text') value = util.devise(db, request.forms.get('value'), 'value', 'input') fee_multiplier = request.forms.get('fee_multiplier') unsigned_tx_hex = broadcast.create(db, source, int(time.time()), value, fee_multiplier, text, unsigned=unsigned) result = {'success':True, 'message':str(unsigned_tx_hex)} elif action=='bet': source = request.forms.get('source') feed_address = request.forms.get('feed_address') bet_type = int(request.forms.get('bet_type')) deadline = calendar.timegm(dateutil.parser.parse(request.forms.get('deadline')).utctimetuple()) wager = util.devise(db, request.forms.get('wager'), 'XCP', 'input') counterwager = util.devise(db, request.forms.get('counterwager'), 'XCP', 'input') target_value = util.devise(db, request.forms.get('target_value'), 'value', 'input') leverage = util.devise(db, request.forms.get('leverage'), 'leverage', 'input') expiration = request.forms.get('expiration') unsigned_tx_hex = bet.create(db, source, feed_address, bet_type, deadline, wager, counterwager, target_value, leverage, expiration, unsigned=unsigned) result = {'success':True, 'message':str(unsigned_tx_hex)} else: result = {'success':False, 'message':'Unknown action.'} if result['success']==True and unsigned==False: tx_hash = bitcoin.transmit(unsigned_tx_hex, ask=False); result['message'] = "Transaction transmited: "+tx_hash except Exception as e: result = {'success':False, 'message':str(e)} response.content_type = 'application/json' return json.dumps(result, cls=DecimalEncoder)