예제 #1
0
def wallet():
    wallet = {'addresses': {}, 'assets': {}}

    def add_total(address, asset, quantity):
        if quantity:
            if address not in wallet['addresses']:
                wallet['addresses'][address] = {}
            if asset not in wallet['assets']:
                wallet['assets'][asset] = 0
            if asset not in wallet['addresses'][address]:
                wallet['addresses'][address][asset] = 0
            wallet['addresses'][address][asset] += quantity
            wallet['assets'][asset] += quantity

    for bunch in get_btc_balances():
        address, btc_balance = bunch
        add_total(address, 'BTC', btc_balance)
        balances = api('get_balances',
                       {'filters': [
                           ('address', '==', address),
                       ]})
        for balance in balances:
            asset = balance['asset']
            balance = D(value_out(balance['quantity'], asset))
            add_total(address, asset, balance)

    return wallet
예제 #2
0
def balances(address):
    result = {"BTC": get_btc_balance(address)}
    balances = api("get_balances", {"filters": [("address", "==", address)]})
    for balance in balances:
        asset = balance["asset"]
        balance = D(value_out(balance["quantity"], asset))
        result[asset] = balance
    return result
예제 #3
0
def balances(address):
    result = {'BTC': get_btc_balance(address)}
    balances = api('get_balances', {'filters': [
        ('address', '==', address),
    ]})
    for balance in balances:
        asset = balance['asset']
        balance = D(value_out(balance['quantity'], asset))
        result[asset] = balance
    return result
예제 #4
0
def wallet():
    wallet = {"addresses": {}, "assets": {}}

    def add_total(address, asset, quantity):
        if quantity:
            if address not in wallet["addresses"]:
                wallet["addresses"][address] = {}
            if asset not in wallet["assets"]:
                wallet["assets"][asset] = 0
            if asset not in wallet["addresses"][address]:
                wallet["addresses"][address][asset] = 0
            wallet["addresses"][address][asset] += quantity
            wallet["assets"][asset] += quantity

    for bunch in get_btc_balances():
        address, btc_balance = bunch
        add_total(address, "BTC", btc_balance)
        balances = api("get_balances", {"filters": [("address", "==", address)]})
        for balance in balances:
            asset = balance["asset"]
            balance = D(value_out(balance["quantity"], asset))
            add_total(address, asset, balance)

    return wallet
예제 #5
0
def prepare_args(args, action):
    # Convert.
    args.fee_per_kb = int(args.fee_per_kb * config.UNIT)
    args.regular_dust_size = int(args.regular_dust_size * config.UNIT)
    args.multisig_dust_size = int(args.multisig_dust_size * config.UNIT)
    args.op_return_value = int(args.op_return_value * config.UNIT)

    # common
    if args.fee:
        args.fee = util.value_in(args.fee, config.BTC)

    # send
    if action == 'send':
        args.quantity = util.value_in(args.quantity, args.asset)

    # order
    if action == 'order':
        fee_required, fee_fraction_provided = D(args.fee_fraction_required), D(
            args.fee_fraction_provided)
        give_quantity, get_quantity = D(args.give_quantity), D(
            args.get_quantity)

        # Fee argument is either fee_required or fee_provided, as necessary.
        if args.give_asset == config.BTC:
            args.fee_required = 0
            fee_fraction_provided = util.value_in(fee_fraction_provided,
                                                  'fraction')
            args.fee_provided = round(
                D(fee_fraction_provided) * D(give_quantity) * D(config.UNIT))
            print('Fee provided: {} {}'.format(
                util.value_out(args.fee_provided, config.BTC), config.BTC))
        elif args.get_asset == config.BTC:
            args.fee_provided = 0
            fee_fraction_required = util.value_in(args.fee_fraction_required,
                                                  'fraction')
            args.fee_required = round(
                D(fee_fraction_required) * D(get_quantity) * D(config.UNIT))
            print('Fee required: {} {}'.format(
                util.value_out(args.fee_required, config.BTC), config.BTC))
        else:
            args.fee_required = 0
            args.fee_provided = 0

        args.give_quantity = util.value_in(give_quantity, args.give_asset)
        args.get_quantity = util.value_in(get_quantity, args.get_asset)

    # issuance
    if action == 'issuance':
        args.quantity = util.value_in(args.quantity,
                                      None,
                                      divisible=args.divisible)

    # broadcast
    if action == 'broadcast':
        args.value = util.value_in(args.value, 'value')
        args.fee_fraction = util.value_in(args.fee_fraction, 'fraction')

    # bet
    if action == 'bet':
        args.deadline = calendar.timegm(
            dateutil.parser.parse(args.deadline).utctimetuple())
        args.wager = util.value_in(args.wager, config.XCP)
        args.counterwager = util.value_in(args.counterwager, config.XCP)
        args.target_value = util.value_in(args.target_value, 'value')
        args.leverage = util.value_in(args.leverage, 'leverage')
        args.bet_type = BET_TYPE_ID[args.bet_type]

    # dividend
    if action == 'dividend':
        args.quantity_per_unit = util.value_in(args.quantity_per_unit,
                                               config.XCP)

    # burn
    if action == 'burn':
        args.quantity = util.value_in(args.quantity, config.BTC)

    # execute
    if action == 'execute':
        args.value = util.value_in(args.value, 'XCP')
        args.startgas = util.value_in(args.startgas, 'XCP')

    # destroy
    if action == 'destroy':
        args.quantity = util.value_in(args.quantity, args.asset, 'input')

    # RPS
    if action == 'rps':

        def generate_move_random_hash(move):
            move = int(move).to_bytes(2, byteorder='big')
            random_bin = os.urandom(16)
            move_random_hash_bin = dhash(random_bin + move)
            return binascii.hexlify(random_bin).decode(
                'utf8'), binascii.hexlify(move_random_hash_bin).decode('utf8')

        args.wager = util.value_in(args.wager, 'XCP')
        random, move_random_hash = generate_move_random_hash(args.move)
        setattr(args, 'move_random_hash', move_random_hash)
        print('random: {}'.format(random))
        print('move_random_hash: {}'.format(move_random_hash))

    return args
