Exemplo n.º 1
0
    def transfer_token(sender: User,
                       recipient: User,
                       amount: float,
                       reason_id: Optional[int] = None,
                       transfer_subtype: Optional[TransferSubTypeEnum]=TransferSubTypeEnum.STANDARD):

        sent_token = default_token(sender)
        received_token = default_token(recipient)

        transfer_use = None
        if reason_id is not None:
            transfer_use = str(int(reason_id))
        transfer = make_payment_transfer(amount, token=sent_token, send_user=sender, receive_user=recipient,
                                         transfer_use=transfer_use, is_ghost_transfer=True,
                                         require_sender_approved=False, require_recipient_approved=False,
                                         transfer_subtype=transfer_subtype, transfer_mode=TransferModeEnum.USSD)
        exchanged_amount = None

        if sent_token.id != received_token.id:
            exchange = Exchange()
            exchange.exchange_from_amount(user=recipient, from_token=sent_token, to_token=received_token,
                                          from_amount=amount, prior_task_uuids=[transfer.blockchain_task_uuid],
                                          transfer_mode=TransferModeEnum.USSD)
            exchanged_amount = exchange.to_transfer.transfer_amount

        return exchanged_amount
Exemplo n.º 2
0
def make_exchange(user, from_token, to_token, from_amount):
    exchange = Exchange()

    exchange.exchange_from_amount(
        user=user,
        from_token=from_token,
        to_token=to_token,
        from_amount=from_amount
    )

    db.session.add(exchange)
    db.session.commit()
    def post(self, exchange_id):
        """
        Exchange Entry Point Method
        Method: POST

        :param from_token_id: the ID of the token being exchanged from
        :param to_token_id: the ID of the token being exchanged to
        :param from_amount: the amount of the token being exchanged from

        :return: status of exchange, and serialised exchange object if successful
        """

        post_data = request.get_json()

        user = g.user

        from_token_id = post_data.get('from_token_id')
        to_token_id = post_data.get('to_token_id')

        from_amount = post_data.get('from_amount')
        to_desired_amount = post_data.get('to_desired_amount')

        from_token = Token.query.get(from_token_id)
        to_token = Token.query.get(to_token_id)

        if not from_token:
            response_object = {
                'message': f'From token not found for ID {from_token_id}',
            }
            return make_response(jsonify(response_object)), 400

        if not to_token:
            response_object = {
                'message': f'To token not found for ID {to_token_id}',
            }
            return make_response(jsonify(response_object)), 400

        if from_amount and to_desired_amount:
            response_object = {
                'message': 'Must not specify both from amount and to amount',
            }
            return make_response(jsonify(response_object)), 400
        elif from_amount:
            try:
                exchange = Exchange()

                exchange.exchange_from_amount(
                    user=user,
                    from_token=from_token,
                    to_token=to_token,
                    from_amount=from_amount
                )

            except Exception as e:

                db.session.commit()

                response_object = {
                    'message': str(e),
                }
                return make_response(jsonify(response_object)), 400

        elif to_desired_amount:

            try:
                exchange = Exchange()

                exchange.exchange_to_desired_amount(
                    user=user,
                    from_token=from_token,
                    to_token=to_token,
                    to_desired_amount=to_desired_amount
                )
            except Exception as e:

                db.session.commit()

                response_object = {
                    'message': str(e),
                }
                return make_response(jsonify(response_object)), 400

        else:

            response_object = {
                'message': 'Must specify either from amount or to amount',
            }
            return make_response(jsonify(response_object)), 400

        response_object = {
            'message': 'Exchange Successful',
            'data': {
                'exchange': me_exchange_schema.dump(exchange).data
            }
        }

        return make_response(jsonify(response_object)), 200