def METHOD_NAME (db, source, asset_dest_quant_list, memo, memo_is_hex):
    cursor = db.cursor()
    out_balances = util.accumulate([(t[0], t[2]) for t in asset_dest_quant_list])
    for (asset, quantity) in out_balances:
        if util.enabled('mpma_subasset_support'):
            # resolve subassets
            asset = util.resolve_subasset_longname(db, asset)
        if not isinstance(quantity, int):
            raise exceptions.ComposeError('quantities must be an int (in satoshis) for {}'.format(asset))
        balances = list(cursor.execute('''SELECT * FROM balances WHERE (address = ? AND asset = ?)''', (source, asset)))
        if not balances or balances[0]['quantity'] < quantity:
            raise exceptions.ComposeError('insufficient funds for {}'.format(asset))
    block_index = util.CURRENT_BLOCK_INDEX
    cursor.close()
    problems = validate(db, source, asset_dest_quant_list, block_index)
    if problems: raise exceptions.ComposeError(problems)
    data = message_type.pack(ID)
    data += _encode_mpmaSend(db, asset_dest_quant_list, block_index, memo=memo, memo_is_hex=memo_is_hex)
    return (source, [], data)