예제 #6
0
def asset(asset_name):
    supply = api('get_supply', {'asset': asset_name})
    asset_id = api('get_assets',
                   {'filters': [
                       ('asset_name', '==', asset_name),
                   ]})[0]['asset_id']
    asset_info = {
        'asset': asset_name,
        'supply': D(value_out(supply, asset_name)),
        'asset_id': asset_id
    }
    if asset_name in ['XCP', 'BTC']:
        asset_info.update({
            'owner': None,
            'divisible': True,
            'locked': False,
            'description': '',
            'issuer': None
        })
    else:
        issuances = api(
            'get_issuances', {
                'filters': [
                    ('asset', '==', asset_name),
                ],
                'status': 'valid',
                'order_by': 'tx_index',
                'order_dir': 'DESC',
            })
        if not issuances:
            raise WalletError('Asset not found')
        locked = False
        for issuance in issuances:
            if issuance['locked']:
                locked = True
        issuance = issuances[0]
        asset_info.update({
            'owner': issuance['issuer'],
            'divisible': bool(issuance['divisible']),
            'locked': locked,
            'description': issuance['description'],
            'issuer': issuance['issuer']
        })

    asset_info['balance'] = 0
    asset_info['addresses'] = {}

    for bunch in get_btc_balances():
        address, btc_balance = bunch
        if asset_name == 'BTC':
            balance = btc_balance
        else:
            balances = api(
                'get_balances', {
                    'filters': [('address', '==', address),
                                ('asset', '==', asset_name)]
                })
            if balances:
                balance = balances[0]
                balance = D(value_out(balance['quantity'], asset_name))
            else:
                balance = 0
        if balance:
            asset_info['balance'] += balance
            asset_info['addresses'][address] = balance

    addresses = list(asset_info['addresses'].keys())

    if asset_name != 'BTC':
        all_sends = api(
            'get_sends', {
                'filters': [('source', 'IN', addresses),
                            ('destination', 'IN', addresses)],
                'filterop':
                'OR',
                'status':
                'valid'
            })
        sends = []
        for send in all_sends:
            if send['asset'] == asset_name:
                if send['source'] in addresses and send[
                        'destination'] in addresses:
                    tx_type = 'in-wallet'
                elif send['source'] in addresses:
                    tx_type = 'send'
                elif send['destination'] in addresses:
                    tx_type = 'receive'
                send['type'] = tx_type
                send['quantity'] = D(value_out(send['quantity'], asset_name))
                sends.append(send)
        asset_info['sends'] = sends

    return asset_info
예제 #7
0
def prepare_args(args, action):
    # Convert.
    args.fee_per_kb = int(args.fee_per_kb * config.UNIT)
    args.regular_dust_size = int(args.regular_dust_size * config.UNIT)
    args.multisig_dust_size = int(args.multisig_dust_size * config.UNIT)
    args.op_return_value = int(args.op_return_value * config.UNIT)

    # common
    if args.fee:
        args.fee = util.value_in(args.fee, config.BTC)

    # send
    if action == "send":
        args.quantity = util.value_in(args.quantity, args.asset)

    # order
    if action == "order":
        fee_required, fee_fraction_provided = D(args.fee_fraction_required), D(args.fee_fraction_provided)
        give_quantity, get_quantity = D(args.give_quantity), D(args.get_quantity)

        # Fee argument is either fee_required or fee_provided, as necessary.
        if args.give_asset == config.BTC:
            args.fee_required = 0
            fee_fraction_provided = util.value_in(fee_fraction_provided, "fraction")
            args.fee_provided = round(D(fee_fraction_provided) * D(give_quantity) * D(config.UNIT))
            print("Fee provided: {} {}".format(util.value_out(args.fee_provided, config.BTC), config.BTC))
        elif args.get_asset == config.BTC:
            args.fee_provided = 0
            fee_fraction_required = util.value_in(args.fee_fraction_required, "fraction")
            args.fee_required = round(D(fee_fraction_required) * D(get_quantity) * D(config.UNIT))
            print("Fee required: {} {}".format(util.value_out(args.fee_required, config.BTC), config.BTC))
        else:
            args.fee_required = 0
            args.fee_provided = 0

        args.give_quantity = util.value_in(give_quantity, args.give_asset)
        args.get_quantity = util.value_in(get_quantity, args.get_asset)

    # issuance
    if action == "issuance":
        args.quantity = util.value_in(args.quantity, None, divisible=args.divisible)

    # broadcast
    if action == "broadcast":
        args.value = util.value_in(args.value, "value")
        args.fee_fraction = util.value_in(args.fee_fraction, "fraction")
        args.timestamp = int(time.time())

    # bet
    if action == "bet":
        args.deadline = calendar.timegm(dateutil.parser.parse(args.deadline).utctimetuple())
        args.wager = util.value_in(args.wager, config.XCP)
        args.counterwager = util.value_in(args.counterwager, config.XCP)
        args.target_value = util.value_in(args.target_value, "value")
        args.leverage = util.value_in(args.leverage, "leverage")
        args.bet_type = BET_TYPE_ID[args.bet_type]

    # dividend
    if action == "dividend":
        args.quantity_per_unit = util.value_in(args.quantity_per_unit, config.XCP)

    # burn
    if action == "burn":
        args.quantity = util.value_in(args.quantity, config.BTC)

    # execute
    if action == "execute":
        args.value = util.value_in(args.value, "XCP")
        args.startgas = util.value_in(args.startgas, "XCP")

    # destroy
    if action == "destroy":
        args.quantity = util.value_in(args.quantity, args.asset, "input")

    # RPS
    if action == "rps":

        def generate_move_random_hash(move):
            move = int(move).to_bytes(2, byteorder="big")
            random_bin = os.urandom(16)
            move_random_hash_bin = dhash(random_bin + move)
            return binascii.hexlify(random_bin).decode("utf8"), binascii.hexlify(move_random_hash_bin).decode("utf8")

        args.wager = util.value_in(args.wager, "XCP")
        random, move_random_hash = generate_move_random_hash(args.move)
        setattr(args, "move_random_hash", move_random_hash)
        print("random: {}".format(random))
        print("move_random_hash: {}".format(move_random_hash))

    return args
예제 #8
0
def asset(asset_name):
    supply = api("get_supply", {"asset": asset_name})
    asset_id = api("get_assets", {"filters": [("asset_name", "==", asset_name)]})[0]["asset_id"]
    asset_info = {"asset": asset_name, "supply": D(value_out(supply, asset_name)), "asset_id": asset_id}
    if asset_name in ["XCP", "BTC"]:
        asset_info.update({"owner": None, "divisible": True, "locked": False, "description": "", "issuer": None})
    else:
        issuances = api(
            "get_issuances",
            {"filters": [("asset", "==", asset_name)], "status": "valid", "order_by": "tx_index", "order_dir": "DESC"},
        )
        if not issuances:
            raise WalletError("Asset not found")
        locked = False
        for issuance in issuances:
            if issuance["locked"]:
                locked = True
        issuance = issuances[0]
        asset_info.update(
            {
                "owner": issuance["issuer"],
                "divisible": bool(issuance["divisible"]),
                "locked": locked,
                "description": issuance["description"],
                "issuer": issuance["issuer"],
            }
        )

    asset_info["balance"] = 0
    asset_info["addresses"] = {}

    for bunch in get_btc_balances():
        address, btc_balance = bunch
        if asset_name == "BTC":
            balance = btc_balance
        else:
            balances = api("get_balances", {"filters": [("address", "==", address), ("asset", "==", asset_name)]})
            if balances:
                balance = balances[0]
                balance = D(value_out(balance["quantity"], asset_name))
            else:
                balance = 0
        if balance:
            asset_info["balance"] += balance
            asset_info["addresses"][address] = balance

    addresses = list(asset_info["addresses"].keys())

    if asset_name != "BTC":
        all_sends = api(
            "get_sends",
            {
                "filters": [("source", "IN", addresses), ("destination", "IN", addresses)],
                "filterop": "OR",
                "status": "valid",
            },
        )
        sends = []
        for send in all_sends:
            if send["asset"] == asset_name:
                if send["source"] in addresses and send["destination"] in addresses:
                    tx_type = "in-wallet"
                elif send["source"] in addresses:
                    tx_type = "send"
                elif send["destination"] in addresses:
                    tx_type = "receive"
                send["type"] = tx_type
                send["quantity"] = D(value_out(send["quantity"], asset_name))
                sends.append(send)
        asset_info["sends"] = sends

    return asset_info
예제 #9
0
def prepare_args(args, action):
    # Convert.
    args.fee_per_kb = int(args.fee_per_kb * config.UNIT)
    args.regular_dust_size = int(args.regular_dust_size * config.UNIT)
    args.multisig_dust_size = int(args.multisig_dust_size * config.UNIT)
    args.op_return_value = int(args.op_return_value * config.UNIT)
    
    # common
    if args.fee:
        args.fee = util.value_in(args.fee, config.BTC)

    # send
    if action == 'send':
        args.quantity = util.value_in(args.quantity, args.asset)

    # order
    if action == 'order':
        fee_required, fee_fraction_provided = D(args.fee_fraction_required), D(args.fee_fraction_provided)
        give_quantity, get_quantity = D(args.give_quantity), D(args.get_quantity)

        # Fee argument is either fee_required or fee_provided, as necessary.
        if args.give_asset == config.BTC:
            args.fee_required = 0
            fee_fraction_provided = util.value_in(fee_fraction_provided, 'fraction')
            args.fee_provided = round(D(fee_fraction_provided) * D(give_quantity) * D(config.UNIT))
            print('Fee provided: {} {}'.format(util.value_out(args.fee_provided, config.BTC), config.BTC))
        elif args.get_asset == config.BTC:
            args.fee_provided = 0
            fee_fraction_required = util.value_in(args.fee_fraction_required, 'fraction')
            args.fee_required = round(D(fee_fraction_required) * D(get_quantity) * D(config.UNIT))
            print('Fee required: {} {}'.format(util.value_out(args.fee_required, config.BTC), config.BTC))
        else:
            args.fee_required = 0
            args.fee_provided = 0

        args.give_quantity = util.value_in(give_quantity, args.give_asset)
        args.get_quantity = util.value_in(get_quantity, args.get_asset)

    # issuance
    if action == 'issuance':
        args.quantity = util.value_in(args.quantity, None, divisible=args.divisible)

    # broadcast
    if action == 'broadcast':
        args.value = util.value_in(args.value, 'value')
        args.fee_fraction = util.value_in(args.fee_fraction, 'fraction')

    # bet
    if action == 'bet':
        args.deadline = calendar.timegm(dateutil.parser.parse(args.deadline).utctimetuple())
        args.wager = util.value_in(args.wager, config.XCP)
        args.counterwager = util.value_in(args.counterwager, config.XCP)
        args.target_value = util.value_in(args.target_value, 'value')
        args.leverage = util.value_in(args.leverage, 'leverage')
        args.bet_type = BET_TYPE_ID[args.bet_type]

    # dividend
    if action == 'dividend':
        args.quantity_per_unit = util.value_in(args.quantity_per_unit, config.XCP)

    # burn
    if action == 'burn':
        args.quantity = util.value_in(args.quantity, config.BTC)

    # execute
    if action == 'execute':
        args.value = util.value_in(args.value, 'XCP')
        args.startgas = util.value_in(args.startgas, 'XCP')

    # destroy
    if action == 'destroy':
        args.quantity = util.value_in(args.quantity, args.asset, 'input')

    # RPS
    if action == 'rps':
        def generate_move_random_hash(move):
            move = int(move).to_bytes(2, byteorder='big')
            random_bin = os.urandom(16)
            move_random_hash_bin = dhash(random_bin + move)
            return binascii.hexlify(random_bin).decode('utf8'), binascii.hexlify(move_random_hash_bin).decode('utf8')

        args.wager = util.value_in(args.wager, 'XCP')
        random, move_random_hash = generate_move_random_hash(args.move)
        setattr(args, 'move_random_hash', move_random_hash)
        print('random: {}'.format(random))
        print('move_random_hash: {}'.format(move_random_hash))

    return args